《求合体》小游戏项目报告
项目链接
https://github.com/0Heeee/Join_game
开发背景
《求合体》以合体为主题的全新游戏,每一株草丛、每一幢房屋、每一只猫咪都时时刻刻哭喊着求合体,一切都取决于玩家的旨意,一切都决定于玩家的安排。玩家的每一位子民,都在等待英明的合体决定。
在本次的课程设计中,依照该背景对游戏进行了一定的改编。支持鼠标操作,并且包含“彩虹”、“炸弹”、“猫”等多样玩法。界面上有显示下一个可放置物品的提示以及玩家当前的分数、剩余步数、获得金币。根据玩家不同的物品类型以及玩家所点击的不同位置,将作出不同的回应。
系统功能设计
系统功能模块图
系统业务流程图
项目创建
系统开发环境要求
本项目的开发及运行环境要求:
操作系统: Windows
开发工具:dev c++和vc++
开发语言:c 语言
项目创建过程
- 寻找合适的项目主题,确定项目为游戏项目《求合体》。
- 找到构建项目的方法,确定使用easyx库,学习该库的使用。
- 考虑项目的各个模块,并完成系统功能模块图。
- 确认游戏的业务流程,并完成系统业务流程图。
- 思考并编写各个模块的具体实现。
- 修改bug,完善游戏页面与逻辑。
- 完成设计报告。
项目模块设计
游戏欢迎界面
概述:首先使用Photoshop获得背景图片。运用easyx库中的putimage()函数,放置背景图片,并通过GetMouseMsg()函数监视鼠标动作,当点击到对应区域时,作出相应回应。
游戏规则界面
概述:使用Photoshop获得背景图片。运用easyx库中的putimage()函数,放置背景图片,并通过GetMouseMsg()函数监视鼠标动作,当点击到对应区域时,作出相应回应。
游戏界面
概述:首先使用Photoshop获得背景图片。运用easyx库中的putimage()函数,放置背景图片,并通过GetMouseMsg()函数监视鼠标动作,当点击到对应区域时,作出相应回应。并且每次点击时判断游戏是否结束,结束则返回游戏欢迎界面。
生成随机地图模块
概述:首先将地图所有位置初始化为空地,将盘子信息初始化为空,再随机放置石头,随机放置猫,随机放置物品,最后初始化玩家信息。
游戏操作模块
概述:首先判断下一物品类型,再判断放置位置的信息,根据两者进行下一步操作。
放置物品模块
概述:根据要放置的位置以及要放置的物品类型,调用putimage()函数。
合并同类型物品模块
概述:判断放下物品的四周是否有与刚放置物品同类型的物品,若有则合并升级,没有则放置。若放下物品为彩虹则可与任何物品进行合并,若其周围无满足条件物品,则彩虹变为随机物品放置。
猫咪移动模块
概述:每放下一个物品时,所有可移动猫咪移动一格。若猫咪四周均有障碍物,则猫咪无路可走,变为墓。
生成随机物品模块
概述:每放下一个物品后,生成新的随机物品并显示在屏幕上方正中央。
放置物品到盘子模块
概述:当盘子为空时,可将物品暂时放入盘子。也可以随时取回盘子中的物品。
玩家信息变更模块
概述:每放下一个物品后,玩家步数减1。合并物品后,根据所放置的物品等级进行加分。根据用户的分数可以获得相应的金币。
游戏结束模块
概述:若地图中没有空地,则游戏结束,统计玩家分数。
项目创新点
该项目只是根据本人玩游戏所大致了解的背景进行一定程度的改编,所有功能的实现与完善均为自己所想。
猫的移动算法
在判断猫的移动时,同时要考虑到猫碰到全包围时会变成墓。然而,猫咪移动的同时,有可能会阻碍其他猫咪的移动,致使其他猫咪遇到全包围的情况,但这种情况不是玩家所致,不应该变成墓。并且,在所有猫咪移动时,原本被猫咪阻挡了所有移动方向的猫咪在该阻挡猫咪移开后,也理应可以移动。
再有,刚被玩家放置的猫不能马上移走。考虑到这几种复杂情况,我设计算法如下:
(1)遍历地图,找到全部的猫,将被猫全包围且四周没有猫的猫变成墓,将被全包围且四周有猫的猫放入暂存栈。
(2)随机移动可以自由移动的猫(不包括刚放下的猫),并记录移动前的位置,加入猫栈。将移动的猫类型type变为newCAT,加入新猫栈。
(3)检测可移动的猫移动前的位置四周是否有猫,若有猫(类型type为CAT且不为刚放下的猫),则将其移动至该可移动的猫移动前的位置(现在为空地),并从暂存栈中删除该猫,将其移动前的位置加入猫栈。将刚移动的猫类型type变为newCAT,加入新猫栈。若猫栈不空,则循环该步。
(4)检查剩余的暂存猫,若周围有新猫(类型type为newCAT),则不变墓,否则变墓。
(5)将类型type为newCAT的猫类型type改回CAT。
合并同类物品算法
因三个物品便可以合并,故要判断是否需要合并最多只需两次四周判断即可。设计算法(不完全按照程序执行顺序)如下:
(1)判断放下物品的四周是否有与刚放置物品同类型的物品。
(2)若有同类型物品,则统计数量加一,将其放入暂存栈。判断该同类型物品的四周(不包括刚放置物品的位置)是否还有与刚放置物品同类型的物品。
(3)若两次判断均有相同类型物品,则说明相同物品数一定大于等于2,则可运用栈,将除刚放置位置外其他所有经过判断的相同类型物品清除,并记录为可升级(upFlag = 1)。
(4)若判断为可升级,则将刚放置位置的类型升级。
(5)再次调用函数,看是否可连续升级。
彩虹合并同类物品算法
彩虹可以和任意物品合并,因此,为找到其应变为的类型,先统计周围物品的类型及该类型对应物品的数量,在大于等于2的类型中选取等级最低的物品,将彩虹等效为该物品。此外,其判断的大致思路与合并同类物品算法类似,故与之合并。修改合并同类物品算法如下:
(1)在判断周围是否有与刚放置物品同类型的物品时,若放置物品为彩虹,则也算是。除空地、猫、墓、石头类型外,统计剩余类型的数量。
(2)第二次四周判断同第一次。除空地、猫、墓、石头类型外,统计剩余类型的数量。
(3)统计周围相同物品,若所有可用类型数量均小于2,则不能合并。将彩虹变为随机类型(不包括彩虹、猫、石头)放置。
若有某类型数量大于等于2,则在所有可合并类型中进行判断,选出等级最低的物品,并将其类型type赋给彩虹所在位置。再次调用函数进行合并操作。
总结与收获
我这次所做的项目是《求合体》,灵感来源于同名app。因为之前有玩过这款小游戏,觉得比较有意思,因此想到做这个项目。
在制作项目时,遇到了挺多问题。因为这游戏知名度比较低,在设计以前我也没有找到官方的游戏规则,因此游戏的基本逻辑主要是在玩游戏的体验中总结出来的,并且加入了我个人的想法。
在游戏算法的设计上,我修改了许多次。这让我懂得了在设计的时候要反复思考,许多的问题都是事先没有考虑完全导致的。因此要考虑好可能出现的各种情况。
除了基本的游戏算法外,我还对easyx这个库有了一定的了解。用于实现c语言编写的小游戏确实比较简单,交互界面也相对于控制台游戏更加友好。
因为之前有过团队协作完成项目的经历,再加上这次对项目有了一定的想法,因此尝试了一个人完成项目。相对于团队合作,一个人完成任务的负担会重很多,但也减少了相互磨合讨论的时间。总的来说,单独完成项目使得我对整体项目的把控更为清晰。
另外,这次完成项目使用了git进行项目管理。之前有学习和使用过几次,但却是第一次使用其辅助完成项目。使用后发现,git在管理方面非常方便,也有助于看到一次次的修改成果,对项目的整体走向更好地掌控。
总体而言,经过这次项目我收获了许多,也发现了自己的不足。在以后的项目中,也会不断吸取经验教训,争取完成地更好。
《求合体》小游戏项目报告