C 语言项目游戏制作:实现小游戏基本功能,探索益智游戏逻辑

日期: 2024-07-26 17:07:13|浏览: 570|编号: 58543

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

C 语言项目 2048 游戏制作

前言

跨年过年,北方地区是农历二十三月,南方地区是农历二十四月,虽然时间上有差异,但是新年的到来,意味着全体学生都进入了寒假,小编在此祝大家新春快乐。

本期目标:实现2048小游戏的基本功能

制作环境:

支持VC++2010,VS版本

EasyX 图形库 ()。

效果预览:

因为我不用找图片素材,我就直接用easyx提供的绘图功能,画了这么简单的界面。这个游戏怎么样,对于追求快节奏的我们来说可不好玩,说实话,我没有过关,也就是达到2048这个数字。不过,因为《2048》是一款益智游戏,所以其中的逻辑还是值得深思的。

目录

01

游戏设计

游戏规则

游戏规则非常简单,你需要控制所有的方块向同一方向移动,两个相同数字的方块碰撞在一起并合并成它们的总和,每次操作后会随机生成一个 2 或 4,最后你会得到一个“2048”方块来获胜。

数字碰撞

数字冲突是指两个相同的数字碰撞成为它们的总和

场景示例:

在这张图中,我们看第一列数字 { 2 2 0 4 },它实际上是一个一维数组,然后当玩家按下 W 或 ↑ 键时,我们需要处理这个一维数组的数据,即 { 2 2 0 4 } 变为 { 4 4 00}。

那么我该怎么做呢,分两步,首先将数字 { 2 2 0 4 } 改为 { 2 2 4 0},然后循环确定相邻的两个数字是否相同,并合并相同的数字。

我们来看一下代码中的实现

case 72://上
case'W':
case'w':
    //把0向下移动
    for (int j = 0; j < 4; j++)     //4列分别操作
    {
        len = 4;
        for (int i = 0; i < len - 1; i++)
        {
            if (map[i][j] == 0)
            {
                //下面的数字往上移一个格子
                for (int k = i; k < 3; k++)
                {
                    map[k][j] = map[k + 1][j];
                    map[k + 1][j] = 0;
                }
                len--;  //出现一个 0 len减一
                i--;    //返回原位置检测是否有 0
            }
        }
        for (int i = 0; i < len - 1; i++)
        {
            if (map[i][j] == 0break;      //第一行为0 后面都是0,不进行操作
            if (map[i][j] == map[i + 1][j]) //检测相邻两个数字是否相同,相同就合并
            {
                map[i][j] *= 2;     //合并
                //合并之后后面的数字往前移动一位
                for (int k = i + 1; k < 3; k++)
                {
                    map[k][j] = map[k + 1][j];
                    map[k + 1][j] = 0;
                }
                //进行打分
                *score += map[i][j];
            }
        }
    }
    break;

别看代码还挺长的,其实很简单理解,而且四个方向的代码就是一个模型,复制粘贴,修改一些东西,掌握了整个游戏的核心代码,然后是让它看起来更好的界面。由于图表方便快捷,我没有去找图片资源,所以我做的界面可能比较比较,嗯,垃圾。这只是为了学习,别当真,也别说我要清关,我要2048,微信小程序搜索2048,那个界面看起来不错。

02

游戏三部曲

main 函数 int main()。

int main()
{
    initgraph(MAP_ROW * PIXEL + 100, MAP_COL * PIXEL + 100);    //加载窗口
    init(map, &score);          //初始化地图数据
    while (1)
    {
        DrawMap(map, score);    //绘制地图
        Play(map, &score);      //玩家操作
        switch (Judg(map))      //判断输赢  对结果进行匹配
        {
        case 0://赢
            break;
        case -1://输
            break;
本文链接:http://yl101.com/detail/id/58543.html

提醒:请联系我时一定说明是从101箱包皮具网上看到的!