只用一维数组也能写游戏?趣味游戏分享

序言:

最近学习了Linxu下的文件IO,琢磨着做个小游戏实践一下,思来想去写了个的点灯游戏,取名为“记忆大师”。游戏实现非常简单,只用一维数组即可实现(你们可能不知道只用一维数组写一个游戏是什么概念,我们一般只会用两个字。。。。。),虽然简单但是过程非常有趣,因此打算写篇文章分享一下。

游戏运行:

1)主界面

 

主界面些许简陋,作者想着可能大家喜欢简约风吧,不纠结这个了,我们点击“游戏说明”试试:

2)游戏说明

  其实一开始作者并没有添加游戏说明这一模块,但是当他拿着这个游戏信心满满的去找同学测试时,他们一脸懵逼地问:"这是啥?",于是他连夜写了这个游戏说明

                          (游戏说明-1)

 

                          (游戏说明-2)

                          (游戏说明-3)

                          (游戏说明-4)

                          (游戏说明-5)

3)开始游戏

  说了这么多可能有童鞋早就想玩两把了,别急,我们这就点击“开始游戏”

3.1 游戏开始后会依次随机点亮若干个点(因为点亮的点是“转瞬即灭”的,这里只示例了第一个点亮的点),我们的任务是记住它们的位置

3.2 当每一关展示完所有点亮的点后,就会提示我们作答 

 

 3.3 凭借作者超强的记忆力,刚刚点亮的是这三个点,点击提交

 3.4 答对啦,哈哈哈

3.5 第二关,第三关,第四关也轻松通过

 

  

 3.6 第五关记错了一个点,失败了呜呜呜

 

 算了,太菜了,还是来说说实现过程吧

实现过程

1)棋盘设计

  读过严蔚敏版的《C语言数据结构》的童鞋可能对游戏主界面的那个”网状图“比较眼熟,没错,它就是《数据结构》第187页的那张"一个表示交通网的例图"。可能有人要问了:为啥选择这个做棋盘啊?咳咳,其实作者一开始是想做个交通咨询系统的,并且花时间还原了书上那个"交通图",但是后来想着交通咨询系统没有啥可玩性,后面在做这个”记忆大师“时需要设置棋盘,本来想做成规规矩矩5*5的正方形棋盘,后来无意间想起了之前画好的交通图,一拍脑袋,哎,这不刚好可以用来做棋盘嘛

 

        《数据结构》上一张表示交通网的例图

2)点亮\熄灭顶点

   这个游戏需要满足点击一个点时点亮,再点击熄灭,这是怎么做到的呢?

2.1 怎样去存储这些点

  前面提到游戏里最复杂的数据结构是一维数组,每错,这25个点存储在数组vex[25]里:我们按从左往右,从上往下的顺序给顶点编号为0-24,例如vex[4]表示从左到右,从上到下数的第5个点

2.2 点亮\熄灭

  可以说这是整个设计耗时最久的一部分,这部分不需要敲代码,而是需要找出这25个顶点的坐标:在开发板上,不断点击一个点,得到一个坐标范围,然后把“点亮时的图片”按这个坐标覆盖上去,然后一像素一像素的移动图片测试,直到该点“点亮时的图片”完全覆盖原图片。这样的工作要进行25次

                        

“熄灭的点”   

  

 “点亮的点”

用“点亮的点”完全覆盖“熄灭的点”可以达到顶点被点亮的视觉效果,反之则顶点被熄灭

  拿到所有点的坐标后就好办了,我们可以用一个数组flag[25]来记录这25个点的点亮\熄灭情况,并且约定:

1. flag[i] = 0表示vex[i]这个点是熄灭状态

2. flag[i] = 1表示vex[i]这个点是点亮状态

例如上面举例的vex[4]它这部分的代码如下:

 

当把25个点的坐标范围都找出来,并且设置同上的代码,就可以做到点击任一一个点时点亮它啦

3)难度设置

  有人可能要问了,游戏太难了怎么办啊?没关系,我们可以设置游戏难度,但是他又疑惑了:可是我没看见设置难度的按钮啊?这也是这个游戏有趣的一个点

  这个游戏并没有设置按钮来选择游戏难度,而是把这个按钮转移到了"点灯"上:游戏开始时,我们点亮的灯越多游戏难度越高(游戏难度指的是出题时的点灯间隔)实现函数如下:

   可以看出当什么都不做直接开始游戏时,出题时点灯间隔为1200000微秒即1.2秒,而每点亮一个点间隔缩短40000微秒

4)系统请出题

  每关开始时系统会为我们出题,即依次点亮若干个点,每关出题的个数(点亮的顶点数)Num遵循:Num = level + 2,其中level为关卡数(1,2,3,...8),这些题目是随机生成的,我们需要用到随机数函数rand(),另外还需要一个数组来保存题目:question[10](最多有8关,第8关有10个题目)    第level关需要生成level + 2个题目,并且这关的题目不能重复(即同一个点被点亮多次),随机生成level + 2个不重复的0-24之间的随机数,生成的随机数所对应的点将被作为题目,随后这些题目将依次点亮以展示给用户

5)用户请答题

  系统出完题了,该轮到我们答题了,我们需要根据记忆点亮刚刚的题目。有人说我们需要一个数组来保存我们的答案,的确可以这样做,但是别忘了我们之前还定义了一个flag数组用来记录顶点的点亮\熄灭,那么我们的答案不就已经保存在这个flag数组里了

  我们提交答案后,系统需要验证我们的答案,这个就更简单了,直接拿flag数组和question数组一对比不就知道答错没嘛,作者一开始确实也是这样做的,但是由于作者技术太菜,经常玩到第6.7关就没了,而且答错了也不给任何提示,于是乎我又加了两个数组errorsign[]和rightsign[]

  其中errnosign[]用来记录用户答错或者少答的点,rightsign[]用来记录相应的正确的点,检验答案即用for循环遍历flag和question数组,当发现flag[i] != question[i]时:

1. 如果flag[i] == 1则说明用户点亮了这个点但是题目里没有这个点,于是errorsign将记录这个点。

2. 如果flag[i] == 0则说明题目里有这个点但是用户并没有点亮这个点,于是rightsign将记录这个点。

  那么,当用户答错时,除了提示回答错误外,还指出了我们答错的点和相应正确的点

值得注意的是:每次检验完答案后需要把flag数组的元素全部置为零方便下一次出题和答题

结语:

啰啰嗦嗦说了这么多,但是游戏设计过程是挺有意思的,而且游戏也有趣,感兴趣的同学不妨动自己手试试,有什么问题也可以给我留言哦,还有第一次写博客难免会有瑕疵,还望大佬们海涵

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡易云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值