讨论 / 游戏2048(daolao勿喷)
LCB 2018-10-02 09:48:47
点我顶贴 收藏 删除
#include <iostream>

#include <windows.h>

#include <ctime>

using namespace std;

int const ROW = 4;

int const COL = 4;

int game[ROW][COL] = {0};

int max_num,FEN,max_fen,ispo;

char cangame;

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, //定义所有可能出现的数字

};

int max()

{

for(int i=0; i<ROW; i++)

for(int j=0; j<COL; j++) {

if(game[i][j] > max_num) max_num = game[i][j];

FEN += game[i][j] * 2;

}

FEN += max_num;

}

void chushi()

{

for(int i=0; i<ROW; i++)

for(int j=0; j<COL; j++) game[i][j] = 0;

FEN = 0;

max_num = 0;

}

//打印所得的数组

void Print()

{

system("cls");

cout << "2 0 4 8 (Two Zero Four Eight)" << endl;

cout << "猫箱工作室 项目-132出品" << endl << endl;

for (int i = 0; i < ROW; ++i)

{

cout << "========================="<< endl;

for (int j = 0; j < COL; ++j)

{

//初始化棋盘

if (game[i][j] == 0) cout <<"# ";

else if(game[i][j] < 10) cout <<"# " << game[i][j] << " ";

else if(game[i][j] >= 10 && game[i][j] <100 ) cout <<"# " << game[i][j] << " ";

else if(game[i][j] >= 100 && game[i][j] <1000) cout <<"# " << game[i][j] << " ";

else cout <<"#" << game[i][j] << " ";

}

cout << "#" << endl;

}

cout << "========================="<< endl;

max();

cout<<"分值:"<<FEN<<endl;

cout<<"最大数:"<<max_num<<endl;

if(FEN > max_fen && !ispo) {

cout<<"破纪录!";

ispo =true;

}

}

bool CreateNumber()

{

int x = -1;

int y = -1;

int times = 0;

int maxTimes = ROW * COL;

//三分之二的概率生成2,三分之一的概率生成4

int whitch = rand() % 3;

do

{

x = rand() % ROW;

y = rand() % COL;

times++;

} while (game[x][y] && times <= maxTimes);

//说明格子已经满了

if(times >= maxTimes) return 0;

else

{

GameNum num;

if(!whitch) 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()

{

cangame = 'y';

while(cangame == 'y' || cangame == 'Y')

{

chushi();

//设置一个随机数种子

system("cls");

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 << "Win! \n";

if(FEN > max_fen) max_fen = FEN;

cout<<"最高分:"<<max_fen<<endl;

cout << "是否继续游玩?【Y/N】"<<endl;

cin>>cangame;

break;

}

else if(gameState == GAME_OVER)

{

Print();

cout <<"Game Over \n";

if(FEN > max_fen) max_fen = FEN;

cout<<"最高分:"<<max_fen<<endl;

cout << "是否继续游玩?【Y/N】"<<endl;

cin>>cangame;

break;

}

}

}

return 0;

}

#1 noble_@2018-10-04 22:12:53
回复 删除
太巨了orz
查看更多回复
提交回复