首页 > 代码库 > 就是2048游戏啊!强大
就是2048游戏啊!强大
#include <climits> #include <cstdio> #include <cstring> #include <stack> #include <string> #include <map> #include <vector> #include <cmath> #include <cstdlib>
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; }
/* 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格,现在手机上或者电脑上一般都是4*4的,所以我们可以输入4,回车就可以开始游戏了。
游戏开始后a s d w表示方向左 下 右 上四个方向。
正如真实版的2048一样,会输出两个表格,move 表格显示按输入方向平移后的结果,fill 表格显示又随机填充一个格子后的表格 */