From 81d8da0747762029bae1f3460e77984000344f0a Mon Sep 17 00:00:00 2001 From: iridiumR Date: Mon, 6 Jun 2022 19:05:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(MCU=E8=AF=BE=E8=AE=BE):=20=E6=96=B9?= =?UTF-8?q?=E5=9D=97=EF=BC=9A=E4=BC=98=E5=8C=96=E5=BE=97=E5=88=86=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=B8=B8=E6=88=8F=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MCU/MCU_REAL _FINAL/block.c | 75 ++++++++++++++------ MCU/MCU_REAL _FINAL/block.h | 2 +- MCU/MCU_REAL _FINAL/button.h | 1 + MCU/MCU_REAL _FINAL/draw.c | 133 ++++++++++++++++++++++++++++++++++- MCU/MCU_REAL _FINAL/draw.h | 4 +- MCU/MCU_REAL _FINAL/img.h | 34 +++++++-- MCU/MCU_REAL _FINAL/menu.c | 38 +++++++--- 7 files changed, 247 insertions(+), 40 deletions(-) diff --git a/MCU/MCU_REAL _FINAL/block.c b/MCU/MCU_REAL _FINAL/block.c index 7f3523e..cf7a3e8 100644 --- a/MCU/MCU_REAL _FINAL/block.c +++ b/MCU/MCU_REAL _FINAL/block.c @@ -6,16 +6,17 @@ char base[MAX_X][MAX_Y] = {0}; //x*y //0为空 1为下落完成 2为正在下落 extern unsigned char score; extern enum OPR opr; - +enum GS blockGameStatus = __idle; void blockInit() { - + blockGameStatus = start; } void blockDestroy() { memset(base, 0, sizeof(base)); + blockGameStatus = over; } void genPiece() @@ -23,9 +24,12 @@ void genPiece() char i, j; //需要一点随机性 - int random = TH0 % 9; + int random = TH0 % 10; + if(blockGameStatus == over) + return; + //若存在尚未下落完成的方块则打断 for(i = 0; i < MAX_X; i++) @@ -36,55 +40,55 @@ void genPiece() //当两个方块的情况 if(random == 0) { - base[4][8] = 2; + base[4][9] = 2; } //当两个方块的情况 if(random == 1 || random == 2) { - base[4][8] = 2; // - base[5][8] = 2; // + base[4][9] = 2; // + base[4][10] = 2; // } else if(random == 3) { - base[3][8] = 2; //// - base[4][8] = 2; + base[3][9] = 2; //// + base[4][9] = 2; } //当三个方块的情况 else if(random == 4 || random == 5) { + base[4][11] = 2; base[4][10] = 2; - base[4][8] = 2; base[4][9] = 2; } else if(random == 6) { - base[3][8] = 2; - base[4][8] = 2; - base[5][8] = 2; + base[3][9] = 2; + base[4][9] = 2; + base[5][9] = 2; } else if(random == 7) { + base[3][10] = 2; base[3][9] = 2; - base[3][8] = 2; - base[4][8] = 2; + base[4][9] = 2; } else if (random == 8) { base[4][9] = 2; - base[3][8] = 2; - base[4][8] = 2; + base[3][9] = 2; + base[4][9] = 2; } //当四个方块的情况 - else if(random == 6) + else if(random == 9) { + base[3][10] = 2; + base[4][10] = 2; base[3][9] = 2; base[4][9] = 2; - base[3][8] = 2; - base[4][8] = 2; } } @@ -100,6 +104,7 @@ unsigned char isIegal(char i, char j) void drawBlock() { char i, j; + for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) if(base[i][j] != 0) @@ -161,6 +166,8 @@ void moveLeftPiece() { char i, j; + if(blockGameStatus == over) + return; for(i = 0; i < MAX_X; i++) for(j = 0; j < MAX_Y; j++) if(base[i][j] == 2 && !isIegal(i - 1, j)) @@ -179,6 +186,8 @@ void moveRightPiece() { char i, j; + if(blockGameStatus == over) + return; for(i = MAX_X - 1; i >= 0; i--) for(j = MAX_Y - 1; j >= 0; j--) if(base[i][j] == 2 && !isIegal(i + 1, j)) @@ -194,10 +203,12 @@ void moveRightPiece() } } -//判断是否需要清除一行 +//判断是否游戏结束/分数增加 void judgeBlock() { char i, j, k, h, count; + if(blockGameStatus == over) + return; //逐行扫描 for(j = 0; j < MAX_Y; j++) { @@ -214,10 +225,34 @@ void judgeBlock() if(count == 8) { score++; + blockGameStatus = good; for(k = 0; k < MAX_X; k++) for(h = j ; h < MAX_Y - 1; h++) base[k][h] = base[k][h + 1]; } } +} + +void blockGameOver() +{ + char j,i; + if(blockGameStatus == over) + return; + for(j = 0; j < MAX_X; j++) + { + //满足此条件则游戏结束 + if(base[j][7] == 1) + { + blockGameStatus = over; + break; + } + } + //结束则填满 + if(blockGameStatus == over) + { + for(j = 0; j < MAX_Y; j++) + for(i = 0; i < MAX_X; i++) + base[i][j] = 1; + } } \ No newline at end of file diff --git a/MCU/MCU_REAL _FINAL/block.h b/MCU/MCU_REAL _FINAL/block.h index ca46b9d..9331e68 100644 --- a/MCU/MCU_REAL _FINAL/block.h +++ b/MCU/MCU_REAL _FINAL/block.h @@ -8,7 +8,6 @@ #define MAX_X 8 #define MAX_Y 12 -enum GS {start,good,over}; void blockInit(); void blockDestroy(); @@ -19,4 +18,5 @@ void drawBlock(); void moveLeftPiece(); void moveRightPiece(); void judgeBlock(); +void blockGameOver(); #endif \ No newline at end of file diff --git a/MCU/MCU_REAL _FINAL/button.h b/MCU/MCU_REAL _FINAL/button.h index f842c85..6dfaf2f 100644 --- a/MCU/MCU_REAL _FINAL/button.h +++ b/MCU/MCU_REAL _FINAL/button.h @@ -2,5 +2,6 @@ #define _BUTTON_H_ enum OPR {left,right,confirm,idle}; +enum GS {__idle,start,good,over}; #endif \ No newline at end of file diff --git a/MCU/MCU_REAL _FINAL/draw.c b/MCU/MCU_REAL _FINAL/draw.c index 9314625..5103a6d 100644 --- a/MCU/MCU_REAL _FINAL/draw.c +++ b/MCU/MCU_REAL _FINAL/draw.c @@ -397,6 +397,94 @@ void drawSUPNUM(unsigned char x, unsigned char y, unsigned char num) } } +void drawGAME(unsigned char x, unsigned char y) +{ + unsigned int j; + if(x < 0 || x > 127) + return; + else if(x < 64) + { + CSA = 1; + CSB = 0; + } + else + { + x = x - 63; + CSA = 0; + CSB = 1; + } + for(j = 0; j < 32; j++) + { + RS = 0; + RW = 0; + P1 = 0xb8 + y; + write(); + P1 = 0X40 + x + j; + write(); //页y列x+j + + RS = 1; + RW = 0; + P1 = FONT_GAME0[j]; + write(); + + RS = 0; + RW = 0; + P1 = 0xb8 + y + 1; + write(); + P1 = 0X40 + x + j; + write(); //页y+1列x+j + + RS = 1; + RW = 0; + P1 = FONT_GAME1[j]; + write(); + } +} + +void drawOVER(unsigned char x, unsigned char y) +{ + unsigned int j; + if(x < 0 || x > 127) + return; + else if(x < 64) + { + CSA = 1; + CSB = 0; + } + else + { + x = x - 63; + CSA = 0; + CSB = 1; + } + for(j = 0; j < 32; j++) + { + RS = 0; + RW = 0; + P1 = 0xb8 + y; + write(); + P1 = 0X40 + x + j; + write(); //页y列x+j + + RS = 1; + RW = 0; + P1 = FONT_OVER0[j]; + write(); + + RS = 0; + RW = 0; + P1 = 0xb8 + y + 1; + write(); + P1 = 0X40 + x + j; + write(); //页y+1列x+j + + RS = 1; + RW = 0; + P1 = FONT_OVER1[j]; + write(); + } +} + void drawGOOD(unsigned char x, unsigned char y) { unsigned int j; @@ -413,7 +501,7 @@ void drawGOOD(unsigned char x, unsigned char y) CSA = 0; CSB = 1; } - for(j = 0; j < 8; j++) + for(j = 0; j < 40; j++) { RS = 0; RW = 0; @@ -439,4 +527,47 @@ void drawGOOD(unsigned char x, unsigned char y) P1 = FONT_GOOD1[j]; write(); } +} +void drawVOID8(unsigned char x,unsigned char y,unsigned char len) +{ + unsigned int j; + if(x < 0 || x > 127) + return; + else if(x < 64) + { + CSA = 1; + CSB = 0; + } + else + { + x = x - 63; + CSA = 0; + CSB = 1; + } + for(j = 0; j < len; j++) + { + RS = 0; + RW = 0; + P1 = 0xb8 + y; + write(); + P1 = 0X40 + x + j; + write(); //页y列x+j + + RS = 1; + RW = 0; + P1 = 0x00; + write(); + + RS = 0; + RW = 0; + P1 = 0xb8 + y + 1; + write(); + P1 = 0X40 + x + j; + write(); //页y+1列x+j + + RS = 1; + RW = 0; + P1 = 0x00; + write(); + } } \ No newline at end of file diff --git a/MCU/MCU_REAL _FINAL/draw.h b/MCU/MCU_REAL _FINAL/draw.h index 26bf45d..354b04f 100644 --- a/MCU/MCU_REAL _FINAL/draw.h +++ b/MCU/MCU_REAL _FINAL/draw.h @@ -5,12 +5,14 @@ void drawNAME(); void drawNUMBER(); void drawMAINMENU(unsigned char); void drawSUPNUM(unsigned char x,unsigned char y,unsigned char num); - +void drawVOID8(unsigned char x,unsigned char y,unsigned char len); ////=================== 方块 ================== void placeIMG_BLOCK(unsigned char x,unsigned char y); void placeVOID_BLOCK(unsigned char x,unsigned char y); void drawGOOD(unsigned char x, unsigned char y); +void drawGAME(unsigned char x, unsigned char y); +void drawOVER(unsigned char x, unsigned char y); void drawBLOCKSCORE(); ////=================== 几何 ================== void drawVerticalDottedLine(char x); diff --git a/MCU/MCU_REAL _FINAL/img.h b/MCU/MCU_REAL _FINAL/img.h index 8b94412..a25541b 100644 --- a/MCU/MCU_REAL _FINAL/img.h +++ b/MCU/MCU_REAL _FINAL/img.h @@ -14,8 +14,6 @@ code unsigned char NAME_PAGE1[] ={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x01, 0xFF, 0x01, 0x06, 0x00, 0x00, 0x3F, 0x10, 0x10, 0x10, 0x3F, 0x00, 0x00 }; - - //学号 左 code unsigned char NUMBER_PAGE0[]={ @@ -112,12 +110,11 @@ code unsigned char SUPER_NUM1[]={ 0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00, }; //=================== 方块字库 ================== +//一个8*8的方块 code unsigned char IMG_BLOCK[]={ -/*-- 宽度x高度=8x8 --*/ 0x81,0x7E,0x7E,0x7E,0x7A,0x72,0x7E,0x81, }; - - +//得分 code unsigned char FONT_SCORE0[]={ 0x00,0x10,0x88,0xC4,0x33,0x00,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x80,0x00,0x00, 0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00, @@ -126,7 +123,7 @@ code unsigned char FONT_SCORE1[]={ 0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x12,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00, 0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00, }; - +//Good! code unsigned char FONT_GOOD0[]={ 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00, 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, @@ -141,4 +138,29 @@ code unsigned char FONT_GOOD1[]={ 0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, }; +//GAME OVER +code unsigned char FONT_GAME0[]={ +0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00, +0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, +0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00, +0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, +}; +code unsigned char FONT_GAME1[]={ +0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00, +0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20, +0x20,0x3F,0x01,0x3E,0x01,0x3F,0x20,0x00, +0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, +}; +code unsigned char FONT_OVER0[]={ +0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, +0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08, +0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, +0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00, +}; +code unsigned char FONT_OVER1[]={ +0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00, +0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00, +0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, +0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20, +}; #endif \ No newline at end of file diff --git a/MCU/MCU_REAL _FINAL/menu.c b/MCU/MCU_REAL _FINAL/menu.c index b7177e1..54ab776 100644 --- a/MCU/MCU_REAL _FINAL/menu.c +++ b/MCU/MCU_REAL _FINAL/menu.c @@ -7,7 +7,7 @@ #include "block.h" //便于调试的预编译命令 -#define DEBUG_MODE +//#define DEBUG_MODE #ifdef DEBUG_MODE #define M_DEBUG M_BLOCK @@ -24,8 +24,8 @@ Menu* LAST = NULL; // enum OPR opr = idle; static unsigned char local[10] = {0}; -extern unsigned char score=0; - +unsigned char score = 0; +extern enum GS blockGameStatus; //初始化显示 void m_startup(struct _menu* this) { @@ -115,14 +115,15 @@ void m_block(struct _menu* this) { opr = idle; blockDestroy(); - drawBlock(); + NOW=&M_MAINMENU; + clear(); return; } if(opr == left) { opr = idle; moveLeftPiece(); - dropPiece(); + dropPiece(); drawBlock(); return; } @@ -130,15 +131,30 @@ void m_block(struct _menu* this) { opr = idle; moveRightPiece(); - dropPiece(); + dropPiece(); drawBlock(); return; } - drawSUPNUM(110, 0, score); - genPiece(); //若有需要,生成新块 - dropPiece(); //若有需要,块下落 - judgeBlock(); //若有需要,清除一行 - drawBlock(); //绘制界面 + switch(blockGameStatus) + { + case good: + drawGOOD(70, 2); + blockGameStatus=start; + break; + case over: + drawGAME(70, 2); + drawOVER(70, 4); + break; + default: + drawVOID8(70, 2, 40); + drawVOID8(70, 4, 32); + } + drawSUPNUM(110, 0, score); //绘制分数 + blockGameOver(); //检查是否游戏结束 + genPiece(); //若有需要,生成新块 + dropPiece(); //若有需要,块下落 + judgeBlock(); //若有需要,清除一行 + drawBlock(); //绘制界面 delay(200);