C语言-控制台俄罗斯方块


/*
//
定义了一个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,没有消除满行的。没有旋转的,希望哪位大神就此程序运行了帮忙指点下。



  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值