feat(MCU课设): 方块移动
This commit is contained in:
parent
f926ffad48
commit
4f0e69ddab
4 changed files with 731 additions and 678 deletions
File diff suppressed because it is too large
Load diff
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
char base[MAX_X][MAX_Y] = {0}; //x*y //0为空 1为下落完成 2为正在下落
|
char base[MAX_X][MAX_Y] = {0}; //x*y //0为空 1为下落完成 2为正在下落
|
||||||
enum BLK_TP type = none;
|
enum BLK_TP type = none;
|
||||||
|
extern enum OPR opr;
|
||||||
|
|
||||||
void blockInit()
|
void blockInit()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -23,17 +25,17 @@ void genPiece()
|
||||||
{
|
{
|
||||||
|
|
||||||
char i, j;
|
char i, j;
|
||||||
//需要一点随机性
|
//需要一点随机性
|
||||||
int random = TH0 % 4;
|
int random = TH0 % 4;
|
||||||
int len = 2 + TH0 % 3;
|
int len = 2 + TH0 % 3;
|
||||||
|
|
||||||
|
|
||||||
//若存在尚未下落完成的方块则打断
|
//若存在尚未下落完成的方块则打断
|
||||||
for(i = 0; i < MAX_X; i++)
|
for(i = 0; i < MAX_X; i++)
|
||||||
for(j = 0; j < MAX_Y; j++)
|
for(j = 0; j < MAX_Y; j++)
|
||||||
if(base[i][j] == 2)
|
if(base[i][j] == 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//当两个方块的情况
|
//当两个方块的情况
|
||||||
|
@ -41,13 +43,13 @@ void genPiece()
|
||||||
{
|
{
|
||||||
if(random % 2 == 0)
|
if(random % 2 == 0)
|
||||||
{
|
{
|
||||||
base[4][7] = 2; //
|
base[4][8] = 2; //
|
||||||
base[4][8] = 2; //
|
base[4][8] = 2; //
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
base[3][7] = 2; ////
|
base[3][8] = 2; ////
|
||||||
base[4][7] = 2;
|
base[4][8] = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//当三个方块的情况
|
//当三个方块的情况
|
||||||
|
@ -55,34 +57,34 @@ void genPiece()
|
||||||
{
|
{
|
||||||
if(random == 0)
|
if(random == 0)
|
||||||
{
|
{
|
||||||
base[4][7] = 2;
|
base[4][10] = 2;
|
||||||
base[4][8] = 2;
|
base[4][8] = 2;
|
||||||
base[4][9] = 2;
|
base[4][9] = 2;
|
||||||
}
|
}
|
||||||
else if(random == 1)
|
else if(random == 1)
|
||||||
{
|
{
|
||||||
base[3][7] = 2;
|
base[3][8] = 2;
|
||||||
base[4][7] = 2;
|
base[4][8] = 2;
|
||||||
base[5][7] = 2;
|
base[5][8] = 2;
|
||||||
}
|
}
|
||||||
else if(random == 2)
|
else if(random == 2)
|
||||||
{
|
{
|
||||||
|
base[3][9] = 2;
|
||||||
base[3][8] = 2;
|
base[3][8] = 2;
|
||||||
base[3][7] = 2;
|
base[4][8] = 2;
|
||||||
base[4][7] = 2;
|
|
||||||
}
|
}
|
||||||
else if (random == 3)
|
else if (random == 3)
|
||||||
{
|
{
|
||||||
|
base[4][9] = 2;
|
||||||
|
base[3][8] = 2;
|
||||||
base[4][8] = 2;
|
base[4][8] = 2;
|
||||||
base[3][7] = 2;
|
|
||||||
base[4][7] = 2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//当四个方块的情况
|
//当四个方块的情况
|
||||||
if(len == 3)
|
if(len == 3)
|
||||||
{
|
{
|
||||||
base[3][7] = 2;
|
base[3][9] = 2;
|
||||||
base[4][7] = 2;
|
base[4][9] = 2;
|
||||||
base[3][8] = 2;
|
base[3][8] = 2;
|
||||||
base[4][8] = 2;
|
base[4][8] = 2;
|
||||||
}
|
}
|
||||||
|
@ -141,13 +143,13 @@ void dropPiece()
|
||||||
{
|
{
|
||||||
if(base[i][j] == 2)
|
if(base[i][j] == 2)
|
||||||
{
|
{
|
||||||
//无标记则下落
|
//无标记则下落
|
||||||
if(flag == 0 && isIegal(i, j - 1))
|
if(flag == 0 && isIegal(i, j - 1))
|
||||||
{
|
{
|
||||||
base[i][j - 1] = 2;
|
base[i][j - 1] = 2;
|
||||||
base[i][j] = 0;
|
base[i][j] = 0;
|
||||||
}
|
}
|
||||||
//有标记则转换
|
//有标记则转换
|
||||||
else if(flag == 1)
|
else if(flag == 1)
|
||||||
base[i][j] = 1;
|
base[i][j] = 1;
|
||||||
}
|
}
|
||||||
|
@ -157,26 +159,27 @@ void dropPiece()
|
||||||
}
|
}
|
||||||
|
|
||||||
//方块平移
|
//方块平移
|
||||||
void movePiece(enum OPR opr)
|
void moveLeftPiece()
|
||||||
{
|
{
|
||||||
|
|
||||||
char i, j;
|
char i, j;
|
||||||
for(i = 0; i < MAX_X; i++)
|
for(i = 0; i < MAX_X; i++)
|
||||||
for(j = 0; j < MAX_Y; j++)
|
for(j = 0; j < MAX_Y; j++)
|
||||||
if(base[i][j] == 2)
|
if(base[i][j] == 2 && isIegal(i - 1, j))
|
||||||
{
|
{
|
||||||
|
base[i - 1][j] = 2;
|
||||||
|
base[i][j] = 0;
|
||||||
if(opr == left && isIegal(i - 1, j))
|
|
||||||
{
|
|
||||||
base[i - 1][j] = 2;
|
|
||||||
base[i][j] = 0;
|
|
||||||
}
|
|
||||||
else if(opr == left && isIegal(i + 1, j))
|
|
||||||
{
|
|
||||||
base[i + 1][j] = 2;
|
|
||||||
base[i][j] = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void moveRightPiece()
|
||||||
|
|
||||||
|
{
|
||||||
|
char i, j;
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
base[i + 1][j] = 2;
|
||||||
|
base[i][j] = 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,10 @@
|
||||||
#ifndef _BLOCK_H_
|
#ifndef _BLOCK_H_
|
||||||
#define _BLOCK_H_
|
#define _BLOCK_H_
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
# include <string.h>
|
#include <string.h>
|
||||||
|
#include "button.h"
|
||||||
|
|
||||||
#define MAX_X 8
|
#define MAX_X 8
|
||||||
#define MAX_Y 12
|
#define MAX_Y 12
|
||||||
|
|
||||||
|
@ -22,8 +25,12 @@ struct _group
|
||||||
};
|
};
|
||||||
typedef struct _group Group;
|
typedef struct _group Group;
|
||||||
|
|
||||||
void genPiece();
|
|
||||||
void blockInit();
|
void blockInit();
|
||||||
|
void blockDestroy();
|
||||||
|
|
||||||
|
void genPiece();
|
||||||
void dropPiece();
|
void dropPiece();
|
||||||
void drawBlock();
|
void drawBlock();
|
||||||
|
void moveLeftPiece();
|
||||||
|
void moveRightPiece();
|
||||||
#endif
|
#endif
|
|
@ -108,6 +108,7 @@ void m_block(struct _menu* this)
|
||||||
LAST = &M_BLOCK;
|
LAST = &M_BLOCK;
|
||||||
blockInit();
|
blockInit();
|
||||||
}
|
}
|
||||||
|
//ÖØÖÃ
|
||||||
if(opr == confirm)
|
if(opr == confirm)
|
||||||
{
|
{
|
||||||
opr = idle;
|
opr = idle;
|
||||||
|
@ -115,6 +116,20 @@ void m_block(struct _menu* this)
|
||||||
drawBlock();
|
drawBlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(opr == left)
|
||||||
|
{
|
||||||
|
opr = idle;
|
||||||
|
moveLeftPiece();
|
||||||
|
drawBlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(opr == right)
|
||||||
|
{
|
||||||
|
opr = idle;
|
||||||
|
moveRightPiece();
|
||||||
|
drawBlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
genPiece();
|
genPiece();
|
||||||
dropPiece();
|
dropPiece();
|
||||||
|
|
Reference in a new issue