// tetris.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
typedef struct OBJECT
{
int irow;
int icol;
int type=-1;//类型
int irowBK;
int icolBK;
}TETRIS;
enum
{
WALL_NULL,
WALL,
};
enum TETRISTYPE
{
ZERO,//田
FIRST,//横
SECOND,//竖
FIRTH,//T
FIVE,//L
FIRTH_T,
FIVE_L,
};
TETRIS tetris;
bool b_left = true;
const int ROW=15;
const int COL=10;
int i_map[ROW][COL];
int index = 0;
int index_create = 0;
int i_speed = 2;//下降速度
int i_create_speed = 20;//方块出现速率
vector <TETRIS> ntetris;//对象数组
void initGame();
void drawGame();
void create_tertri();
void move_tetri();
void collier();
void clear_full_row();
void tertri_down();
int main()
{
initGame();
while (true)
{
system("cls");
drawGame();
create_tertri();
move_tetri();
collier();
clear_full_row();
tertri_down();
Sleep(80);
}
return 0;
}
void initGame()
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (j == COL - 1 || j == 0 || i == ROW - 1)
{
i_map[i][j] = 2;//2为墙
}
else
{
i_map[i][j] = WALL_NULL;
}
}
}
};
void drawGame()
{
for (int i = 0;i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
bool b_tetris = false;
for (int n = 0; n < ntetris.size(); n++)
{
if (i == ntetris[n].irow&&j == ntetris[n].icol)
{
b_tetris = true;
}
}
if (i_map[i][j] == WALL)
{
cout << "■";
}
else if (i_map[i][j] == 2)
{
cout << "◆";
}
else if(b_tetris)
{
cout << "□";
}
else
{
cout << " ";
}
}
cout << endl;
}
};
void create_tertri()//创建方块
{
index_create++;
if (index_create > i_create_speed&&ntetris.size()<1)
{
srand((unsigned)time(NULL));
int i_number = rand() % 5;
switch (i_number)
{
case 0://田
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
tetris.irow = i;
tetris.icol = j+5;
tetris.type = ZERO;
ntetris.push_back(tetris);
}
}
break;
case 1://竖3
for (int i = 0; i < 3; i++)
{
tetris.irow = i;//1,2,2,3
tetris.icol =3;
tetris.type =FIRST;
ntetris.push_back(tetris);
}
break;
case 2://横3
for (int i = 0; i < 3; i++)
{
tetris.irow = 0;
tetris.icol = i+3;
tetris.type = SECOND;
ntetris.push_back(tetris);
}
break;
case 3://T
for (int i = 0; i < 3; i++)
{
tetris.irow = 0;
tetris.icol = i+3;
tetris.type = FIRTH;
ntetris.push_back(tetris);
}
for (int i = 0; i < 1; i++)
{
tetris.irow = 1;
tetris.type = FIRTH;
tetris.icol = 1+3;
ntetris.push_back(tetris);
}
break;
case 4://L
for (int i = 0; i < 3; i++)
{
tetris.irow = i;
tetris.icol = 5;
tetris.type = FIVE;
ntetris.push_back(tetris);
}
for (int i = 0; i < 1; i++)
{
tetris.irow = 2;
tetris.icol = 6+i;
tetris.type = FIVE;
ntetris.push_back(tetris);
}
break;
default:
break;
}
index_create = 0;
}
};
void move_tetri()//移动方块
{
index++;
if (index > i_speed)
{
for (int i = 0; i < ntetris.size(); i++)
{
ntetris[i].irow++;
}
index = 0;
}
if (KEYDOWN(VK_UP))//变形
{
if (ntetris.size() > 0) {
switch (ntetris[0].type)
{
case FIRST://横3
for (int i = 1; i < ntetris.size(); i++)
{
ntetris[i].irow = ntetris[i - 1].irow + 1;
ntetris[i].icol = ntetris[0].icol;
ntetris[0].type = SECOND;
}
break;
case SECOND://竖3
for (int i = 1; i < ntetris.size(); i++)
{
ntetris[i].irow = ntetris[0].irow;
ntetris[i].icol = ntetris[i - 1].icol + 1;
ntetris[0].type = FIRST;
}
break;
case FIRTH://T
ntetris[ntetris.size() - 1].irow = ntetris[0].irow - 1;
ntetris[0].type = FIRTH_T;
break;
case FIVE://L
ntetris[ntetris.size() - 1].icol = ntetris[0].icol - 1;
ntetris[0].type = FIVE_L;
break;
case FIRTH_T://T
ntetris[ntetris.size() - 1].irow = ntetris[0].irow + 1;
ntetris[0].type = FIRTH;
break;
case FIVE_L://L
ntetris[ntetris.size() - 1].icol = ntetris[0].icol + 1;
ntetris[0].type = FIVE;
break;
}
}
}
else if (KEYDOWN(VK_DOWN))
{
}
else if (KEYDOWN(VK_LEFT))
{
int i_left=0;
for (int i = 0; i < ntetris.size(); i++)
{
if (ntetris[i].icol <=1)
{
i_left++;
}
if(i_map[ntetris[i].irow][ntetris[i].icol-1]==1)
{
i_left++;
}
}
for (int i = 0; i < ntetris.size(); i++)
{
if (i_left == 0)
{
ntetris[i].icol--;
}
}
}
else if(KEYDOWN(VK_RIGHT))
{
int i_right = 0;
for (int i = 0; i < ntetris.size(); i++)
{
if (ntetris[i].icol>=(COL - 2))
{
i_right++;
}
if (i_map[ntetris[i].irow][ntetris[i].icol +1] == 1)
{
i_right++;
}
}
for (int i = 0; i < ntetris.size(); i++)
{
if (i_right == 0)
{
ntetris[i].icol++;
}
}
}
}
void collier() //碰撞
{
bool b_clear = false;
for (int i = 0; i < ntetris.size(); i++)
{
if ((ntetris[ntetris.size()-1].irow+1)>=(ROW-1)|| i_map[ntetris[i].irow + 1][ntetris[i].icol] == 1)//当前
{
b_clear = true;
}
}
if (b_clear)//消除行
{
for (int i = 0; i < ntetris.size(); i++)
{
i_map[ntetris[i].irow][ntetris[i].icol]= 1;//
}
ntetris.clear();
vector<TETRIS>().swap(ntetris);
b_clear = false;
}
}
void clear_full_row()
{
for(int i=0;i<ROW;i++)
{
int icout = 0;
for (int j = 0; j < COL; j++)
{
if (i_map[i][j] == 1)
{
icout++;
if (icout == 8)
{
for (int n = 1; n < (COL-1); n++)
{
i_map[i][n] = 3;
}
}
}
}
}
}
void tertri_down()
{
for (int i = 1; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (i_map[i][j] == 1&& i_map[i + 1][j] ==3)
{
i_map[i][j] = 3;
i_map[i+1][j] = 1;
}
if (i_map[i][j]==3 &&i_map[i - 1][j]==0)
{
i_map[i][j] = 0;
}
}
}
}