纯c 2048
#include <climits>
#include <cstdio>
#include <cstring>
#include <stack>
#include <string>
#include <map>
#include <vector>
#include <cmath>
using namespace std;
const int MAXX = 10;
int box[MAXX][MAXX];
void moveLeft(int n, bool &ret){
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
int k;
for (k = j - 1; k >= 0; --k){
if (box[i][k] != -1){
break;
}
}
box[i][k + 1] = box[i][j];
if ((k + 1) != j){
box[i][j] = -1;
ret = true;
}
}
}
}
void mergeLeft(int n, bool &ret){
for (int i = 0; i < n; ++i){
for (int j = 0; j < n - 1; ++j){
if (box[i][j] == -1)continue;
if (box[i][j] == box[i][j + 1]){
box[i][j] *= 2;
box[i][j + 1] = -1;
ret = true;
++j;
}
}
}
}
bool left(int n){
bool ret = false;
moveLeft(n, ret);
mergeLeft(n, ret);
moveLeft(n, ret);
return ret;
}
void moveRight(int n, bool &ret){
for (int i = 0; i < n; ++i){
for (int j = n - 1; j >= 0; --j){
if (box[i][j] == -1)continue;
int k;
for (k = j + 1; k < n; ++k){
if (box[i][k] != -1){
break;
}
}
box[i][k - 1] = box[i][j];
if ((k - 1) != j){
box[i][j] = -1;
ret = true;
}
}
}
}
void mergeRight(int n, bool &ret){
for (int i = 0; i < n; ++i){
for (int j = n - 1; j >0; --j){
if (box[i][j] == -1)continue;
if (box[i][j] == box[i][j - 1]){
box[i][j] *= 2;
box[i][j - 1] = -1;
ret = true;
--j;
}
}
}
}
bool right(int n){
bool ret = false;
moveRight(n, ret);
mergeRight(n, ret);
moveRight(n, ret);
return ret;
}
void moveUp(int n, bool &ret){
for (int j = 0; j < n; ++j){
for (int i = 0; i < n; ++i){
int k;
for (k = i - 1; k >= 0; --k){
if (box[k][j] != -1){
break;
}
}
box[k + 1][j] = box[i][j];
if ((k + 1) != i){
box[i][j] = -1;
ret = true;
}
}
}
}
void mergeUp(int n, bool &ret){
for (int j = 0; j < n; ++j){
for (int i = 0; i < n - 1; ++i){
if (box[i][j] == -1)continue;
if (box[i][j] == box[i + 1][j]){
box[i][j] *= 2;
box[i + 1][j] = -1;
ret = true;
++i;
}
}
}
}
bool up(int n){
bool ret = false;
moveUp(n, ret);
mergeUp(n, ret);
moveUp(n, ret);
return ret;
}
void moveDown(int n, bool &ret){
for (int j = 0; j < n; ++j){
for (int i = n - 1; i >= 0; --i){
if (box[i][j] == -1)continue;
int k;
for (k = i + 1; k < n; ++k){
if (box[k][j] != -1)break;
}
box[k - 1][j] = box[i][j];
if ((k - 1) != i){
box[i][j] = -1;
ret = true;
}
}
}
}
void mergeDown(int n, bool &ret){
for (int j = 0; j < n; ++j){
for (int i = n - 1; i > 0; --i){
if (box[i][j] == -1)continue;
if (box[i][j] == box[i - 1][j]){
box[i][j] *= 2;
box[i - 1][j] = -1;
ret = true;
--i;
}
}
}
}
bool down(int n){
bool ret = false;
moveDown(n, ret);
mergeDown(n, ret);
moveDown(n, ret);
return ret;
}
void line(int n){
for (int i = 0; i < n; ++i){
printf("--------");
}
printf("-");
printf("\n");
}
void print(int n){
for (int i = 0; i < n; ++i){
line(n);
for (int j = 0; j < n; ++j){
printf("|");
if (box[i][j] == -1){
printf("\t");
continue;
}
printf("%2d\t", box[i][j]);
}
printf("|");
printf("\n");
}
line(n);
}
bool isFull(int n){
bool mark = true;
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
if (box[i][j] == -1){
mark = false;
return mark;
}
}
}
return mark;
}
bool isOver(int n){
if (!isFull(n)){
return false;
}
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){
return false;
}
}
}
return true;
}
void fillBox(int n){
int i, j, num;
if (isFull(n)){
return;
}
while (true){
i = rand() % n;
j = rand() % n;
num = rand() % 2 == 0 ? 2 : 4;
if (box[i][j] == -1){
box[i][j] = num;
break;
}
}
}
int main(){
//freopen("in.txt", "r", stdin);
memset(box, -1, sizeof(box));
int n;
bool mark;
scanf("%d%*c", &n);
fillBox(n);
fillBox(n);
print(n);
while (true){
char ch;
scanf("%c%*c", &ch);
if (ch == 'a'){
mark = left(n);
}
else if (ch == 'd'){
mark = right(n);
}
else if (ch == 'w'){
mark = up(n);
}
else if (ch == 's'){
mark = down(n);
}
else{
continue;
}
system("cls");
printf("Move:\n");
print(n);
if (!mark){
continue;
}
fillBox(n);
printf("Fill:\n");
print(n);
if (isOver(n)){
printf("\n\nGame Over!\n\n");
break;
}
}
return 0;
}