feat(MCU课设): 方块:优化得分判定,增加游戏结束判定

This commit is contained in:
iridiumR 2022-06-06 19:05:34 +08:00
parent 2bb187635c
commit 81d8da0747
7 changed files with 247 additions and 40 deletions

View file

@ -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;
}
}

View file

@ -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

View file

@ -2,5 +2,6 @@
#define _BUTTON_H_
enum OPR {left,right,confirm,idle};
enum GS {__idle,start,good,over};
#endif

View file

@ -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();
}
}

View file

@ -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);

View file

@ -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

View file

@ -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);