#include<bits/stdc++.h>
#include<time.h>
#include<windows.h>
#include<conio.h>
using namespace std;
int sq[5][5], c = 16, m, mx = 0;
bool b;
char a[5];
bool up() { //上移
bool flag = false;
for(int i = 0; i < 3; i++)
for(int j = 1; j <= 4; j++)
for(int k = 2; k <= 4; k++)
if(sq[k - 1][j] == 0 && sq[k][j] != 0) {
sq[k - 1][j] = sq[k][j];
sq[k][j] = 0;
flag = true;
}
for(int i = 1; i <= 4; i++) {
if(sq[1][i] == sq[2][i] && sq[1][i] != 0) {
sq[1][i] *= 2;
sq[2][i] = 0;
flag = true;
}
if(sq[2][i] == sq[3][i] && sq[2][i] != 0) {
sq[2][i] *= 2;
sq[3][i] = 0;
flag = true;
}
if(sq[3][i] == sq[4][i] && sq[3][i] != 0) {
sq[3][i] *= 2;
sq[4][i] = 0;
flag = true;
}
}
for(int i = 0; i < 2; i++)
for(int j = 1; j <= 4; j++)
for(int k = 2; k <= 4; k++)
if(sq[k - 1][j] == 0 && sq[k][j] != 0) {
sq[k - 1][j] = sq[k][j];
sq[k][j] = 0;
}
c = 0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
if(sq[i][j] == 0)
c++;
return flag;
}
bool down() { //下移
bool flag = false;
for(int i = 0; i < 3; i++)
for(int j = 1; j <= 4; j++)
for(int k = 2; k <= 4; k++)
if(sq[k][j] == 0 && sq[k - 1][j] != 0) {
sq[k][j] = sq[k - 1][j];
sq[k - 1][j] = 0;
flag = true;
}
for(int i = 1; i <= 4; i++) {
if(sq[3][i] == sq[4][i] && sq[4][i] != 0) {
sq[4][i] *= 2;
sq[3][i] = 0;
flag = true;
}
if(sq[2][i] == sq[3][i] && sq[3][i] != 0) {
sq[3][i] *= 2;
sq[2][i] = 0;
flag = true;
}
if(sq[1][i] == sq[2][i] && sq[2][i] != 0) {
sq[2][i] *= 2;
sq[1][i] = 0;
flag = true;
}
}
for(int i = 0; i < 2; i++)
for(int j = 1; j <= 4; j++)
for(int k = 2; k <= 4; k++)
if(sq[k][j] == 0 && sq[k - 1][j] != 0) {
sq[k][j] = sq[k - 1][j];
sq[k - 1][j] = 0;
}
c = 0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
if(sq[i][j] == 0)
c++;
return flag;
}
bool left() { //左移
bool flag = false;
for(int i = 0; i < 3; i++)
for(int j = 2; j <= 4; j++)
for(int k = 1; k <= 4; k++)
if(sq[k][j - 1] == 0 && sq[k][j] != 0) {
sq[k][j - 1] = sq[k][j];
sq[k][j] = 0;
flag = true;
}
for(int i = 1; i <= 4; i++) {
if(sq[i][1] == sq[i][2] && sq[i][1] != 0) {
sq[i][1] *= 2;
sq[i][2] = 0;
flag = true;
}
if(sq[i][2] == sq[i][3] && sq[i][2] != 0) {
sq[i][2] *= 2;
sq[i][3] = 0;
flag = true;
}
if(sq[i][3] == sq[i][4] && sq[i][3] != 0) {
sq[i][3] *= 2;
sq[i][4] = 0;
flag = true;
}
}
for(int i = 0; i < 2; i++)
for(int j = 2; j <= 4; j++)
for(int k = 1; k <= 4; k++)
if(sq[k][j - 1] == 0 && sq[k][j] != 0) {
sq[k][j - 1] = sq[k][j];
sq[k][j] = 0;
}
c = 0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
if(sq[i][j] == 0)
c++;
return flag;
}
bool right() { //右移
bool flag = false;
for(int i = 0; i < 3; i++)
for(int j = 2; j <= 4; j++)
for(int k = 1; k <= 4; k++)
if(sq[k][j] == 0 && sq[k][j - 1] != 0) {
sq[k][j] = sq[k][j - 1];
sq[k][j - 1] = 0;
flag = true;
}
for(int i = 1; i <= 4; i++) {
if(sq[i][3] == sq[i][4] && sq[i][4] != 0) {
sq[i][4] *= 2;
sq[i][3] = 0;
flag = true;
}
if(sq[i][2] == sq[i][3] && sq[i][3] != 0) {
sq[i][3] *= 2;
sq[i][2] = 0;
flag = true;
}
if(sq[i][1] == sq[i][2] && sq[i][2] != 0) {
sq[i][2] *= 2;
sq[i][1] = 0;
flag = true;
}
}
for(int i = 0; i < 2; i++)
for(int j = 2; j <= 4; j++)
for(int k = 1; k <= 4; k++)
if(sq[k][j] == 0 && sq[k][j - 1] != 0) {
sq[k][j] = sq[k][j - 1];
sq[k][j - 1] = 0;
}
c = 0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
if(sq[i][j] == 0)
c++;
return flag;
}
void try_again() {
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
sq[i][j] = 0;
c = 16;
m += rand() % c;
m %= c;
int x = 1, y = 1;
for(int i = 0; i <= m; i++) {
do {
x++;
if(x > 4) {
y++;
x = 1;
}
if(y > 4) {
y = 1;
x = 1;
}
rand();
} while(sq[x][y] != 0);
}
sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
}
/*
void r(){
srand(time(0));
int m = rand() % c;
int x = 1, y = 1;
for(int i = 0; i <= m; i++){
do{
x++;
if(x > 4){
y++;
x = 1;
}
if(y > 4){
y = 1;
x = 1;
}
rand();
} while(sq[x][y] != 0);
}
sq[x][y] = (rand() % 2 + 1) * 2;
}
*/
int main() {
srand(time(0));
m = rand() % c;
int x = 1, y = 1;
for(int i = 0; i <= m; i++) {
do {
x++;
if(x > 4) {
y++;
x = 1;
}
if(y > 4) {
y = 1;
x = 1;
}
rand();
} while(sq[x][y] != 0);
}
sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
m += rand() % c;
m %= c;
for(int i = 0; i <= m; i++) {
do {
x++;
if(x > 4) {
y++;
x = 1;
}
if(y > 4) {
y = 1;
x = 1;
}
rand();
} while(sq[x][y] != 0);
}
sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
while(true) {
system("cls");
cout << "+----------------+\n";
for(int i = 1; i <= 3; i++) {
cout << '|';
for(int j = 1; j <= 4; j++)
if(sq[i][j]) printf("%4d", sq[i][j]);
else cout << " _";
cout << "|\n| |\n";
}
cout << '|';
for(int j = 1; j <= 4; j++)
if(sq[4][j]) printf("%4d", sq[4][j]);
else cout << " _";
cout << "|\n";
cout << "+----------------+\nw = up; s = down; a = left; d = right. (press e to exit, press r to try again)\n-- ";
a[0]=getch();
if(a[0] == 'e') return 0;
else if(a[0] == 'w') b = up();
else if(a[0] == 's') b = down();
else if(a[0] == 'a') b = left();
else if(a[0] == 'd') b = right();
else if(a[0] == 'r') {
b = true;
try_again();
} else b = false;
//cout << b;
while(!b) {
// cout << "\nerror\nplease press again.\n-- ";
a[0]=getch();
if(a[0] == 'e') return 0;
else if(a[0] == 'w') b = up();
else if(a[0] == 's') b = down();
else if(a[0] == 'a') b = left();
else if(a[0] == 'd') b = right();
else if(a[0] == 'r') {
b = true;
try_again();
} else b = false;
}
m += rand() % c;
m %= c;
for(int i = 0; i <= m; i++) {
do {
x++;
if(x > 4) {
y++;
x = 1;
}
if(y > 4) {
y = 1;
x = 1;
}
rand();
} while(sq[x][y] != 0);
}
sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
}
return 0;
}
以前上课摸鱼玩的,甚至做了存档功能(这个不带存档) wasd移动 e退出(方便摸鱼) r重开