空闲时间用C语言写了下2048游戏

本身这个游戏逻辑挺简单的,所以,不多说了,直接上代码吧

玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格,,现在手机上或者电脑上一般都是4*4的,所以我们可以输入4,回车就可以开始游戏了。

游戏开始后a s d w表示方向左 下 右 上四个方向。

正如真实版的2048一样,会输出两个表格,move 表格显示按输入方向平移后的结果,fill 表格显示又随机填充一个格子后的表格

#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;}只是玩了几局,没有很深度的找bug,所以可能会有bug。

其实你已经错过了旅行的意义。

空闲时间用C语言写了下2048游戏

相关文章:

你感兴趣的文章:

标签云: