7. (2048-Hard

#include<bits/stdc++.h>
#include<windows.h>
#define int long long
using namespace std;
const int N=4;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int maxn,n=N,mp[N+1][N+1];
map<int,int>col;
int wcnt(int x){int cnt=0;while(x>0){++cnt;x/=10;}return cnt;}
string outd(int x){string ans="";for(int i=1;i<=x*10+(x+1)*2;i++){ans+=" ";}ans+="\n";return ans;}
void mid(int x,int d){if(x==0){cout<<"          ";return;}int w=wcnt(x);if((d-w)%2){for(int i=1;i<=(d-w)/2+1;i++){cout<<" ";}}else{for(int i=1;i<=(d-w)/2;i++){cout<<" ";}}cout<<x;for(int i=1;i<=(d-w)/2;i++){cout<<" ";}}
void goodcls(){HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);COORD coord={0,0};SetConsoleCursorPosition(handle,coord);}
void out(string s,int id=7,int tim=0){HANDLE handle=::GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_SCREEN_BUFFER_INFO info;GetConsoleScreenBufferInfo(handle,&info);WORD colorBak=info.wAttributes;SetConsoleTextAttribute(handle,id);for(int i=0;i<(int)s.size();i++){cout<<s[i];Sleep(tim);}SetConsoleTextAttribute(handle,colorBak);return;}
void init(){col[2]=3;col[4]=4;col[8]=6;col[16]=7;col[32]=8;col[64]=10;col[128]=11;col[256]=12;col[512]=14;col[1024]=3;col[2048]=4;col[4096]=6;col[8192]=7;col[16384]=8;col[32768]=10;col[65536]=11;col[131072]=12;col[262144]=14;col[524288]=3;col[1048576]=4;col[2097152]=6;col[4194304]=7;col[8388608]=8;col[16777216]=10;col[33554432]=11;col[67108864]=12;col[134217728]=14;col[268435456]=3;col[536870912]=4;col[1073741824]=6;col[2147483648]=7;}
void print(){goodcls();HANDLE handle=::GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_SCREEN_BUFFER_INFO info;GetConsoleScreenBufferInfo(handle,&info);WORD colorBak=info.wAttributes;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)maxn=max(maxn,wcnt(mp[i][j]));out(outd(N),0xff);for(int i=1;i<=n;i++){for(int r=1;r<=5;r++){for(int j=1;j<=n;j++){SetConsoleTextAttribute(handle,16*col[mp[i][j]]);out("  ",0xff);if(r==3){mid(mp[i][j],10);}else cout<<"          ";SetConsoleTextAttribute(handle,colorBak);}out("  ",0xff);cout<<"\n";}out(outd(N),0xff);}out("2048 Game Cpp Version.\n");}
void randn(){int x=rand()%N+1,y=rand()%N+1;if(mp[x][y]!=0)randn();else mp[x][y]=((rand()%7==0)?4:2);}
bool findd(){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(mp[i][j]==0){return 1;}for(int k=0;k<4;k++)if(mp[i][j]==mp[i+dx[k]][j+dy[k]])return 1;}return 0;}
bool findw(){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(mp[i][j]==2147483648){return 1;}return 0;}
void thend(){out("The end.\nYou are died!\n\n",7,10);system("pause");}
void thewin(){out("The end.\nYou are win!\n2147483648 has been craft!\n\n",7,10);system("pause");}
bool fidd(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)if(mp[i][j]==0)return 1;}return 0;}
void work(int x){
	if(x==1){for(int i=1;i<=n;i++){int cnt=0,j=1;while(j<=n){int w=mp[i][j];if(w!=0){if(j<n&&mp[i][j]==mp[i][j+1]){mp[i][j]=mp[i][j+1]=0;mp[i][++cnt]=w*2;j+=2;}else{mp[i][j]=0;mp[i][++cnt]=w;j++;}}else j++;}}if(!findd())thend();if(fidd())randn();}
	if(x==2){for(int i=1;i<=n;i++){int cnt=n+1,j=n;while(j>=1){int w=mp[i][j];if(w!=0){if(j>1&&mp[i][j]==mp[i][j-1]){mp[i][j]=mp[i][j-1]=0;mp[i][--cnt]=w*2;j-=2;}else{mp[i][j]=0;mp[i][--cnt]=w;j--;}}else j--;}}if(!findd())thend();if(fidd())randn();}
	if(x==3){for(int j=1;j<=n;j++){int cnt=0,i=1;while(i<=n){int w=mp[i][j];if(w!=0){if(i<n&&mp[i][j]==mp[i+1][j]){mp[i][j]=mp[i+1][j]=0;mp[++cnt][j]=w*2;i+=2;}else{mp[i][j]=0;mp[++cnt][j]=w;i++;}}else i++;}}if(!findd())thend();if(fidd())randn();}
	if(x==4){for(int j=1;j<=n;j++){int cnt=n+1,i=n;while(i>=1){int w=mp[i][j];if(w!=0){if(i>1&&mp[i][j]==mp[i-1][j]){mp[i][j]=mp[i-1][j]=0;mp[--cnt][j]=w*2;i-=2;}else{mp[i][j]=0;mp[--cnt][j]=w;i--;}}else i--;}}if(!findd())thend();if(fidd())randn();}
	print();if(findw())thewin();
}
void chk(){if(GetAsyncKeyState(VK_LEFT)&0x25){work(1);}if(GetAsyncKeyState(VK_RIGHT)&0x27){work(2);}if(GetAsyncKeyState(VK_UP)&0x29){work(3);}if(GetAsyncKeyState(VK_DOWN)&0x31){work(4);}}
signed main(){
	srand(time(0));init();
	randn();randn();print();
	while(1){chk();Sleep(10);}
	return 0;
}