2048 v1.1

灌水区

```cpp void move_up() //上移 { if (size==5) //处理大小为4的情况 for (int i=1;i<size;++i) //枚举每一列 { int flag=0; //合并标识 if (map[1][i]==map[2][i]) //检查上方的两个 { score+=map[1][i]+map[2][i]; map[1][i]+=map[2][i]; map[2][i]=0; if (map[1][i]) flag=1; } if (!flag) //如果1和2没有合并,那么优先检查2和3 if (map[2][i]==map[3][i]) { score+=map[2][i]+map[3][i]; map[2][i]+=map[3][i]; map[3][i]=0; if (map[2][i]) flag=1; } if (map[3][i]==map[4][i]) //然后检查3和4 { score+=map[3][i]+map[4][i]; map[3][i]+=map[4][i]; map[4][i]=0; if (map[3][i]) flag=1; } if (!flag) //如果以上没有结果,继续 { if (map[2][i]==map[3][i]) { score+=map[2][i]+map[3][i]; map[2][i]+=map[3][i]; map[3][i]=0; flag=1; } if ((map[1][i]==map[4][i]) && (map[2][i]==0) && (map[3][i]==0)) //检查1和4 { score+=map[1][i]+map[4][i]; map[1][i]+=map[4][i]; map[4][i]=0; flag=1; } if ((map[1][i]==map[3][i]) && (map[2][i]==0)) //检查1和3 { score+=map[3][i]+map[1][i]; map[1][i]+=map[3][i]; map[3][i]=0; flag=1; } if ((map[2][i]==map[4][i]) && (map[3][i]==0)) //检查2和4 { score+=map[2][i]+map[4][i]; map[2][i]+=map[4][i]; map[4][i]=0; flag=1; } } int cnt=0; //以下是上移 for (int j=1;j<size;++j) if (map[j][i]) tmp[++cnt]=map[j][i]; for (int j=1;j<size;++j) map[j][i]=0; int p=0; for (int j=1;j<=cnt;++j) map[j][i]=tmp[j]; } } void move_down() //下移 { if (size==5) for (int i=1;i<size;++i) { int flag=0; if (map[3][i]==map[4][i]) { score+=map[3][i]+map[4][i]; map[4][i]+=map[3][i]; map[3][i]=0; if (map[4][i]) flag=1; } if (!flag) if (map[2][i]==map[3][i]) { score+=map[2][i]+map[3][i]; map[3][i]+=map[2][i]; map[2][i]=0; if (map[3][i]) flag=1; } if (map[1][i]==map[2][i]) { score+=map[1][i]+map[2][i]; map[2][i]+=map[1][i]; map[1][i]=0; if (map[2][i]) flag=1; } if (!flag) { if (map[2][i]==map[3][i]) { score+=map[2][i]+map[3][i]; map[3][i]+=map[2][i]; map[2][i]=0; flag=1; } if ((map[1][i]==map[4][i]) && (map[2][i]==0) && (map[3][i]==0)) { score+=map[1][i]+map[4][i]; map[4][i]+=map[1][i]; map[1][i]=0; flag=1; } if ((map[1][i]==map[3][i]) && (map[2][i]==0)) { score+=map[3][i]+map[1][i]; map[3][i]+=map[1][i]; map[1][i]=0; flag=1; } if ((map[2][i]==map[4][i]) && (map[3][i]==0)) { score+=map[2][i]+map[4][i]; map[4][i]+=map[2][i]; map[2][i]=0; flag=1; } } int cnt=0; //下移 for (int j=1;j<size;++j) if (map[j][i]) tmp[++cnt]=map[j][i]; for (int j=1;j<size;++j) map[j][i]=0; int p=0; for (int j=size-cnt;j<size;++j) map[j][i]=tmp[++p]; } } ```
by 曦行夜落 @ 2018-03-20 21:03:57


```cpp void move_left() //左移 { if (size==5) for (int i=1;i<size;++i) { int flag=0; if (map[i][1]==map[i][2]) { score+=map[i][1]+map[i][2]; map[i][1]+=map[i][2]; map[i][2]=0; if (map[i][1]) flag=1; } if (!flag) if (map[i][2]==map[i][3]) { score+=map[i][2]+map[i][3]; map[i][2]+=map[i][3]; map[i][3]=0; if (map[i][2]) flag=1; } if (map[i][3]==map[i][4]) { score+=map[i][3]+map[i][4]; map[i][3]+=map[i][4]; map[i][4]=0; if (map[i][3]) flag=1; } if (!flag) { if (map[i][2]==map[i][3]) { score+=map[i][2]+map[i][3]; map[i][2]+=map[i][3]; map[i][3]=0; flag=1; } if ((map[i][1]==map[i][4]) && (map[i][3]==0) && (map[i][2]==0)) { score+=map[i][1]+map[i][4]; map[i][1]+=map[i][4]; map[i][4]=0; flag=1; } if ((map[i][1]==map[i][3]) && (map[i][2]==0)) { score+=map[i][3]+map[i][1]; map[i][1]+=map[i][3]; map[i][3]=0; flag=1; } if ((map[i][2]==map[i][4]) && (map[i][3]==0)) { score+=map[i][2]+map[i][4]; map[i][2]+=map[i][4]; map[i][4]=0; flag=1; } } int cnt=0; for (int j=1;j<size;++j) if (map[i][j]) tmp[++cnt]=map[i][j]; for (int j=1;j<size;++j) map[i][j]=0; for (int j=1;j<=cnt;++j) map[i][j]=tmp[j]; } } void move_right() //右移 { if (size==5) for (int i=1;i<size;++i) { int flag=0; if (map[i][3]==map[i][4]) { score+=map[i][3]+map[i][4]; map[i][4]+=map[i][3]; map[i][3]=0; if (map[i][4]) flag=1; } if (!flag) if (map[i][2]==map[i][3]) { score+=map[i][2]+map[i][3]; map[i][3]+=map[i][2]; map[i][2]=0; if (map[i][3]) flag=1; } if (map[i][1]==map[i][2]) { score+=map[i][1]+map[i][2]; map[i][2]+=map[i][1]; map[i][1]=0; if (map[i][2]) flag=1; } if (!flag) { if (map[i][2]==map[i][3]) { score+=map[i][2]+map[i][3]; map[i][3]+=map[i][2]; map[i][2]=0; flag=1; } if ((map[i][1]==map[i][4]) && (map[i][2]==0) && (map[i][3]==0)) { score+=map[i][1]+map[i][4]; map[i][4]+=map[i][1]; map[i][1]=0; flag=1; } if ((map[i][1]==map[i][3]) && (map[i][2]==0)) { score+=map[i][3]+map[i][1]; map[i][3]+=map[i][1]; map[i][1]=0; flag=1; } if ((map[i][2]==map[i][4]) && (map[i][3]==0)) { score+=map[i][2]+map[i][4]; map[i][4]+=map[i][2]; map[i][2]=0; flag=1; } } int cnt=0; for (int j=1;j<size;++j) if (map[i][j]) tmp[++cnt]=map[i][j]; for (int j=1;j<size;++j) map[i][j]=0; int p=0; for (int j=size-cnt;j<size;++j) map[i][j]=tmp[++p]; } } void start() //游戏主体 { while (1) { if (check_lose()) break; //判断是否lose for (int i=1;i<size;++i) for (int j=1;j<size;++j) tmap[i][j]=map[i][j]; //保存初始数组 char ch=getch(); //输入指令 if ((ch=='d') || (ch=='D') || (ch==26)) //右 move_right(); if ((ch=='a') || (ch=='A') || (ch==27)) //左 move_left(); if ((ch=='w') || (ch=='W') || (ch==24)) //上 move_up(); if ((ch=='s') || (ch=='S') || (ch==25)) //下 move_down(); int bo=0; for (int i=1;i<size;++i) for (int j=1;j<size;++j) if (tmap[i][j]!=map[i][j]) bo=1; //判断是否相等 if (bo) //如果变了 { int x1=random(1,size-1),y1=random(1,size-1); //生成两点 while (map[x1][y1]) //重复生成直到生成空位 x1=random(1,size-1),y1=random(1,size-1); int tmp=gtf(); //生成2或者4 map[x1][y1]=tmp; } show(); //显示状态 } show(); puts("You Are Loser!"); system("pause"); } ```
by 曦行夜落 @ 2018-03-20 21:04:38


```cpp void go() { system("cls"); //清屏 score=max_score=0; memset(map,0,sizeof(map)); int x1=random(1,size-1),y1=random(1,size-1); //生成第一个数 map[x1][y1]=2; int x2=random(1,size-1),y2=random(1,size-1); //生成第二个数 while ((x1==x2) && (y1==y2)) //重复生成直到不与第一个点重复 x2=random(1,size-1),y2=random(1,size-1); int tmp; tmp=gtf(); //生成2或者4 map[x2][y2]=tmp; show(); //输出初始局面 start(); //开始游戏 } int main() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息 CursorInfo.bVisible = false; //隐藏控制台光标 SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态 srand((unsigned)time(NULL)); printf("欢迎来到2048\n"); printf("按s开始游戏\n"); printf("按h获得帮助\n"); printf("按q退出\n"); char ch=getch(); while (ch!='q') { if (ch=='s') go(); else if (ch=='h') { system("cls"); puts("2048是一款超好玩的小游戏"); puts("每次可以选择上下左右其中一个方向去滑动"); puts("每滑动一次,除了所有的数字方块都会往滑动的方向靠拢外"); puts("系统也会在空白的地方乱数出现一个数字方块"); puts("相同数字的方块在靠拢、相撞时会相加"); puts("不断的叠加最终拼凑出2048这个数字就算成功"); puts("当然2048不是终点,你可以玩的越来越大,挑战自我!"); puts("按w向上,s向下,a向左,d向右"); puts("现在,开始挑战你的极限吧!"); puts("按r返回"); char ch1=getch(); while (ch1!='r') ch1=getch(); } system("cls"); printf("欢迎来到2048\n"); printf("按s开始游戏\n"); printf("按h获得帮助\n"); printf("按q退出\n"); ch=getch(); } system("pause"); return 0; } ```
by 曦行夜落 @ 2018-03-20 21:05:10


代码太长,只好分开贴出
by 曦行夜落 @ 2018-03-20 21:05:40


可以使用云剪贴板啊
by middle_set @ 2018-03-20 21:10:40


@[hiuseues](/space/show?uid=47842) +1
by SofanHe @ 2018-03-20 21:12:21


红名蒟蒻在此一%
by B_1168 @ 2018-03-20 21:14:21


大佬可以发博客啊 %%%
by x义x @ 2018-03-23 13:22:57


|