user-0 提问: 2048游戏用C语言编写问题

回复:
user: user-1
content: 新手看的注释越多，保持新手状态的时间越长。

user: user-2
content: 注释啊 ，照顾一下新手好么？

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-1
content: 仅供参考：#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; }