有点难
关键知识点
下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解 2048 游戏的设计思路。
1) 改变文本颜色
2048 游戏设置的格子边框颜色为湖蓝色,其中的数字颜色设有淡绿色、绿色等,所有的这些设置都涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言,让文字更漂亮》了解详情。
2) 键盘监听
在2048 游戏中,玩家可通过 W\A\S\D 或者方向键来控制数字的移动方向,具体实现方法请大家猛击《C语言非阻塞式键盘监听》了解详情。
3) 获取随机数
2048 游戏中,对于每次产生的新的数字所处位置,是随机的,这就需要通过产生随机数来完成,请大家猛击《C语言获取随机数》了解详情。
2048游戏整体设计思路
2048小游戏的整体的设计思路是:

  1. 游戏界面初始化,共有 4 行 4 列,总计 16 个位置,游戏开始时,在任意的两个位置上,随机产生数字 2 或 4(产生 2 的几率更大一些);
  2. 玩家可通过 W\A\S\D 或者键盘方向键来控制所有数字的移动,游戏过程中,要符合 2048 游戏的基本规则;
  3. 当游戏中无空余位置,且相邻数字之间无法合并,则 game over;
    提示:我们提供的 2048游戏,并不是合并为 2048 即为结束,结束标志只有一个,就是第 3 条所说,直到游戏无法进行,才会结束。
    数字移动和合并的算法实现
    在2048 游戏中,数字移动和合并为游戏的核心,在游戏过程中,无论数字向那个方向移动,其实现所用的算法都是相同的。

这里我们用 “左移” 操作来给大家讲解算法的实现过程。

如上图所示,若这种情况下玩家进行“左移”操作,我们首先拿最后一行来具体分析源码中的实现过程(左移执行 move_left()函数)。

首先,我们用变量 k 表示坐标为 (4,1) 位置存放的数据,然后用变量 i 从(4,2)开始遍历,到有数字的位置就停止,一直到此行的最后位置(4,4),如下图所示:

在 i 移动的过程中,我们统一做以下操作:

  • 如果 k 指向位置的数字同 i 指向位置的数字相等:则消除 i 位置的数字,k 指向位置的数字*2,然后 k 本身 +1(即 k 指向下一个位置),i 向后移动;
  • 如果 k 指向位置的数字同 i 指向位置的数字不相等:则将 i 位置的数字移动到 k+1 的位置,同时 k本身要 +1(即 k 指向下一个位置),i 向后移动;
  • 如果 k 指向位置没有数字:则将 i 位置的数字直接移动到 k 所指向的位置,同时消除 i 位置处的数字。k位置不动,i 向后移动;
    采用以上规则,第一次运行,k=2,同时 i=2,符合第 1 条,做相应改变之后,如下图所示:

    继续运行,此时 k 位置无数字,i=4,符合第 3条,改变之后,如下图所示:

    此时,由于 i 超出了指定的遍历区间,所以此次移动任务结束。以上是第 4 行移动的过程。

同理可见,第 2 行中,i 可从坐标(2,2)位置向后移动,但是一直没有数字,所以不需任何移动;

第 3 行中,第一次运行,k 处无数字, i 指向的是最后的数字 4,按照第 3 条规则,直接将 4 移动到 k 处,此行移动就结束了。

所以,在实现左移操作的实现时,我们只需要遍历每一行,在每行的遍历过程中,嵌套遍历每一个非 0 数,根据以上规则,做相应移动即可。

举一反三,上移、下移、右移,都是如此实现。具体实现过程,可见源代码中 move_left()、move_right()、move_up()、move_down() 函数的代码实现。
游戏结束的判断标志
我们设计的 2048 游戏,由于其并不是产生 2048 即为结束标志,所以对于此游戏来说,玩家甚至可合并处 4096 、8192、16384 等。

游戏一旦开始,唯一的正常结束标志就是:16 个格子全部被数字占用,且无论做哪种方向的移动,数字之间都无法完成合并,此时,游戏无法继续,视为结束的标志。

所以,在游戏的运行过程中,我们只需要判断以下两种状态:

  • 16 个格子是否全部沾满,如果有空格子,则游戏继续;
  • 如果 16 个格子全部沾满,可使用嵌套循环判断:是否存在相邻数字之间相等,如果存在,游戏继续;如果不存在,游戏结束。
    具体游戏结束的算法实现,可参考源代码的 refresh_show() 函数中,对游戏结束的判断。
    至于该游戏中界面的搭建,实则是使用特殊字符组成,即以 printf() 输出特殊字符的形式组成,具体实现可见 refresh_show() 函数,并无什么技术含量,这里不再详细介绍,大家可以参照源码。

2048小游戏编写思路相关推荐

  1. 2048小游戏设计思路

    2048小游戏设计思路: 游戏初始截图: 游戏过程中截图: 游戏失败截图: 部分代码: <!DOCTYPE html><html> <head><meta h ...

  2. c++2048小游戏编写

    一.序言 最近编写了一个小游戏,叫作2048,用到了面向对象的知识. 二.头文件与准备 #include<bits/stdc++.h> #include<windows.h> ...

  3. 2048网页版html项目报告,jQuery编写网页版2048小游戏

    大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了,但是自己实现起 ...

  4. java编写2048小游戏

    java版2048小游戏 java编写2048小游戏 java编写2048小游戏 // An highlighted block /*** */ package games;/*** @author ...

  5. C语言编写2048小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...

  6. Linux C语言编写2048小游戏

    2048 2048小游戏是用Linux C语言写的,运行在Ubuntu系统上,其中Ubuntu链接Ncuses库.首先,我们简单了解一下Ncurses. Ncurses库是由原CURSES库发展而来的 ...

  7. html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)

    在前面的五篇文章中,小编带大家完成了网页版2048小游戏的基本游戏逻辑.但是在游戏结束的gameover()方法中咱们只是简单的通过alert来弹出一些信息,这样的话只能出现下图的效果.这样的游戏,不 ...

  8. c语言程序2048_C语言2048小游戏演示和说明

    2048游戏是风靡一时的小游戏,我们提供的2048小游戏不依赖 TC 环境,不依赖任何第三方库,可以在 VS.CodeBlocks.DEV C++ 等常见 IDE中编译通过.我们提供给大家的 2048 ...

  9. c语言2048代码linux,C语言实现2048小游戏(示例代码)

    2048 一.设计思路 1.游戏规则 想要制作游戏,首先需要了解游戏的规则,下面就来介绍2048的游戏规则 2048游戏共有16个格子,初始时初始数字由2或者4构成. 手指向一个方向滑动,所有格子会向 ...

最新文章

  1. 在Ubuntu 16.04.5 LTS上安装pygame模块
  2. (如何从一个列表中随机抽样)np.random.choice(),random.sample()
  3. spring执行定时任务
  4. Jquery的分页插件
  5. s l m 尺码排序 php,m l xl xxl是什么意思?服装尺码s m l xl xxl含义
  6. php 正则获取某个div,php正则匹配html中带class的div并选取其中内容的方法
  7. python如何分成两行_python将文本分每两行一组并保存到文件
  8. 算成绩啦(洛谷P5740、P5741题题解,Java语言描述)
  9. 判断 小程序_怎么判断小程序开发公司靠不靠谱?
  10. 鸭子类型duck typing(动态)
  11. 今天可免费用VR观看第51届超级碗大赛直播
  12. 信息时代不被淘汰,获取成功需有的十种能力
  13. 苹果app(iOS app)比较常用的URL schemes,可以用于iOS应用间相互调用
  14. 计算机的开机自检由什么程序完成,开机自检,教您怎么取消电脑上的开机自检...
  15. 无限复活服务器,绝地求生刺激战场无限复活模式怎么玩 无限复活玩法攻略分享...
  16. 大周末的不休息,继续学习pandas吧,pandas你该这么学,No.7
  17. SPARK-SQL - group分组聚合api,agg()
  18. 实现php Curl 调用不同项目中方法
  19. 单目标应用:蜣螂优化算法求解无人机三维航迹规划,含四种对比算法(提供Matlab代码)
  20. c语言程序设计常用思维,C语言程序设计中计算思维的思考①

热门文章

  1. office2016和Visio2016安装冲突的解决办法(后附安装包链接)
  2. Simulink 电机控制:单电阻采样三相电流重构算法仿真总结
  3. 51单片机学习笔记——SH88F4051A
  4. 【Java】——命名规范
  5. 计算机专业认知教育,计算机学院 “专业认知教育和学业规划教育”讲座顺利举行...
  6. 早期计算机音乐创作的歌曲,计算机音乐创作类普通组
  7. python菜鸟教程mac安装_Python菜鸟教程 | 多平台安装
  8. 如何通过API接口获取item_get_pro - 获得淘宝商品详情高级版
  9. 扬帆际海:如何成为一个合格的跨境电商运营?
  10. 4399PK3366 拭目以待