转载:http://blog.csdn.net/calamity_coming/article/details/40986557
#include<cstdio>
#include<cstring>
#include<iostream>
#include<ctime>
#include<string>
using namespace std;
#include<windows.h>
#include<conio.h>
#define mem(a,b) memset(a,b,sizeof(a))
const int sudu=40;
const int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
const string fk="■";//方块
const string bian="▉";
const string di="▉";
bool map[100][100];
void gotoxy(int x,int y)
{
COORD loc;
loc.X = y;
loc.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);
}//坐标定位函数
void HideCursor()//隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info= {1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void fanfk();
void chushifk();
void yzxz1();
void yzxz2();
void yzxz4();
struct zuobiao
{
int x,y;
} xz[7][4],xzz[7][4],nxz4[4][4],nxz1[4][4],nxz2[4][4]; //表示坐标形状表示的是7种方块的样式和翻转后的形状
class fangkuai
{
zuobiao a[4];//每种形状有4的方块
int xing;//表示方块的形状
int he;//表示是翻转还是竖着就是目前的翻转情况
int px,py;//表示运动了多少
public:
fangkuai()
{
srand(time(NULL));
he=0,px=0,py=0;
xing=rand()%7;//随机一种形状
for(int i=0; i<4; i++)
{
a[i].x=xz[xing][i].x;
a[i].y=xz[xing][i].y;
}
}
void print()
{
for(int i=0; i<4; i++) //将这4个点画出来
{
gotoxy(a[i].x+px,a[i].y+py);
cout<<fk;
}
}
void qing()//清除
{
for(int i=0; i<4; i++)
{
gotoxy(a[i].x+px,a[i].y+py);
printf(" ");
}
}
void zuoy()//左移
{
bool qw=true;
for(int i=0;i<4;i++)
{
if(map[a[i].x+px][a[i].y+py-2]||a[i].y+py-2<2)
{
qw=false;
break;
}
}
if(qw)
{
qing();
py-=2;
print();
}
}
void youy()//右移
{
bool qw=true;
for(int i=0;i<4;i++)//判断将要移动的位置是否可走
{
if(map[a[i].x+px][a[i].y+py-+2]||a[i].y+py+2>32)
{
qw=false;
break;
}
}
if(qw)
{
qing();
py+=2;
print();
}
}
bool xiay()//下移
{
if(!map[a[1].x+1+px][a[1].y+py]&&!map[a[2].x+1+px][a[2].y+py]&&!map[a[3].x+1+px][a[3].y+py]&&a[1].x+1+px<=20)
{
qing();
px++;
print();
return true;
}//能走的时候
else
{
for(int i=0; i<4; i++)
{
map[a[i].x+px][a[i].y+py]=true;
}
return false;
}//不能走就标记到地图
}
void fanz()//翻转
{
qing();
if(xing!=4&&xing!=1&&xing!=2)//只存在两种变形的方块
{
if(!he)
{
he=1;
bool qw=true;
for(int i=0;i<4;i++)//判断变形后的位置是否可以容纳下
{
if(map[xzz[xing][i].x+px][xzz[xing][i].y+py]||xzz[xing][i].y+py>32||xzz[xing][i].y+py<2)
{
qw=false;
break;
}
}
if(qw)
for(int i=0;i<4;i++)
{
a[i].x=xzz[xing][i].x;
a[i].y=xzz[xing][i].y;
}
print();
return ;
}
else
{
he=0;
bool qw=true;
for(int i=0;i<4;i++)//同理
{
if(map[xz[xing][i].x+px][xz[xing][i].y+py]||xz[xing][i].y+py<2||xz[xing][i].y+py>32)
{
qw=false;
break;
}
}
if(qw)
for(int i=0;i<4;i++)
{
a[i].x=xz[xing][i].x;
a[i].y=xz[xing][i].y;
}
print();
return ;
}
}
else if(xing==4)//下面的是四种方块变形的方法
{
he=(he+1)%4;
bool qw=true;
for(int i=0;i<4;i++)//同理判断
{
if(map[nxz4[xing][i].x+px][nxz4[xing][i].y+py]||nxz4[xing][i].y+py>32||nxz4[xing][i].y+py<2)
{
qw=false;
break;
}
}
if(qw)
for(int i=0;i<4;i++)
{
a[i].x=nxz4[he][i].x;
a[i].y=nxz4[he][i].y;
}
print();
}
else if(xing==1)
{
he=(he+1)%4;
bool qw=true;
for(int i=0;i<4;i++)//同理
{
if(map[nxz1[xing][i].x+px][nxz1[xing][i].y+py]||nxz1[xing][i].y+py<2||nxz1[xing][i].y+py>32)
{
qw=false;
break;
}
}
if(qw)
for(int i=0;i<4;i++)
{
a[i].x=nxz1[he][i].x;
a[i].y=nxz1[he][i].y;
}
print();
}
else
{
he=(he+1)%4;
bool qw=true;
for(int i=0;i<4;i++)//同理
{
if(map[nxz2[xing][i].x+px][nxz2[xing][i].y+py]||nxz2[xing][i].y+py>32||nxz2[xing][i].y+py<2)
{
qw=false;
break;
}
}
if(qw)
for(int i=0;i<4;i++)
{
a[i].x=nxz2[he][i].x;
a[i].y=nxz2[he][i].y;
}
print();
}
}
bool over()//判断游戏失败
{
bool q=false;
for(int i=0;i<4;i++)
{
if(map[a[i].x][a[i].y])
{
q=true;
break;
}
}
return q;
}
void printwai()//下一个方块的位置
{
for(int i=0; i<4; i++)
{
gotoxy(a[i].x+2,a[i].y+30);
cout<<fk;
}
}
void qingwai()//清除
{
for(int i=0; i<4; i++)
{
gotoxy(a[i].x+2,a[i].y+30);
cout<<" ";
}
}
};
void blmap()//遍历地图
{
for(int i=1;i<=20;i++)//清屏
for(int j=2;j<=32;j+=2)
{
gotoxy(i,j);
printf(" ");
}
for(int i=20; i>=1;)//消除
{
bool q=true;
for(int j=2; j<=32; j+=2)
if(!map[i][j])
{
q=false;
break;
}
if(q)
for(int j=i; j>=1; j--)
for(int k=2; k<=32; k+=2)
map[j][k]=map[j-1][k];
else
i--;
}
for(int i=1; i<=20; i++)//输出地图
for(int j=2; j<=32; j+=2)
if(map[i][j])
{
gotoxy(i,j);
cout<<fk;
}
}
void huab()//辅助信息
{
for(int i=0;i<=34;i+=2)
{
gotoxy(0,i);
cout<<di;
gotoxy(21,i);
cout<<di;
}
for(int i=0;i<=20;i++)
{
gotoxy(i,0);
cout<<bian;
gotoxy(i,34);
cout<<bian;
}
gotoxy(8,45);
puts("用上下左右移动");
}
int main()
{
huab();
chushifk();
fanfk();
yzxz4();
yzxz1();
yzxz2();//调用他们的初始化
HideCursor();
mem(map,false);
fangkuai a,b;
b.printwai();
a.print();
while(!a.over())
{
while(_kbhit())
{
char q=getch();
if(q==-32)
{
q=getch();
if(q==75)
a.zuoy();
else if(q==72)
a.fanz();
else if(q==77)
a.youy();
else if(q==80)
{
while(a.xiay());
a=b;
b.qingwai();
fangkuai c;
b=c;
b.printwai();
if(a.over())
break;
blmap();
}
}
}
while(!_kbhit())
{
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
a.qing();
if(a.xiay())
{
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
if(_kbhit())
break;
Sleep(sudu);
}
else
{
a=b;
b.qingwai();
fangkuai c;
b=c;
b.printwai();
if(a.over())
break;
blmap();
}
}
}
system("cls");
gotoxy(10,20);
puts("GAME OWER");
}
void chushifk()//七种方块的初始坐标
{
xz[0][0].x=1;xz[0][0].y=16;xz[0][1].x=4;xz[0][1].y=16;xz[0][2].x=3;xz[0][2].y=16;xz[0][3].x=2;xz[0][3].y=16;
xz[1][0].x=1;xz[1][0].y=16;xz[1][1].x=3;xz[1][1].y=16;xz[1][2].x=2;xz[1][2].y=16;xz[1][3].x=3;xz[1][3].y=18;
xz[2][0].x=1;xz[2][0].y=16;xz[2][1].x=3;xz[2][1].y=16;xz[2][2].x=3;xz[2][2].y=14;xz[2][3].x=2;xz[2][3].y=16;
xz[3][0].x=1;xz[3][0].y=16;xz[3][1].x=2;xz[3][1].y=14;xz[3][2].x=1;xz[3][2].y=14;xz[3][3].x=2;xz[3][3].y=16;
xz[4][0].x=1;xz[4][0].y=16;xz[4][1].x=2;xz[4][1].y=16;xz[4][2].x=2;xz[4][2].y=14;xz[4][3].x=2;xz[4][3].y=18;
xz[5][0].x=1;xz[5][0].y=16;xz[5][1].x=3;xz[5][1].y=14;xz[5][2].x=2;xz[5][2].y=14;xz[5][3].x=2;xz[5][3].y=16;
xz[6][0].x=1;xz[6][0].y=16;xz[6][1].x=3;xz[6][1].y=18;xz[6][2].x=2;xz[6][2].y=16;xz[6][3].x=2;xz[6][3].y=18;
}
void fanfk()//翻转后的方块两种变形的方块
{
xzz[0][0].x=1;xzz[0][0].y=16;xzz[0][1].x=1;xzz[0][1].y=18;xzz[0][2].x=1;xzz[0][2].y=14;xzz[0][3].x=1;xzz[0][3].y=20;
xzz[1][0].x=1;xzz[1][0].y=18;xzz[1][1].x=2;xzz[1][1].y=16;xzz[1][2].x=2;xzz[1][2].y=14;xzz[1][3].x=2;xzz[1][3].y=18;
xzz[2][0].x=1;xzz[2][0].y=14;xzz[2][1].x=2;xzz[2][1].y=16;xzz[2][2].x=2;xzz[2][2].y=14;xzz[2][3].x=2;xzz[2][3].y=18;
xzz[3][0].x=1;xzz[3][0].y=16;xzz[3][1].x=2;xzz[3][1].y=14;xzz[3][2].x=1;xzz[3][2].y=14;xzz[3][3].x=2;xzz[3][3].y=16;
xzz[4][0].x=1;xzz[4][0].y=16;xzz[4][1].x=2;xzz[4][1].y=16;xzz[4][2].x=2;xzz[4][2].y=14;xzz[4][3].x=2;xzz[4][3].y=18;
xzz[5][0].x=1;xzz[5][0].y=16;xzz[5][1].x=2;xzz[5][1].y=16;xzz[5][2].x=1;xzz[5][2].y=14;xzz[5][3].x=2;xzz[5][3].y=18;
xzz[6][0].x=1;xzz[6][0].y=16;xzz[6][1].x=2;xzz[6][1].y=16;xzz[6][2].x=2;xzz[6][2].y=14;xzz[6][3].x=1;xzz[6][3].y=18;
}
void yzxz1()//1号方块有4种变形
{
nxz1[0][0].x=1;nxz1[0][0].y=16;nxz1[0][1].x=3;nxz1[0][1].y=16;nxz1[0][2].x=2;nxz1[0][2].y=16;nxz1[0][3].x=3;nxz1[0][3].y=18;
nxz1[1][0].x=1;nxz1[1][0].y=18;nxz1[1][1].x=2;nxz1[1][1].y=16;nxz1[1][2].x=2;nxz1[1][2].y=14;nxz1[1][3].x=2;nxz1[1][3].y=18;
nxz1[2][0].x=1;nxz1[2][0].y=16;nxz1[2][1].x=3;nxz1[2][1].y=16;nxz1[2][2].x=1;nxz1[2][2].y=14;nxz1[2][3].x=2;nxz1[2][3].y=16;
nxz1[3][0].x=1;nxz1[3][0].y=16;nxz1[3][1].x=2;nxz1[3][1].y=14;nxz1[3][2].x=1;nxz1[3][2].y=14;nxz1[3][3].x=1;nxz1[3][3].y=18;
}
void yzxz2()//2号
{
nxz2[0][0].x=1;nxz2[0][0].y=16;nxz2[0][1].x=3;nxz2[0][1].y=16;nxz2[0][2].x=3;nxz2[0][2].y=14;nxz2[0][3].x=2;nxz2[0][3].y=16;
nxz2[1][0].x=1;nxz2[1][0].y=16;nxz2[1][1].x=2;nxz2[1][1].y=18;nxz2[1][2].x=1;nxz2[1][2].y=14;nxz2[1][3].x=1;nxz2[1][3].y=18;
nxz2[2][0].x=1;nxz2[2][0].y=16;nxz2[2][1].x=3;nxz2[2][1].y=16;nxz2[2][2].x=2;nxz2[2][2].y=16;nxz2[2][3].x=1;nxz2[2][3].y=18;
nxz2[3][0].x=1;nxz2[3][0].y=14;nxz2[3][1].x=2;nxz2[3][1].y=16;nxz2[3][2].x=2;nxz2[3][2].y=14;nxz2[3][3].x=2;nxz2[3][3].y=18;
}
void yzxz4()//4号
{
nxz4[0][0].x=1;nxz4[0][0].y=16;nxz4[0][1].x=2;nxz4[0][1].y=16;nxz4[0][2].x=2;nxz4[0][2].y=14;nxz4[0][3].x=2;nxz4[0][3].y=18;
nxz4[1][0].x=1;nxz4[1][0].y=16;nxz4[1][1].x=3;nxz4[1][1].y=16;nxz4[1][2].x=2;nxz4[1][2].y=14;nxz4[1][3].x=2;nxz4[1][3].y=16;
nxz4[2][0].x=1;nxz4[2][0].y=16;nxz4[2][1].x=2;nxz4[2][1].y=16;nxz4[2][2].x=1;nxz4[2][2].y=14;nxz4[2][3].x=1;nxz4[2][3].y=18;
nxz4[3][0].x=1;nxz4[3][0].y=16;nxz4[3][1].x=3;nxz4[3][1].y=16;nxz4[3][2].x=2;nxz4[3][2].y=16;nxz4[3][3].x=2;nxz4[3][3].y=18;
}