C语言经典项目开发——连连看小游戏
大家应该都玩过连连看,游戏规则不多说了,我们先看看设计思路。
第一件事要根据游戏玩法确定程序的数据结构,不同的数据结构决定了不同的算法设计,用错了数据结构可能直接让代码复杂好几倍。
连连看中玩家操作的数据是一个个的图片,多个图片组成一个棋盘式的矩阵界面。程序根据玩家的点击位置计算两个图片的连接路线,这要求程序以最快、最简单的方式获得矩阵中每个格子的数据。
用二维数组表示游戏中的矩阵界面比较合适,因为数组可以通过索引快速访问数据,二维数组的两个索引刚好对应矩阵界面的(x, y)坐标。例如:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
图中矩阵数据在代码中应该这样表示:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
可以用不同的数字代表不同的图片,比如:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
那么上面的矩阵绘制的时候就会是这样:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
0表示空格,不显示图片。初始化时的空格或消除后的空格,都会被设置为0。
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
接下来要初始化数据,我打算用8种不一样的图片,每种6张,随机放入矩阵中,矩阵最外一圈是空的。这个算法可以用标准库函数 std::random_shuffle 来完成。std::random_shuffle 用于把容器内的数据随机打乱,因此按顺序把数据放入数组中,然后调用 std::random_shuffle 就可以完成初始化。
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
断点运行观察数组数据,和我们设计的一样:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
贴上图片看起来还不错:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
现在来分析游戏玩法。这个游戏的难点是两个图片连接的判定算法,要求连接线只能转折两次。
我的第一反应这是一个寻路算法,要求找到转折两次以下的最短路径。教科书上常见的广度优先搜索、深度优先搜索、DijKstra算法或是游戏中常用的A星算法,稍作修改加上两次转折的限制都能解决这个问题。
但是如果我用这些比较复杂的算法来教新手,显然是在劝退。所以还是考虑找一找连线判定的算法有没有简单的规律。
多玩几次游戏,把不同种类的连线记录下来,总结后可以发现总共有3种连线类型,分别是不转折连接、转折一次和转折两次。
还是从最简单的情况开始考虑。这是解决难题的通用方法:从最简单的情况开始考虑,再逐步增加复杂的条件。
最简单的不转折连接,有两种情况,横向连线和纵向连线:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
这两种情况很容易处理,横向、竖向依次检查每个格子是否被阻挡即可。
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
最后把这两个合并就是不转折的情况下:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
转折一次:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
转折一次的算法也是比较明显的,像上图中的两种情况,找到绿色点的位置,如果这个点可以不转折连到两个红色的图片,那么这两个红色的图片就可以通过一次转折连接。
绿点的位置是由两个红点决定的,只有上图中的两种可能。
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
转折两次的情况就多了,下图同样是连接红色图片,要绕过绿色图片。
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
转折两次的情况很多,这里无法一一列举,但是仔细思考可以发现和转折一次本质上是一样的,就是找到两个点,这两个点可以分别和红色图片无转折连接,并且这两个点也可以无转折连接。
这两个点需要位于经过红色图片的十字线上,并且只要确定一个了其中一个点,就能对应地找到另一个点:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
因此只要遍历其中一个图片的两条十字线经过的所有的点,并计算出另一个图片十字线上对应点的位置,检查这两个点和两个红色图片是否可以无转折连接:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
代码码完了,添上图片和鼠标检测的代码跑一跑试试。
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
右边显示临时显示字符用于测试连通性,多次测试没有问题。
最后加上连线,并清除被点击的两个格子,就完成了连连看的核心逻辑:
在学习C/C++可以加入我们的学习交流QQ群: 854367391,领取C/C++学习资料
C语言经典项目开发——连连看小游戏相关推荐
- java游戏开发——连连看小游戏
本次课程主要为大家详细介绍了Java制作--<连连看>小游戏,示例代码介绍的非常详细,具有想当的参考价值,感兴趣的小伙伴们可以学习一下! 小伙伴们应该都玩过连连看吧,今天呢叫大家用Java ...
- 0基础C语言实战项目-贪吃蛇小游戏
大家好啊,如果有一样是编程0基础的大一本科生,相信大家现在都对自己学习了一段时间的程序设计课程还没有过实战经验: 最近也是考试刚完,持着练手的心态我编写了这样一个经典的小游戏-贪吃蛇: 由于是第一次发 ...
- 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...
- c语言课程结束小项目:2048小游戏
<C语言程序设计基础>学习完毕,完成第一个项目:2048小游戏. //思考:编程时,要先想整个框架还是先想每个函数的算法. //思考:每一个函数要不要传参数(即数组) //思考:每一个函数 ...
- 【Java速成教学】桌球游戏项目_教你用最短的时间开发桌球小游戏_Java初学者项目
Java小游戏项目回归!今天给大家带来的是桌球游戏~ 本课程面向刚入门或者有一定Java基础的人群,帮助学员理解面向对象编程,并将基础知识进行实际应用,最终目标为开发出一个功能强大的桌球游戏.[Jav ...
- C语言实训——经点小游戏马里奥开发day2
C语言实训--经点小游戏马里奥开发day2 角色移动相关 一.直接改变坐标 在制作了卷轴式的地图后,为了发挥卷轴式地图的优越性,马里奥能自由移动是必须的,为了实现马里奥的移动,最开始我尝试的是当用户按 ...
- 想开发微信小游戏,先看看腾讯是如何制定规则的
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 作者 | 凌华彬.王哲 责编 | 徐威龙 一.前言 在第一篇文章<微信小游戏开发上手& ...
- 如何开发一个小游戏?其中有什么难点
如果仅仅针对个人开发者来讲,要独立开发一款大型游戏几乎无可能,更大成功的可能还是开发一款类似<羊了个羊>这样洗脑的小程序游戏. 所以这里主要论述小游戏开发的情况,也就是小程序游戏,首先从小 ...
- C语言大一课设 扫雷小游戏
目录 [题 目]扫雷小游戏 [项目简介] [总体功能结构流程图] 登录和注册流程图: 打印棋盘流程图: 计算周围雷的个数流程图: test.c game.h game.c 运行结果 (1)注册运 ...
最新文章
- python 贴吧自动回复机-python借助wxpy与图灵实现微信机器人自动回复消息
- miui11禁止更新方法
- vue 自己写组件。
- Linux 查看网卡流量【转】
- 构建LAMP平台及应用系统
- DevExrepss的Grid属性设置及常用方法总结
- 学python要有多少英语词汇量测试_非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!...
- haproxy keepalived_企业实战KeepAlived+Redis+Haproxy实现主从热备、负载均衡、秒级切换...
- Ora-19804: Cannot reclaim 45561856 bytes disk space from 8589934592 limit
- SpringCloud工作笔记085---SpringBoot项目中防止跨站脚本攻击功能添加
- android手机如何提速,安卓手机上网如何提速
- 对复杂字典DictionaryT1,T2排序问题
- what is the core technology for WEBGIS and MobileGIS
- Spring AOP之静态代理
- 使用RN开发App,引入图标失效问题的解决
- python怎么把小写改成大写_Python 把金额小写转换成大写
- 微信小程序授权用户绑定手机号
- java链接打印机打印文件
- 找不到服务器或应用项目,版本找不到服务器应用程序、源文件或项目的解决办法...
- 一文搞懂经济数据中M0 M1 M2