2048

来源:互联网 发布:吉利汽车销售数据 编辑:程序博客网 时间:2024/06/06 22:08

今天上午写了个2048,直接在cmd运行...

#include <cstdio>#include <cstring>#include <cstdlib>#include <conio.h>#include <windows.h> #include <ctime>#include <cassert>using namespace std;struct Game{int ht,wd;int d[10][10],empty[17];int ptline[5],ptcross[5];long long sum; inline void init(void){ht=25,wd=80,sum=0;memset(d,0,sizeof d); ptline[1]=4,ptline[2]=9,ptline[3]=14,ptline[4]=19;ptcross[1]=26,ptcross[2]=34,ptcross[3]=42,ptcross[4]=50;empty[0]=0; for (int i=1;i<=16;i++) empty[i]=1,empty[0]++;}inline int len(int i){if (!i) return 1;int cnt=0;for (;i;i/=10) cnt++;return cnt;}void print(void){system("cls");printf("\n现在的得分:%I64d\n\n",sum);int num=1,x=1,y=1;for (int i=4;i<=ht-4;i++){for (int j=1;j<wd;j++)if (x<=4&&ptline[x]==i&&ptcross[y]==j){if (!d[x][y]) printf("*"); else printf("%d",d[x][y]);num++;j+=len(d[x][y])-1;if (y==4)x++,y=1;else y++;}else printf(" ");printf("\n");}printf("________________________________________________________________________________\n");printf("操作说明:如果要终止这次游戏,请输入6\n");}inline void wait(int sec){Sleep(sec);}inline int getid(int i,int j){return (i-1)*4+j;}void make(void){int num=0,x,y,rank,found=0;srand(time(0));rank=rand()%empty[0]+1;for (int i=1;i<=4&&!found;i++)for (int j=1;j<=4&&!found;j++)if (empty[getid(i,j)]){num++;if (num==rank){x=i,y=j;found=1;}}assert(x>0&&x<5&&y>0&&y<5);d[x][y]=(rand()%4?2:4);empty[getid(x,y)]=0,empty[0]--;}int tmp[6][6],tmp2[6][6];inline void rotate_right(void){for (int i=1;i<=4;i++)for (int j=1;j<=4;j++)tmp2[i][j]=d[i][j];memset(d,0,sizeof d);for (int i=1;i<=4;i++)for (int j=1;j<=4;j++)d[5-j][i]=tmp2[i][j];}int update(int dir,int changetag){for (int i=1;i<=4;i++)for (int j=1;j<=4;j++) tmp[i][j]=d[i][j];for (int i=1;i<=dir;i++) rotate_right();int k;for (int j=1;j<=4;j++){for (int i=1;i<=4;i++)if (!d[i][j]){for (k=i+1;k<=4;k++)if (d[k][j]) break;if (k==5) break;for (int p=k;p<=4;p++)if (p^1) d[i+p-k][j]=d[p][j],d[p][j]=0;}for (int i=1;i<4;i++){if (!d[i][j]) break;if (d[i][j]==d[i+1][j]) {if (changetag) sum+=d[i][j];d[i][j]<<=1,d[i+1][j]=0,i++;}}for (int i=1;i<=4;i++)if (!d[i][j]){for (k=i+1;k<=4;k++)if (d[k][j]) break;if (k==5) break;for (int p=k;p<=4;p++)if (p^1) d[i+p-k][j]=d[p][j],d[p][j]=0;}}for (int i=1;i<=4-dir;i++) rotate_right();int changed=0;for (int i=1;i<=4;i++)for (int j=1;j<=4;j++)if (tmp[i][j]&&!d[i][j]){changed=1;if (changetag){empty[0]++;empty[getid(i,j)]=1;}}elseif (!tmp[i][j]&&d[i][j]){changed=1;if (changetag){empty[0]--;empty[getid(i,j)]=0;}}return changed; }int check_okay(void){for (int i=1;i<=4;i++)for (int j=1;j<=4;j++) tmp[i][j]=d[i][j];int can=0;for (int i=0;i<4;i++){can|=update(i,0);for (int i=1;i<=4;i++)for (int j=1;j<=4;j++)d[i][j]=tmp[i][j];if (can) return 1;}return 0;}void start(void){init(),make(),make(),print();char c; int done; for (;;){c=getch(),done=0;if (c==-32) continue;if (c=='6') return;if (c==72)done=update(0,1);elseif (c==80)done=update(2,1);elseif (c==75)done=update(3,1);else done=update(1,1);if (done){make(); print();if (!check_okay()){wait(1000);printf("游戏结束,你的得分为:%I64d\n",sum);wait(5000);return;}}else{system("cls");printf("不能向%s\n",c==72?"上":c==80?"下":c==75?"左":"右");wait(1000);print();}}}}game;struct Menu{int ht,wd;//25*80char s[30][90];int locflag,locsize;inline void init(void){ht=25,wd=80,locflag=1,locsize=3;system("@echo off");system("color fc");}inline void print(void){memset(s,0,sizeof s);strcpy(s[5],"                                    2048");if (locflag==1)strcpy(s[9],"                              →   新游戏");else strcpy(s[9],"                                   新游戏");if (locflag==2)strcpy(s[13],"                              →   游戏介绍");else strcpy(s[13],"                                   游戏介绍");if (locflag==3)strcpy(s[17],"                              →   退出");else strcpy(s[17],"                                   退出");strcpy(s[20],"                                                           By Sdchr");strcpy(s[23],"________________________________________________________________________________");strcpy(s[24],"操作说明:往上移动按↑,往下移动按↓,确认按Enter"); system("cls");for (int i=1;i<=ht;i++) printf("%s\n",s[i]); }inline void wait(int sec){Sleep(sec);}void reflect(void){if (locflag==2){system("cls");printf("\n");printf("这款游戏的玩法很简单哟。\n");printf("\n");printf("对于给定的4*4棋盘,每次可以选择上下左右滑动。\n");printf("\n");printf("每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块。\n");printf("\n");printf("相同数字的方块在靠拢、相撞时会相加。\n");printf("\n");printf("不断的叠加最终拼凑出2048这个数字就算成功。\n");printf("\n");//system("type 介绍.txt");printf("\n\n\n\n\n\n\n\n\n");system("pause");print();}if (locflag==1){game.start();init();print();} }}menu;int main(void){char c;menu.init();menu.print();for (;;){c=getch();if (c==-32) continue;if (c==72){menu.locflag=(menu.locflag+1)%3+1;menu.print();}elseif (c==80){menu.locflag=menu.locflag%3+1;menu.print();}else if (c==13) {menu.reflect();if (menu.locflag==3) break;}}return 0;}


2 0
原创粉丝点击