2022年c#贪吃蛇实现完整流程备课讲稿 .pdf
-
资源ID:27252697
资源大小:3MB
全文页数:15页
- 资源格式: PDF
下载积分:4.3金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
2022年c#贪吃蛇实现完整流程备课讲稿 .pdf
c#贪 吃 蛇 实 现 完 整 流程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - 最近老有人问我那个俄罗斯方块游戏的代码,解释了半天,觉得麻烦,干脆再做一个更简单的小游戏,贪吃蛇,和俄罗斯方块是一样的思路,只不过游戏相对俄罗斯方块来说简单了很多,把这个小游戏给大伙讲一下,希望对一些C#的初学者有帮助。游戏很简单,通过WASD 或上下左右几个按键控制贪吃蛇的前进方向,这个估计全世界都知道,先看一下游戏运行效果吧其中黑色的事物,红色是贪吃蛇,由于考虑到越简单越好,就没有追求过多的美化和修饰看一下程序结构吧名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - 程序结构很简单,一个Form,两个 Class FormMain 是程序主界面,里面就一个PictureBox控件Block 类是“蛇块”类,我不知道怎么换个词来描述,这个类就是用于描述蛇身子一节一节的信息,从运行效果图上可以看到就是那一个一个小方块的信息,等价于俄罗斯方块里的砖块信息类Palette类就是主画布,是游戏的主要代码,和俄罗斯方块里的画布是一样的作用。从结构上可以看出,整个工程很简单,应该还算比较好理解吧。下一篇给大伙从头到尾的把整个工程重现一遍。呵呵,如果是高手的话,请勿见笑,初学者的话大可以“拿来主义”一下。上一篇我们简单介绍了一下程序结构,接下来我们从头到尾把整个游戏重现一下1. 新建一个Windows 应用程序,起名Snake 吧2. 重命名 Form1,改为 FormMain 。这是我的个人偏好,不改也行。3. 从工具栏里拖放一个picturebox到 FormMain 上面,设置属性picturebox1的 BorderStyle属性选择为FixedSingle,这样能显示边框FormMain 的 KeyPreview 属性设定为True ,这样整个窗体可以响应键盘按键事件,这个在俄罗斯方块那个里面讲过了设定完以后大概应该是整个样子名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 需要补充一下的是,这里面form 的大小和picturebox的大小是不用刻意设置的,因为我们程序里面会根据设定贪吃蛇的大小和贪吃蛇的活动空间自动变大变小的,所以大致是整个样子就行了。4. 添加 pictureBox1和 FormMain 的事件,添加的事件有picturesBox1的 Paint事件 pictureBox1_Paint FormMain 的 KeyDown事件 FormMain_KeyDown FormMain 的 Load 事件 FormMain_Load 至于这三个事件是干什么用的,估计大家大致也能猜的到,pictureBox1_Paint用于更新游戏画面, FormMain_KeyDown 用于响应用户按键,FormMain_Load 用于做一些初始化的工作名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - 添加完成以后代码里应该是这个样子吧5. 添加两个类文件Block 类和 Palette类6. 实现 Block 类Block 类用于描述蛇块信息,记录每个蛇块的坐标,颜色,以及大小这些信息,具体代码如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - 这个类比较简单,Point p用于记录该蛇块的“坐标”,注意这里的坐标不是真正的坐标,由于蛇块是一个块,不是一个点,这里记录的是这个块的坐标,比如,如果是Point(3,2),那么就是表示第四列,第三行的那个块名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - Paint函数根据坐标以及蛇块大小计算出实际绘图的坐标,进行绘图,蛇块是一个正方形(矩形),我们用矩形绘制,在代码中我们看到,绘制的大小比size 小 1 个像素,这么做的原因是为了突出蛇块与蛇块之间的间隙,也就是说蛇块与蛇块之间有1 个像素的间隙,这就是我们看到游戏效果图中的蛇块是一段一段的原因7.Palette类的实现Palette 类是真个游戏的核心处理类,里面定义了画布的大小,背景色,蛇块列表以及游戏速度,移动方向等属性另外还提供了timer 计时器,用于定时更新蛇块坐标位置,以及如何在画面上画图的函数,整个代码如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - 从函数定义中我们可以大致了解一下这个类的功能以及实现方法了,类的属性定义就不再细说了,这些都是很明显的,接下来我们一步一步介绍各个函数的实现7.1 Start函数Start 函数用于开始游戏,这个函数的内部其实就是设定食物,以及触发计时器。代码片段如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - 这里面定义了计时器的事件触发间隔,是通过level 然后找到speed 数组里的对应毫秒值设定的。然后触发事件是OnBlockTimedEvent,这个函数后面再讲。最后是启动计时器开始计时。7.2 OnBlockTimedEvent函数OnBlockTimedEvent函数是计时器的执行函数,这个函数用于更新蛇块信息列表,以及检测游戏是否结束等等,代码片段如下可以看到,函数内部调用了两个函数,一个是Move 函数,一个是CheckDead函数,从字面意思上我们就可以看出来是怎么个流程了。7.3 CheckDead函数checkDead函数用于检测游戏是否结束,具体检查规则如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - 检测是否结束分两种情况,一种是撞上边界,即蛇头坐标超出画布范围,一种是蛇头撞上了蛇身,也就是蛇头的坐标和蛇身的某个坐标重合,通过for 循环来检查第二种情况7.4 Move函数Move 函数用于更新整个蛇块的坐标,我们前面通过将蛇块信息放到ArrayList 里来表示贪吃蛇的整个信息,其中根据下标从0 到 Count-1 依次表示各个蛇块的信息,比如说,ArrayList 里现在依次是_blocks0 : Point(5,2) _blocks1 : Point(4,2) _blocks2 : Point(3,2) 此时蛇块的形状如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - - - 假设现在蛇块的移动方向是向右,那么下一刻移动以后的状态应该是这样_blocks0 : Point(6,2) _blocks1 : Point(5,2) _blocks2 : Point(4,2) 也就是和上图相比,我们会发现其实就是蛇头变成了一个新的蛇头了,原来的舌头变成是蛇身,原来的蛇尾没有了,改成蛇尾前一个蛇块了,所以通过这个分析我们可以得到如何移动的解决方案,就是在ArrayList 的 0 下标处插入一个新的蛇块(蛇头),然后把原来最后一个(Count-1 )的那个蛇块(蛇尾)去掉。代码实现片段如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 15 页 - - - - - - - - - 实际代码中增加了吃食物的情况判断,也就是说如果新蛇头的坐标和食物的坐标一致,那么就不做删除原蛇尾的操作了,这样产生的效果就是蛇块列表的长度增加了一个,达到吃食物变长的效果,相信很好理解,我就不再作图了。7.5 GetFood函数GetFood 函数用于生成下一个食物,其实就是一个蛇块,生成的规则就是,坐标要在画布范围内,并且食物的坐标不能和贪吃蛇的坐标重合,具体代码如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 15 页 - - - - - - - - - 通过 for 循环检查食物坐标是否和贪吃蛇的蛇块列表ArrayList 里的蛇块有冲突,很容易理解,就不多说了7.6 PaintPalette函数PaintPalette函数需要一个参数,也就是绘图句柄,然后在这个画布上画图也就是我们看到的游戏效果首先用背景色清空画布,然后画食物,其次是通过for 循环将贪吃蛇的每个蛇块画在画布上,以此达到游戏效果。7.7 构造函数呵呵,这个函数我以为没东西,回头看看,这个函数里面有一句话很重要,得说明一下构造函数很简单就是设定类属性值,还有初始化蛇块列表ArrayList ,然后需要说明的是你得手动生成一个蛇块放到列表里面,否则连个蛇头都没有怎么玩啊。this._blocks.Insert(0, (new Block(Color.Red, this._size, new Point(width / 2, height / 2); 这句话就是在画布的正中央产生一个只有一节的贪吃蛇。至此贪吃蛇的核心代码就算介绍完了贪吃蛇的灵魂已经具有了,怎么让这个贪吃蛇跑起来呢,下面看看主界面是怎么使用这个贪吃蛇的吧8. 主界面的实现名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 15 页 - - - - - - - - - 在主界面的类里面定义个Palette private Palette p; 然后在 page_load里实现初始化贪吃蛇代码很简单吧,呵呵,不多说了看下一个函数FormMain_KeyDown函数,这个函数用于更改贪吃蛇的移动方向,这里设定了wdsa 和上下左右都可以使用,更改移动方向的前提就是新的方向不能和当前方向相反,也即是只能 90 度拐弯,不能180 度拐弯。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 15 页 - - - - - - - - - 最后一个函数是pictureBox1_Paint函数,这个事件在pictureBox1需要重新绘制的时候发生,这里面只要简单调用一下让贪吃蛇重新绘制一下游戏就行了至此,整个贪吃蛇的项目就算结束了,可以看到基本和俄罗斯方块的思路是一样的,不一样的就是功能简单了一点,实现起来难度低了一点,如果这个贪吃蛇的代码完全理解了,估计那个俄罗斯方块也就不在话下了。等你完成了这个丑陋的贪吃蛇以后,你就可以继续丰富一下,美化一下,相信可以达到更好的效果。希望这几篇文章对大家有帮助。http:/ 文章原址。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 15 页 - - - - - - - - -