2048小游戏
2025-05-23 19:23:49
发布于:广东
看到了一个2048的小游戏,修改了一下。
(顺手打了一些注释)
小键盘上下左右直接开玩。
废话不多说,直接上代码
//2048-1.1.4 by Dark_eve
//https://www.acgo.cn/discuss/post/29960?commentId=136708
#include <iostream>
#include <windows.h>
#include <ctime>
#include<stdlib.h>
using namespace std;
int const ROW = 4;
int const COL = 4;
int game[ROW][COL] = {0};
//目标 最大值
int Target,MaxNum=-1;
//上下左右
int const UP = 1;
int const DOWN = 2;
int const LEFT = 3;
int const RIGHT = 4;
//游戏所处的状态
int const GAME_OVER = 1; //没有空格,gg
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 direction = 0;
int gameState = -1;
//数字生成器
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] != 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 Judge()
{
//赢得游戏(暴力枚举)
for(int i = 0; i < ROW; ++i)
{
for(int j = 0; j < COL; ++j)
{
if(game[i][j] >= Target/*2048*/) //胜利判断
{
return GAME_WIN;
break;
}
//最大值判断(打擂台)
if(game[i][j]>MaxNum) MaxNum=game[i][j];
}
}
//检查是否有空格,如果没有,则gg, return GAME_OVER;
//横向检查
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 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(500); //延时,防止按一次被判按多次
}
return direction;
}
//屏幕刷新(打印所得的数组)
void Print()
{
system("cls"); //删除屏幕已显示的内容
//重新输出
//cout << "***************** 2048 控 制 台 版 ******************" << endl;
//cout << "**************** 当 前 版 本 :1.1.2 *****************" << endl;
//cout << "************ By Tanzf(Intern) & Dark_eve *************" << endl;
//cout<<"目标:"<<Target<<endl<<endl;
printf("***************** 2048 控 制 台 版 ******************\n");
printf("**************** 当 前 版 本 :1.1.3 *****************\n");
printf("************ By Tanzf(Intern) & Dark_eve *************\n");
printf("目标:%d 最大值:%d\n\n",Target,MaxNum);
for (int i = 0; i < ROW; ++i)
{
cout << "---------------------------------"<< endl;
for (int j = 0; j < COL; ++j)
{
if (game[i][j] == 0)
{
//cout <<"| \t";
printf("| \t");
}
else
{
//cout <<"| " << game[i][j] << "\t";
printf("|%d\t",game[i][j]);
}
}
//cout << "|" << endl;
printf("|\n");
}
//cout << "---------------------------------"<< endl;
printf("---------------------------------\n");
}
//目标输入修正
int TargetFix(int oldTarget){
int TargetList[6]={128,256,512,1024,2048,4096};
for(int id=0;id<6;id++){
if(oldTarget<TargetList[id]) return TargetList[id];
}
return 4096;
}
//初始化
void Start(){
//输入目标
printf("************** 2048 控 制 台 版 规 则 介 绍 ***************\n");
printf("1.当格子中数字大于或等于目标时获胜\n");
printf("2.所有格子都有数字导致无法移动且未达到目标则失败.\n");
printf("输入目标(请输入整数),范围:128<=x<=4096(本程序带有自动修正)\n");
cout<<"输入目标>>>";
scanf("%d",&Target);
//修正
Target=TargetFix(Target);
//设置一个随机数种子
srand((unsigned int)time(0));
CreateNumber();
CreateNumber();
Print();
return;
}
//模式选择
void chooseMode(){
cout<<"选择你要做的事情: 1.开始游戏 2.关闭\n";
int mode;
cout<<">>>";
cin>>mode;
if(mode==1){
Start();
}else if(mode==2) exit(0);
else{
system("cls");
chooseMode();
}
return;
}
int play(){
//初始化
chooseMode();
//Start();
//开始游玩
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;
printf("paly again?(y/n)\n>>>");
string choice;
cin>>choice;
if(choice=="y"){
MaxNum=-1;
play();
}else{
break;
}
}
else if(gameState == GAME_OVER)
{
Print();
cout <<"You lose!" << endl;
break;
}
}
return 0;
}
int main(){
play();
return 0;
}
可能有一些小bug,欢迎在评论区讨论。
全部评论 1
可以的,延迟改下,加点色彩
2025-05-24 来自 四川
0键盘检测的延迟太低吗?
2025-05-25 来自 广东
1下一个版本将加上颜色
2025-05-25 来自 广东
0运行
2025-05-25 来自 四川
0
有帮助,赞一个