feat(MCU课设): 方块:优化得分判定,增加游戏结束判定
This commit is contained in:
parent
2bb187635c
commit
81d8da0747
7 changed files with 247 additions and 40 deletions
|
@ -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,6 +225,7 @@ 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];
|
||||
|
@ -221,3 +233,26 @@ void judgeBlock()
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -2,5 +2,6 @@
|
|||
#define _BUTTON_H_
|
||||
|
||||
enum OPR {left,right,confirm,idle};
|
||||
enum GS {__idle,start,good,over};
|
||||
|
||||
#endif
|
|
@ -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;
|
||||
|
@ -440,3 +528,46 @@ void drawGOOD(unsigned char x, unsigned char y)
|
|||
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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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
|
|
@ -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,7 +115,8 @@ void m_block(struct _menu* this)
|
|||
{
|
||||
opr = idle;
|
||||
blockDestroy();
|
||||
drawBlock();
|
||||
NOW=&M_MAINMENU;
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
if(opr == left)
|
||||
|
@ -134,7 +135,22 @@ void m_block(struct _menu* this)
|
|||
drawBlock();
|
||||
return;
|
||||
}
|
||||
drawSUPNUM(110, 0, score);
|
||||
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(); //若有需要,清除一行
|
||||
|
|
Reference in a new issue