This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
justhomework/MCU/MCU_REAL _FINAL/block.c
2022-06-06 14:27:04 +08:00

185 lines
No EOL
3.2 KiB
C

#include "block.h"
#include "draw.h"
#include "button.h"
#include <reg52.h>
char base[MAX_X][MAX_Y] = {0}; //x*y //0为空 1为下落完成 2为正在下落
enum BLK_TP type = none;
extern enum OPR opr;
void blockInit()
{
base[0][0] = 1;
base[0][1] = 1;
base[0][2] = 1;
}
void blockDestroy()
{
memset(base, 0, sizeof(base));
}
void genPiece()
{
char i, j;
//需要一点随机性
int random = TH0 % 4;
int len = 2 + TH0 % 3;
//若存在尚未下落完成的方块则打断
for(i = 0; i < MAX_X; i++)
for(j = 0; j < MAX_Y; j++)
if(base[i][j] == 2)
return;
//当两个方块的情况
if(len == 2)
{
if(random % 2 == 0)
{
base[4][8] = 2; //
base[4][8] = 2; //
}
else
{
base[3][8] = 2; ////
base[4][8] = 2;
}
}
//当三个方块的情况
if(len == 3)
{
if(random == 0)
{
base[4][10] = 2;
base[4][8] = 2;
base[4][9] = 2;
}
else if(random == 1)
{
base[3][8] = 2;
base[4][8] = 2;
base[5][8] = 2;
}
else if(random == 2)
{
base[3][9] = 2;
base[3][8] = 2;
base[4][8] = 2;
}
else if (random == 3)
{
base[4][9] = 2;
base[3][8] = 2;
base[4][8] = 2;
}
}
//当四个方块的情况
if(len == 3)
{
base[3][9] = 2;
base[4][9] = 2;
base[3][8] = 2;
base[4][8] = 2;
}
}
//动作是否在屏幕内
unsigned char isIegal(char i, char j)
{
if(i >= 0 && i < MAX_X && j >= 0 && j < MAX_Y && base[i][j] == 0)
return 1;
return 0;
}
//方块绘制
void drawBlock()
{
char i, j;
for(i = 0; i < 8; i++)
for(j = 0; j < 8; j++)
if(base[i][j] != 0)
placeIMG_BLOCK(i, j);
else
place_VOID_BLOCK(i, j);
}
//方块下落与合并
void dropPiece()
{
char i, j, flag = 0;
//检测是否触底
for(i = 0; i < MAX_X; i++)
{
for(j = 0; j < MAX_Y; j++)
{
if(flag == 1)
break;
if(base[i][j] == 2)
{
//若触底,做标记
if(flag == 0 && (base[i][j - 1] == 1 || j == 0))
{
flag = 1;
break;
}
}
}
if(flag == 1)
break;
}
//转换嵌套
for(i = 0; i < MAX_X; i++)
{
for(j = 0; j < MAX_Y; j++)
{
if(base[i][j] == 2)
{
//无标记则下落
if(flag == 0 && isIegal(i, j - 1))
{
base[i][j - 1] = 2;
base[i][j] = 0;
}
//有标记则转换
else if(flag == 1)
base[i][j] = 1;
}
}
}
}
//方块平移
void moveLeftPiece()
{
char i, j;
for(i = 0; i < MAX_X; i++)
for(j = 0; j < MAX_Y; j++)
if(base[i][j] == 2 && 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;
}
}