#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;
}
一堆乱码!
“2 0 4 8 (Two Zero Four Eight)
?ㄏ涔ぷ魇?项目-132出品”??