#include "Tetris.h"
//*****************************************************************************************
//底板 底板设置 ,底板检查,底板满行消除
//*****************************************************************************************
// 底板定义
struct BOARD Table_board[Horizontal_boxs][Vertical_boxs];
//*****************************************************************************************
// 函数
//获取底板
void initboard() {
for (int i = 0; i <= Horizontal_boxs; i++) {
for (int j = 0; j <= Vertical_boxs; j++) {
Table_board[i][j].var = 0;
Table_board[i][j].color = LIGHTGRAY;
}
}
}
BOARD GetBoard(int i, int j)
{
return Table_board[i][j];
}
//获取位置x,y开始的底板位置的顶部情况
//x表示位于行,y表示方块位于的最低位置列
int GetBoradTop(int x, int y) {
int top = 16;
for (int i = y; i< Vertical_boxs; i++)
{
if (x > Horizontal_boxs)
{
top = 16;
break;
}
if (Table_board[x][i].var)
{
top = i + 1;
break;
}
}
return top;
}
//获取位置x,y开始的底板位置的底部情况
int GetBoradButtom(int x, int y) {
int buttom = 0;
for (int i = y; i >= 0; i--)
{
if (Table_board[x][i].var)
{
buttom = i + 1;
break;
}
}
return buttom;
}
//获取位置x,y开始的底板位置的左边情况
int GetBoradLeft(int x, int y) {
int l = 11;
for (int i = x; i < Horizontal_boxs; i++)
{
if (Table_board[i][y].var)
{
l = i + 1;
break;
}
}
return l;
}
//获取位置x,y开始的底板位置顶部情况
int GetBoradRight(int x, int y) {
int r = 0;
for (int i = x; i >= 0; i--)
{
if (Table_board[i][y].var)
{
r = i + 1;
break;
}
}
return r;
}
//设置底板数据
void SetBoardForShape(struct SHAPE s, int x, int y)
{
int i, j;
for (i = 0; i < 2; i++)
{
int mark = 128;
for (j = 0; j < 8; j++)
{
if (s.box[i] & mark)
{
if (((x + j % 4) < Horizontal_boxs) &((y + (i * 2) + j / 4)< Vertical_boxs))
{
Table_board[x+j % 4][y+ (i*2) + j / 4].var = 1;
Table_board[x + j % 4][y + (i * 2) + j / 4].color = s.color;
}
}
mark = mark / 2;
}
}
}
//查找满行
//y表示行号
bool IsFullBoardRow(int y) {
bool full;
full = true;
for (int i = 0; i<Horizontal_boxs; i++)
{
if (!Table_board[i][y].var)
{
full = false;
break;
}
else {
full = full & true;
}
}
return full;
}
//删除满行
//y表示行号
void DelFullRow(int y)
{
register int i, j, total;
for (i = y; i > 0; i--)
{
total = 0;
for (j = 0; j < Horizontal_boxs; j++)
{
Table_board[j][i].var = 0;
Table_board[j][i].color = LIGHTGRAY;
if (!Table_board[j][i-1].var)
{
total++;
}
else
{
Table_board[j][i].var = Table_board[j ][i- 1].var;
Table_board[j][i].color = Table_board[j ][i- 1].color;
}
}
if (total == Horizontal_boxs)
{
break;
}
}
}
//查询并删除满行
//y表示方块的位置
int ClrFullBoard(int y)
{
int k=0;
int i, j;
for (i = y; i < y + 4; i++)
{
if (i < 15) {
if (IsFullBoardRow(i)) {
DelFullRow(i);
k++;
}
}
}
return k;
}
//查询是否填满
bool IsFullBoard()
{
if (Table_board[3][0].var || Table_board[4][0].var)
{
return true;
}
else
{
return false;
}
}
//判断是否能下降
bool CanMoveDown(struct SHAPE s, int x, int y)
{
bool can; //定义返回值
can = true;
int buttom[4];
GetCubeButtom(s,buttom);
for (int i = 0; i<4; i++)
{
if ((buttom[i] + y) >= (GetBoradTop(x + i, buttom[i] + y) - 1))
{
if (buttom[i] > 0 && buttom[i] < 5)
{
can = can & false;
}
}
}
return can;
}
//判断是否能右移动
bool CanMoveRight(struct SHAPE s, int x, int y)
{
bool can; //定义返回值
can = true;
int right[4];
GetCubeRight(s, right);
for (int i = 0; i<4; i++)
{
if ((right[i] + x) >= (GetBoradLeft(x + right[i], i + y) - 1))
{
if (right[i] > 0 && right[i] < 5)
{
can = can & false;
}
}
}
return can;
}
//判断是否能左移动
bool CanMoveLeft(struct SHAPE s, int x, int y)
{
bool can; //定义返回值
can = true;
int left[4];
GetCubeLeft(s,left);
for (int i = 0; i<4; i++)
{
if ((left[i] + x -1 ) <= (GetBoradRight(x + left[i], i + y)))
{
if (left[i] > 0 && left[i] < 5)
{
can = can & false;
}
}
}
return can;
}
//判断是否可以改变形态
bool CanChange(struct SHAPE s, int x, int y)
{
bool can;
can = true;
struct SHAPE next = GetShape(s.next);
int buttom[4];
GetCubeButtom(next,buttom);
int left[4];
GetCubeLeft(next,left);
int right[4];
GetCubeRight(next,right);
for (int i = 0; i<4; i++)
{
if ((buttom[i] + y) >(GetBoradTop(x + i, buttom[i] + y) - 1))
{
if (buttom[i] > 0 && buttom[i] < 5) {
can = can & false;
}
}
if ((right[i] + x) > (GetBoradLeft(x + right[i], i + y) - 1))
{
if (right[i] > 0 && right[i] < 5) {
can = can & false;
}
}
if ((left[i] + x) < (GetBoradRight(x + right[i], i + y) - 1))
{
if (left[i] > 0 && left[i] < 5) {
can = can & false;
}
}
}
return can;
}
//*****************************************************************************************
评论0
最新资源