文章目录
游戏介绍
- 按方向键上下左右,可以实现“2048”游戏数据的整合。
- 按R键重开游戏。
- 游戏拥有计分系统
效果展示
游戏代码
游戏源代码如下,可以直接在自己的编译器里运行。
游戏基础代码详解
光标操作与界面操作
光标位置定义
static void _SetPos(int x, int y)
{
COORD position;
HANDLE handle;
position.X = x;
position.Y = y;
handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, position);
}
隐藏光标
static void HidePos()
{
CONSOLE_CURSOR_INFO cursor_info = {
1, FALSE};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
代码可读性
一些宏定义
//函数返还
#define FALSE 0
#define OK 1
//操作输入
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
//游戏数据
#define SIZE 4
#define HIDE 0
#define TOWER 0
双指针
typedef struct Sentry//用于处理游戏数据
{
Map_2048 *TravelSentry;
Map_2048 *CheckSentry;
} SentryDouble;
数据存放
将游戏数据存放在二位数组中
// 2048游戏数据的存放
typedef int Map_2048;
Map_2048 Map[SIZE + 1][SIZE + 1];
//游戏地图初始化,Map[0][]与Map[][0],用于判断行列是否已满
数据生成
在随机位置生成2或4(2的生成概率为90%,4的生成概率为10%)
static status GAME_DataCreate()
{
int x, y;//地图坐标
int Weight;//生成概率
Weight = rand() % 10;//0~9
srand(time(NULL));
if (Map[TOWER][TOWER])
return FALSE;
while (1)
{
x = rand() % SIZE + 1;//1~4
y = rand() % SIZE + 1;//1~4
if (!Map[x][y])
if (Weight)//非0则生成2
{
Map[x][y] = 2;
break;
}
else
{
Map[x][y] = 4;
break;
}
}
return OK;
}
数据处理
在按下方向键上下左右后处理游戏数据
指针初始化
static status SentryInitialize(int Player_Input, SentryDouble *Sentry, int i)
{
switch (Player_Input)
{
case UP:
Sentry->TravelSentry = Sentry->CheckSentry = &Map[1][i];
break;
case LEFT:
Sentry->TravelSentry = Sentry->CheckSentry = &Map[i][1];
break;
case DOWN:
Sentry->TravelSentry = Sentry->CheckSentry = &Map[SIZE][SIZE - i + 1];
break;
case RIGHT:
Sentry->TravelSentry = Sentry->CheckSentry = &Map[SIZE - i + 1][SIZE];
break;
default:
break;
}
return OK;
}
数据处理代码
static status GAME_DataDeal(int Player_Input)
{
switch (Player_Input)
{
case UP:
case DOWN:
GAME_YDataDeal(Player_Input);
break;
case LEFT:
case RIGHT:
GAME_XDataDeal(Player_Input);
break;
default:
break;
}
return OK;
}
行处理
static status GAME_XDataDeal(int Player_Input)
{
SentryDouble Sentry;
for (int i = 1; i <= SIZE; i++)
GAME_XPartDataDeal(Player_Input, &Sentry, i);
return OK;
}
列处理
static status GAME_YDataDeal(int Player_Input)
{
SentryDouble Sentry;
for (int i = 1; i <= SIZE; i++)
GAME_YPartDataDeal(Player_Input, &Sentry, i);
return OK;
}
向左或向右处理
static status GAME_XPartDataDeal(int Player_Input, SentryDouble *Sentry, int i)
{
SentryInitialize(Player_Input, Sentry, i); //指针初始化
Map_2048 *ExSentry;//哨兵
ExSentry = (Player_Input == LEFT ? (&Map[i][SIZE]) : (&Map[SIZE - i + 1][1])); //向左或向右处理
int Sew = Player_Input == LEFT ? 1 : -1; //向左或向右处理
while ((*Sentry->TravelSentry == 0) && (Sentry->TravelSentry != ExSentry)) //排除零
Sentry->CheckSentry = Sentry->TravelSentry = Sentry->TravelSentry + Sew;
while (Sentry->TravelSentry != ExSentry)
{
Sentry->CheckSentry = Sentry->TravelSentry;
while (Sentry->CheckSentry != ExSentry)
CheckSentryDeal(Player_Input, Sentry);//检查是否有可以合并的数字
Sentry->TravelSentry = Sentry->TravelSentry + Sew;
}
return OK;
}
向上或向下处理
static status GAME_YPartDataDeal(int Player_Input, SentryDouble *Sentry, int i)
{
SentryInitialize(Player_Input, Sentry, i); //指针初始化
Map_2048 *ExSentry;//哨兵
ExSentry = (Player_Input == UP ? &Map[SIZE][i] : &Map[1][SIZE - i + 1]); //向上或向下处理
int Sew = (Player_Input == UP