转载: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; }