C++实现2048小游戏(控制台版的)

来源:互联网 发布:印尼海关数据 编辑:程序博客网 时间:2024/06/15 22:03

无聊,在公司写了个2048小游戏的程序,聊以自娱。(事实是我手机坏了,没得玩微笑)。 很简单,直接上代码了。


#include <iostream>#include <windows.h>#include <ctime>using namespace std;int const ROW = 4;int const COL = 4;int game[ROW][COL] = {0};//上下左右int const UP = 1;int const DOWN = 2;int const LEFT = 3;int const RIGHT = 4;//游戏所处的状态int const GAME_OVER = 1;int const GAME_WIN = 2;int const GAME_CONTINUE = 3;enum GameNum{Game_2 = 2,Game_4 = 4,Game_8 = 8,Game_16 = 16,Game_32 = 32,Game_64 = 64,Game_128 = 128,Game_256 = 256,Game_512 = 512,Game_1024 = 1024,Game_2048 = 2048,};//打印所得的数组void Print(){system("cls");cout << "*****************  2048 控 制 台 版  ******************" << endl;cout << "*****************  By Tanzf (Intern) ******************" << endl << endl;for (int i = 0; i < ROW; ++i){cout << "---------------------------------"<< endl;for (int j = 0; j < COL; ++j){if (game[i][j] == 0){cout <<"|   \t";}else {cout <<"|   " << game[i][j] << "\t";}}cout << "|" << endl;}cout << "---------------------------------"<< endl;}bool CreateNumber(){int x = -1;int y = -1;int times = 0;int maxTimes = ROW * COL;//三分之二的概率生成2,三分之一的概率生成4int whitch = rand() % 3;do {x = rand() % ROW;y = rand() % COL;++times;} while (game[x][y] != 0 && times <= maxTimes);//说明格子已经满了if(times >= maxTimes){return false;}else{GameNum num;if(whitch == 0){num = Game_4;}else if(whitch){num = Game_2;}game[x][y] = num;}return true;}void Process(int direction){switch (direction){case UP://最上面一行不动for(int row = 1; row < ROW; ++row){for(int crow = row; crow >= 1; --crow){for(int col = 0; col < COL; ++col){//上一个格子为空if(game[crow-1][col] == 0){game[crow-1][col] = game[crow][col];game[crow][col] = 0;}else {//合并if(game[crow-1][col] == game[crow][col]){game[crow - 1][col] *= 2;game[crow][col] = 0;}}}}}break;case DOWN://最下面一行不动for(int row = ROW - 2; row >= 0; --row){for(int crow = row; crow < ROW - 1; ++crow){for(int col = 0; col < COL; ++col){//上一个格子为空if(game[crow + 1][col] == 0){game[crow + 1][col] = game[crow][col];game[crow][col] = 0;}else {//合并if(game[crow + 1][col] == game[crow][col]){game[crow + 1][col] *= 2;game[crow][col] = 0;}}}}}break;case LEFT://最左边一列不动for(int  col = 1; col < COL; ++col){for(int ccol = col; ccol >= 1; --ccol){for(int row = 0; row < ROW; ++row){//上一个格子为空if(game[row][ccol-1] == 0){game[row][ccol - 1] = game[row][ccol];game[row][ccol] = 0;}else {//合并if(game[row][ccol - 1] == game[row][ccol]){game[row][ccol - 1] *= 2;game[row][ccol] = 0;}}}}}break;case RIGHT://最右边一列不动for(int  col = COL - 2; col >= 0; --col){for(int ccol = col; ccol <= COL - 2; ++ccol){for(int row = 0; row < ROW; ++row){//上一个格子为空if(game[row][ccol + 1] == 0){game[row][ccol + 1] = game[row][ccol];game[row][ccol] = 0;}else {//合并if(game[row][ccol + 1] == game[row][ccol]){game[row][ccol + 1] *= 2;game[row][ccol] = 0;}}}}}break;}}//处理输入输出,返回上下左右int Input(){//读取上下左右四个方向键int upArrow = 0;int downArrow = 0;int leftArrow = 0;int rightArrow = 0;int direction = 0;while (true){upArrow = GetAsyncKeyState(VK_UP);downArrow = GetAsyncKeyState(VK_DOWN);leftArrow = GetAsyncKeyState(VK_LEFT);rightArrow = GetAsyncKeyState(VK_RIGHT);if(upArrow){direction = UP;break;}else if(downArrow){direction = DOWN;break;}else if(leftArrow){direction = LEFT;break;}else if(rightArrow){direction = RIGHT;break;}Sleep(100);}return direction;}//判断游戏状态int Judge(){//赢得游戏for(int i = 0; i < ROW; ++i){for(int j = 0; j < COL; ++j){if(game[i][j] == 2048){return GAME_WIN;break;}}}//横向检查for(int i = 0 ; i < ROW; ++i){for(int j = 0; j < COL - 1; ++j){if(!game[i][j] || (game[i][j] == game[i][j+1])){return GAME_CONTINUE;break;}}}//纵向检查for(int j = 0; j< COL; ++j){for(int i = 0; i < ROW -1; ++i){if(!game[i][j] || (game[i][j] == game[i+1][j])){return GAME_CONTINUE;break;}}}//不符合上述两种状况,游戏结束return GAME_OVER;}int main(){//设置一个随机数种子srand((unsigned int)time(0));CreateNumber();CreateNumber();Print();int direction = 0;int gameState = -1;while(true){direction = Input();gameState = Judge();if(direction && gameState == GAME_CONTINUE){Process(direction);CreateNumber();Print();Sleep(100);}else if(gameState == GAME_WIN){Print();cout << "You Win!" << endl;break;}else if(gameState == GAME_OVER){Print();cout <<"You lose!" << endl;break;}}return 0;}

嗯,OK。


4 0