```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