#include <iostream>
#include <bits/stdc++.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#include <process.h>
using namespace std;
int mp[20][20],Size;
void the_rules()
{
printf("You can use 'w' 'a' 's' and 'd' to play the game\n");
printf("Now, please enter the number and 'enter' key to confirm the checkerboard size\n");
}
void create_number()
{
int x,y,Rand;
while(1)
{
x=(rand()%Size)+1;
y=(rand()%Size)+1;
if(!mp[y][x])
{
Rand=rand()%6;
if(Rand<=4)
mp[y][x]=2;
else
mp[y][x]=4;
break;
}
}
}
void print_map()
{
int i,j;
for(i=1; i<=Size; i++)
{
if(i==1)
printf("┏━━━━┯");
else if(i==Size)
printf("━━━━┓\n");
else
printf("━━━━┯");
}
for(i=1; i<=Size; i++)
{
for(j=1; j<=Size; j++)
{
if(j==1)
{
if(mp[i][j])
printf("┃%4d┃",mp[i][j]);
else
printf("┃ ┃");
}
else if(j==Size)
{
if(mp[i][j])
printf("%4d┃\n",mp[i][j]);
else
printf(" ┃\n");
}
else
{
if(mp[i][j])
printf("%4d┃",mp[i][j]);
else
printf(" ┃");
}
}
if(i!=Size)
for(j=1; j<=Size; j++)
{
if(j==1)
printf("┠━━━━┼");
else if(j==Size)
printf("━━━━┨\n");
else
printf("━━━━┼");
}
else
for(j=1; j<=Size; j++)
{
if(j==1)
printf("┗━━━━┷");
else if(j==Size)
printf("━━━━┛\n");
else
printf("━━━━┷");
}
}
}
bool play_up()
{
int num,F,i,j,flag=0;;//num值为当前数字的前一个非空数字,F为最头上的位置;
for(j=1; j<=Size; j++)
{
num=1;
F=1;
for(i=1; i<=Size; i++)
{
if(mp[i][j]==0)
continue;
if(mp[i][j]==num)
{
mp[F-1][j]=mp[i][j]+num;
mp[i][j]=0;
num=1;
flag=1;
}
else
{
mp[F][j]=mp[i][j];
num=mp[i][j];
if(F!=i)
{
mp[i][j]=0;
flag=1;
}
F++;
}
}
}
return flag;
}
bool play_down()
{
int num,F,i,j,flag=0;//num值为当前数字的前一个非空数字,F为最头上的位置;
for(j=1; j<=Size; j++)
{
num=1;
F=Size;
for(i=Size; i>=1; i--)
{
if(mp[i][j]==0)
continue;
if(mp[i][j]==num)
{
mp[F+1][j]=mp[i][j]+num;
mp[i][j]=0;
num=1;
flag=1;
}
else
{
mp[F][j]=mp[i][j];
num=mp[i][j];
if(F!=i)
{
mp[i][j]=0;
flag=1;
}
F--;
}
}
}
return flag;
}
bool play_left()
{
int num,F,i,j,flag=0;;//num值为当前数字的前一个非空数字,F为最头上的位置;
for(i=1; i<=Size; i++)
{
num=1;
F=1;
for(j=1; j<=Size; j++)
{
if(mp[i][j]==0)
continue;
if(mp[i][j]==num)
{
mp[i][F-1]=mp[i][j]+num;
mp[i][j]=0;
num=1;
flag=1;
}
else
{
mp[i][F]=mp[i][j];
num=mp[i][j];
if(F!=j)
{
mp[i][j]=0;
flag=1;
}
F++;
}
}
}
return flag;
}
bool play_right()
{
int num,F,i,j,flag=0;//num值为当前数字的前一个非空数字,F为最头上的位置;
for(i=1; i<=Size; i++)
{
num=1;
F=Size;
for(j=Size; j>=1; j--)
{
if(mp[i][j]==0)
continue;
if(mp[i][j]==num)
{
mp[i][F+1]=mp[i][j]+num;
mp[i][j]=0;
num=1;
flag=1;
}
else
{
mp[i][F]=mp[i][j];
num=mp[i][j];
if(F!=j)
{
mp[i][j]=0;
flag=1;
}
F--;
}
}
}
return flag;
}
int main()
{
HANDLE hOutput;
COORD coord= {0,0};
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//放在主函数开头
the_rules();
scanf("%d",&Size);
Size=Size%21;
system("cls");//清屏
create_number();
create_number();
char Do;
while(1)
{
//Sleep(1000);
print_map();
Do=getch();
int flag=0;
if(Do=='w')
flag=play_up();
else if(Do=='s')
flag=play_down();
else if(Do=='d')
flag=play_right();
else if(Do=='a')
flag=play_left();
if(flag)
create_number();
SetConsoleCursorPosition(hOutput,coord);//放在需要刷新的地方
}
return 0;
}