/*
//
定义了一个RandBlock[4][4]用来存方块
BlockGroup[][]用来绘制界面
//
*/
#include <conio.h>
#include<iostream>
#include<time.h>
#include<windows.h>
#include <stdlib.h>
using namespace std;
#define Level 100//初始难度;
#define Score 0//初始分数;
const int WallWide_x = 20;//墙的宽度
const int WallLength_y = 28;//墙的长度
int TempGroup[4][4];//用于旋转时存放方块
int BlockGroup[WallWide_x][WallLength_y];//定义一个数组用来显示界面,及初始化背景
int RandBlock[2][4];//定义一个数组用来存方块
int main()
{
void ShowFirstWindow();
void CreateBlock(int RandBlock[2][4]);//创建随机方块
void GotoXY(int, int);//设置光标位置
void PutBlockToBack();//把方块放到背景里面去
void BlockMoveDown();
void ShowGame();
//控制方块移动
void BlockMoveLeft();
void BlockMoveRight();
void BlockRotate();
void BlockMoveDownFast();
//
srand((unsigned(time(NULL))));//以时间作为种子产生随机数
for (int i = 0; i < WallLength_y; i++)//y坐标
{
BlockGroup[0][i] = 1;//初始化最左边的墙
for (int j = 1; j < WallWide_x; j++)//x坐标
{
if (i == 0)//初始化最上面的墙
{
BlockGroup[j][0] = 1;
}
else
{
if (i == WallLength_y - 1)//初始化最下面的墙
{
BlockGroup[j][WallLength_y - 1] = 1;
}
else
BlockGroup[j][i] = 0;
}
}
BlockGroup[WallWide_x - 1][i] = 1;//初始化最右边的墙
}
CreateBlock(RandBlock);//先产生方块
PutBlockToBack();//把方块放到背景里面去
ShowFirstWindow();//显示游戏开始界面;
GotoXY(1, 1);
while(1!=BlockGroup[9][3])//第2行值为1代表方块堆满了,游戏结束
{
BlockMoveDown();//方块下落
ShowGame();//判断方块能否下落,以及处理方块叠加
while(_kbhit())
{
char a = _getch();
switch(a)
{
case 'a':BlockMoveLeft();break;
case 'd':BlockMoveRight();break;
case 'w':BlockRotate();break;
}
}
GotoXY(1, 1);
Sleep(Level);
}
GotoXY(10, 10);//显示游戏结束
cout<<"GAME OVER!"<<endl;
GotoXY(1, 29);
return 0;
}
///
///设置光标位置
///
void GotoXY(int x, int y)
{
COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
//产生随机方块
void CreateBlock(int RandBlock[2][4])
{
int BlockType = rand() % 5;
switch (BlockType)
{
case 0:
{
RandBlock[0][0] = 0, RandBlock[0][1] = 2, RandBlock[0][2] = 2, RandBlock[0][3] = 0;
RandBlock[1][0] = 2, RandBlock[1][1] = 2, RandBlock[1][2] = 0, RandBlock[1][3] = 0;
break;
}
case 1:
{
RandBlock[0][0] = 0, RandBlock[0][1] = 2, RandBlock[0][2] = 2, RandBlock[0][3] = 0;
RandBlock[1][0] = 0, RandBlock[1][1] = 2, RandBlock[1][2] = 2, RandBlock[1][3] = 0;
break;
}
case 2:
{
RandBlock[0][0] = 0, RandBlock[0][1] = 2, RandBlock[0][2] = 0, RandBlock[0][3] = 0;
RandBlock[1][0] = 2, RandBlock[1][1] = 2, RandBlock[1][2] = 2, RandBlock[1][3] = 0;
break;
}
case 3:
{
RandBlock[0][0] = 2, RandBlock[0][1] = 0, RandBlock[0][2] = 0, RandBlock[0][3] = 0;
RandBlock[1][0] = 2, RandBlock[1][1] = 2, RandBlock[1][2] = 2, RandBlock[1][3] = 0;
break;
}
case 4:
{
RandBlock[0][0] = 2, RandBlock[0][1] = 2, RandBlock[0][2] = 2, RandBlock[0][3] = 2;
RandBlock[1][0] = 0, RandBlock[1][1] = 0, RandBlock[1][2] = 0, RandBlock[1][3] = 0;
break;
}
}
}
//把产生随机方块数组中的方块放到背景中去
void PutBlockToBack()
{
for(int i = 0; i<2; i++)
for(int j = 0; j<4; j++)
{
BlockGroup[j+8][i+1] = RandBlock[i][j];
}
}
//方块向下移动
void BlockMoveDown()
{
for(int i = WallLength_y-1; i>0; i--)
for(int j = 0; j<WallWide_x; j++)
if(2==BlockGroup[j][i])
{
BlockGroup[j][i+1] = BlockGroup[j][i];
BlockGroup[j][i] = 0;
}
}
//进入游戏显示游戏界面
void ShowFirstWindow()
{
GotoXY(24, 6);
cout<<"俄罗斯方块";
GotoXY(24, 8);
cout<<"版本1.0";
GotoXY(24, 10);
cout<<"按enter查看游戏说明!";
_getch();
system("cls");
GotoXY(24, 6);
cout<<"游戏说明";
GotoXY(24, 8);
cout<<"W:旋转方块, S:让方块直接下落, A:方块左移, D:方块右移";
GotoXY(24, 10);
cout<<"按enter进入游戏!";
_getch();
system("cls");
}
//方块左移
void BlockMoveLeft()
{
for(int j = 0; j<WallLength_y; j++)
{
for(int i = 1; i<WallWide_x; i++)
{
if(2 == BlockGroup[i][j])
{
if(1 != BlockGroup[i-1][j])
{
BlockGroup[i-1][j] = BlockGroup[i][j];
BlockGroup[i][j] = 0;
}
}
}
}
}
//方块右移
void BlockMoveRight()
{
for(int j = 0; j<WallLength_y; j++)
{
for(int i = WallWide_x-1; i>0; i--)
{
if(2 == BlockGroup[i][j])
{
if(1 != BlockGroup[i+1][j])
{
BlockGroup[i+1][j] = BlockGroup[i][j];
BlockGroup[i][j] = 0;
}
}
}
}
}
//方块旋转
void BlockRotate()
{
for(int j = 0; j<WallLength_y; j++)
{
for(int i = 0; i<WallWide_x; i++)
{
if(2 == BlockGroup[i][j])
{
for(int k = 0; k<4; k++)
{
for(int f = 0; f<4; f++)
{
TempGroup[k][f] = BlockGroup[i][j-2];
}
}
}
}
}
int TempBlockGroup[WallWide_x][WallLength_y];
for(int i = 0; i<WallLength_y; i++)
{
for(int j = 0; j<WallWide_x; j++)
{
TempBlockGroup[j][i] = BlockGroup[j][i];
}
}
for(i = 0; i<WallLength_y; i++)
{
for(int j = 0; j<WallWide_x; j++)
{
BlockGroup[i][j] = TempBlockGroup[j][i];
}
}
}
//方块快速下落
void BlockMoveDownFast()
{
}
//判断方块能否下落,以及处理方块叠加
void ShowGame()
{
for (int i = 0; i < WallLength_y; i++)
{
for(int j = 0; j<WallWide_x; j++)
{
if (BlockGroup[j][i] == 0)
cout << " ";
else
{
if (BlockGroup[j][i] == 2)
{
if(1==BlockGroup[j][i+1] || 1==BlockGroup[j+1][i+1] || 1==BlockGroup[j+2][i+1] || 1==BlockGroup[j+3][i+1])
{
{
BlockGroup[j][i]=1;
if(2 == BlockGroup[j+1][i])
BlockGroup[j+1][i]=1;
if(2 == BlockGroup[j+2][i])
BlockGroup[j+2][i]=1;
if(2 == BlockGroup[j+3][i])
BlockGroup[j+3][i]=1;
if(2==BlockGroup[j][i-1])
BlockGroup[j][i-1]=1;
if(2==BlockGroup[j+1][i-1])
BlockGroup[j+1][i-1]=1;
if(2==BlockGroup[j+2][i-1])
BlockGroup[j+2][i-1]=1;
if(2==BlockGroup[j+3][i-1])
BlockGroup[j+3][i-1]=1;
if(2==BlockGroup[j+4][i-1])
BlockGroup[j+4][i-1]=1;
if(2==BlockGroup[j+5][i-1])
BlockGroup[j+5][i-1]=1;
}
cout << "█";
CreateBlock(RandBlock);//先产生方块
PutBlockToBack();//把方块放到背景里面去
}
else
cout<<"□";
}
else
cout << "█";
}
}
cout << endl;
}
}
有诸多BUG,没有消除满行的。没有旋转的,希望哪位大神就此程序运行了帮忙指点下。