#include<bits/stdc++.h>
#include<conio.h>
using namespace std;
int sco[7][7], lib[5] = {2, 2, 2, 2, 4};
void printscreen() { //print the game screen
printf(" ------- ------- - - -------\n\
- - - - - - -\n\
- - - - - - -\n\
------- - - ------- -------\n\
- - - - - -\n\
- - - - - -\n\
------- ------- - -------\n");
for(int i = 1;i <= 4;++i) {
puts("-----------------------------------------------------------------");
puts("| | | | |");
for(int j = 1;j <= 4;++j)
if(sco[i][j]/1000) printf("| %d ", sco[i][j]);
else if(sco[i][j]/100) printf("| %d ", sco[i][j]);
else if(sco[i][j]/10) printf("| %d ", sco[i][j]);
else if(sco[i][j]) printf("| %d ", sco[i][j]);
else printf("| ");
puts("|");
}
puts("-----------------------------------------------------------------");
}
bool gameover() { //judge whether it's the end of this game
for(int i = 1;i <= 4;++i)
for(int j = 1;j <= 4;++j)
if(!sco[i][j]) return false;
for(int i = 1;i <= 4;++i)
for(int j = 1;j <= 4;++j)
for(int k = 1;k <= 4;++k)
for(int l = 1;l <= 4;++l) {
if(i==k && j==l) continue;
if(sco[i][j] == sco[k][l]) return false;
}
return true;
}
void mergeup() {
for(int i = 1;i <= 4;++i) {
int pos = 1, f[15], j, cnt = 0, h = 0;
memset(f, 0, sizeof f);
while(pos<=3) {
if(sco[pos][i]==sco[pos+1][i] && sco[pos][i]) break;
++pos;
}
if(pos==1 && sco[3][i]==sco[4][i] && sco[3][i]) {sco[1][i] += sco[2][i], sco[2][i] = sco[3][i]*2, sco[3][i] = sco[4][i] = 0; continue;}
for(j = 1;j <= 4;++j)
if(sco[j][i]) f[++cnt] = sco[j][i];
if(cnt >= 2) {
for(j = 1;j < cnt;++j)
if(f[j]==f[j+1]) break;
if(f[j]==f[j+1]) f[j] += f[j+1], f[j+1] = 0;
for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
}
for(j = 1;j <= cnt-h;++j) sco[j][i] = f[j];
for(int k = cnt-h+1;k <= 4;++k) sco[k][i] = 0;
}
return;
}
void mergeleft() {
for(int i = 1;i <= 4;++i) {
int pos = 1, f[15], j, cnt = 0, h = 0;
memset(f, 0, sizeof f);
while(pos<=3) {
if(sco[i][pos]==sco[i][pos+1] && sco[i][pos]) break;
++pos;
}
if(pos==1 && sco[i][3]==sco[i][4] && sco[i][3]) {sco[i][1] += sco[i][2], sco[i][2] = sco[i][3]*2, sco[i][3] = sco[i][4] = 0; continue;}
for(j = 1;j <= 4;++j)
if(sco[i][j]) f[++cnt] = sco[i][j];
if(cnt >= 2) {
for(j = 1;j < cnt;++j)
if(f[j]==f[j+1]) break;
if(f[j]==f[j+1]) f[j] += f[j+1], f[j+1] = 0;
for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
}
for(j = 1;j <= cnt-h;++j) sco[i][j] = f[j];
for(int k = cnt-h+1;k <= 4;++k) sco[i][k] = 0;
}
return;
}
void mergeright() {
for(int i = 1;i <= 4;++i) {
int pos = 4, f[15], j, cnt = 0, h = 0;
memset(f, 0, sizeof f);
while(pos>=2) {
if(sco[i][pos]==sco[i][pos-1] && sco[i][pos]) break;
--pos;
}
if(pos==4 && sco[i][1]==sco[i][2] && sco[i][2]) {sco[i][4] += sco[i][3], sco[i][3] = sco[i][2]*2, sco[i][1] = sco[i][2] = 0; continue;}
for(j = 4;j >= 1;--j)
if(sco[i][j]) f[++cnt] = sco[i][j];
if(cnt >= 2) {
for(j = 1;j < cnt;++j)
if(f[j]==f[j+1]) break;
if(f[j]==f[j+1]) f[j] += f[j+1], f[j+1] = 0;
for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
}
for(j = 1;j <= cnt-h;++j) sco[i][4-j+1] = f[j];
for(int k = cnt-h+1;k <= 4;++k) sco[i][4-k+1] = 0;
}
return;
}
void mergedown() {
for(int i = 1;i <= 4;++i) {
int pos = 4, f[15], j, cnt = 0, h = 0;
memset(f, 0, sizeof f);
while(pos>=2) {
if(sco[pos][i]==sco[pos-1][i] && sco[pos][i]) break;
--pos;
}
if(pos==4 && sco[1][i]==sco[2][i] && sco[2][i]) {sco[4][i] += sco[3][i], sco[3][i] = sco[2][i]*2, sco[1][i] = sco[2][i] = 0; continue;}
for(j = 4;j >= 1;--j)
if(sco[j][i]) f[++cnt] = sco[j][i];
if(cnt >= 2) {
for(j = 1;j < cnt;++j)
if(f[j]==f[j+1]) break;
f[j] += f[j+1], f[j+1] = 0;
for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
}
for(j = 1;j <= cnt-h;++j) sco[4-j+1][i] = f[j];
for(int k = cnt-h+1;k <= 4;++k) sco[4-k+1][i] = 0;
}
return;
}
bool win() {
for(int i = 1;i <= 4;++i)
for(int j = 1;j <= 4;++j)
if(sco[i][j] == 2048) return true;
return false;
}
int main () {
while(!gameover()) {
if(win()) Sleep(100), puts("You Win!"), exit(0);
srand(time(0));
int num = lib[rand()%5], x = rand()%4+1, y = rand()%4+1;
while(sco[x][y]) x = rand()%4+1, y = rand()%4+1;
sco[x][y] = num;
system("cls");
printscreen();
char c = getch();
while(c!='a' && c!='d' && c!='w' && c!='s') c = getch();
if(c == 'w') mergeup();
if(c == 'a') mergeleft();
if(c == 'd') mergeright();
if(c == 's') mergedown();
}
return 0;
}
点个关注再走吧