小游戏——2048的简易实现

来源:互联网 发布:数据库管理员要学什么 编辑:程序博客网 时间:2024/06/05 19:57

周六下午花了点时间实现了最近很火的小游戏2048,这里用最简单的控制台实现,自娱自乐



附源码:

#include <iostream>#include <iomanip>#include <ctime>#include <cstdlib> using namespace std;const int SIZE = 4;int M[SIZE][SIZE];enum DIR {BOTTOM = 2,RIGHT = 6,LEFT = 4,TOP = 8};void play();bool isLegal(int getNum);void randomNum();void combine(int dir);void showM();void setView(int number);bool isDead();int main() {play();return 0;}void play() {int getNum;while (cin >> getNum) {if (isDead()) {cout << " game over !" << endl;break;}system("cls");if (! isLegal(getNum)) {system("cls");showM();continue;}combine(getNum);randomNum();showM();}}bool isLegal(int getNum) {if (getNum == 0) {cout << "QUIT GAME(Y/N) ";char isQuitGame = 'N';cin >> isQuitGame;if (isQuitGame == 'Y') {exit(0);}}return getNum == LEFT || getNum == TOP || getNum == RIGHT || getNum == BOTTOM;}void randomNum() {int i = 0;int j = 0;srand((unsigned)time(NULL));do {i = rand() % SIZE;j = rand() % SIZE;} while (M[i][j] != 0);M[i][j] = 2;}void combine(int dir) {int i, j;switch (dir) {case LEFT:for (i = 0; i < SIZE; i ++) {// delete 0 between the numberfor (j = 1; j < SIZE; j ++) {if (M[i][j] == 0) {continue;}// M[i][j] != 0 herewhile (j != 0 && M[i][j - 1] == 0) {M[i][j - 1] = M[i][j];M[i][j --] = 0;}}// combine the same numberfor (j = 0; j < SIZE - 1; j ++) {if (M[i][j] == M[i][j + 1]) {M[i][j] += M[i][j + 1];M[i][j + 1] = 0;}}// delete 0 between the numberfor (j = 1; j < SIZE; j ++) {if (M[i][j] == 0) {continue;}// M[i][j] != 0 herewhile (j != 0 && M[i][j - 1] == 0) {M[i][j - 1] = M[i][j];M[i][j --] = 0;}}}break;case TOP:for (j = 0; j < SIZE; j ++) {for (i = 1; i < SIZE; i ++) {if (M[i][j] == 0) {continue;}while (i != 0 && M[i - 1][j] == 0) {M[i - 1][j] = M[i][j];M[i --][j] = 0;}}for (i = 0; i < SIZE - 1; i ++) {if (M[i][j] == M[i + 1][j]) {M[i][j] += M[i + 1][j];M[i + 1][j] = 0;}}for (i = 1; i < SIZE; i ++) {if (M[i][j] == 0) {continue;}while (i != 0 && M[i - 1][j] == 0) {M[i - 1][j] = M[i][j];M[i --][j] = 0;}}}break;case RIGHT:for (i = 0; i < SIZE; i ++) {for (j = SIZE - 2; j >= 0; j --) {if (M[i][j] == 0) {continue;}while (j != SIZE - 1 && M[i][j + 1] == 0) {M[i][j + 1] = M[i][j];M[i][j ++] = 0;}}for (j = SIZE - 1; j >= 1; j --) {if (M[i][j] == M[i][j - 1]) {M[i][j] += M[i][j - 1];M[i][j - 1] = 0;}}for (j = SIZE - 2; j >= 0; j --) {if (M[i][j] == 0) {continue;}while (j != SIZE - 1 && M[i][j + 1] == 0) {M[i][j + 1] = M[i][j];M[i][j ++] = 0;}}}break;case BOTTOM:for (j = 0; j < SIZE; j ++) {for (i = SIZE - 2; i >= 0; i --) {if (M[i][j] == 0) {continue;}while (i != SIZE - 1 && M[i + 1][j] == 0) {M[i + 1][j] = M[i][j];M[i ++][j] = 0;}}for (i = SIZE - 1; i >= 1; i --) {if (M[i][j] == M[i - 1][j]) {M[i][j] += M[i - 1][j];M[i - 1][j] = 0;}}for (i = SIZE - 2; i >= 0; i --) {if (M[i][j] == 0) {continue;}while (i != SIZE - 1 && M[i + 1][j] == 0) {M[i + 1][j] = M[i][j];M[i ++][j] = 0;}}}break;default:break;}}void showM() {cout << endl << endl; cout << "                    ┏━━━━┳━━━━┳━━━━┳━━━━┓" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃  "; setView(M[0][0]);  cout << "  ┃  "; setView(M[0][1]);  cout << "  ┃  ";setView(M[0][2]); cout << "  ┃  "; setView(M[0][3]); cout << "  ┃ " << endl; cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┣━━━━╋━━━━╋━━━━╋━━━━┫" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃  ";setView(M[1][0]);cout << "  ┃  ";setView(M[1][1]);cout << "  ┃  ";setView(M[1][2]);cout << "  ┃  ";setView(M[1][3]);cout << "  ┃ " << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┣━━━━╋━━━━╋━━━━╋━━━━┫" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃  ";setView(M[2][0]);cout << "  ┃  ";setView(M[2][1]);cout << "  ┃  ";setView(M[2][2]);cout << "  ┃  ";setView(M[2][3]);cout << "  ┃ " << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┣━━━━╋━━━━╋━━━━╋━━━━┫" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃  ";setView(M[3][0]);cout << "  ┃  ";setView(M[3][1]);cout << "  ┃  ";setView(M[3][2]);cout << "  ┃  ";setView(M[3][3]);cout << "  ┃ " << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┃        ┃        ┃        ┃        ┃" << endl;cout << "                    ┗━━━━┻━━━━┻━━━━┻━━━━┛" << endl;}void setView(int number) {if (number == 0) {cout << "    ";} else {cout << setw(4) << number;}}bool isDead() {for (int i = 0; i < SIZE; i ++) {for (int j = 0; j < SIZE; j ++) {if (M[i][j] == 0) {return false;}}}return true;}


0 0
原创粉丝点击