(C语言)2048游戏实现

游戏介绍

  1. 按方向键上下左右,可以实现“2048”游戏数据的整合。
  2. 按R键重开游戏。
  3. 游戏拥有计分系统

效果展示

请添加图片描述

游戏代码

游戏源代码如下,可以直接在自己的编译器里运行。

游戏基础代码详解

光标操作与界面操作

光标位置定义
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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值