c#贪吃蛇实现完整流程.docx
- 文档编号:12278083
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:11
- 大小:320.69KB
c#贪吃蛇实现完整流程.docx
《c#贪吃蛇实现完整流程.docx》由会员分享,可在线阅读,更多相关《c#贪吃蛇实现完整流程.docx(11页珍藏版)》请在冰豆网上搜索。
c#贪吃蛇实现完整流程
之杨若古兰创作
比来老有人问我那个俄罗斯方块游戏的代码,解释了半天,觉得麻烦,干脆再做一个更简单的小游戏,贪吃蛇,和俄罗斯方块是一样的思路,只不过游戏绝对俄罗斯方块来说简单了很多,把这个小游戏给大伙讲一下,但愿对一些C#的初学者有帮忙.游戏很简单,通过WASD或上下摆布几个按键控制贪吃蛇的前进方向,这个估计全世界都晓得,先看一下流戏运转后果吧
其中黑色的事物,红色是贪吃蛇,因为考虑到越简单越好,就没有寻求过多的美化和润色
看一下程序结构吧
程序结构很简单,一个Form,两个Class
FormMain是程序主界面,里面就一个PictureBox控件
Block类是“蛇块”类,我不晓得怎样换个词来描述,这个类就是用于描述蛇身子一节一节的信息,从运转后果图上可以看到就是那一个一个小方块的信息,等价于俄罗斯方块里的砖块信息类
Palette类就是主画布,是游戏的次要代码,和俄罗斯方块里的画布是一样的感化.
从结构上可以看出,全部工程很简单,应当还算比较好理解吧.
下一篇给大伙从头到尾的把全部工程重现一遍.呵呵,如果是高手的话,请勿见笑,初学者的话大可以“拿来主义”一下.
上一篇我们简单介绍了一下程序结构,接上去我们从头到尾把全部游戏重现一下
1.新建一个Windows利用程序,起名Snake吧
2.重命名Form1,改为FormMain.这是我的个人偏好,不改也行.
3.从工具栏里拖放一个picturebox到FormMain上面,设置属性
picturebox1的BorderStyle属性选择为FixedSingle,如许能显示边框
FormMain的KeyPreview属性设定为True,如许全部窗体可以呼应键盘按键事件,这个在俄罗斯方块那个里面讲过了
设定完当前大概应当是全部模样
须要弥补一下的是,这里面form的大小和picturebox的大小是不必刻意设置的,因为我们程序里面会根据设定贪吃蛇的大小和贪吃蛇的活动空间主动变大变小的,所以大致是全部模样就行了.
4.添加pictureBox1和FormMain的事件,添加的事件有
picturesBox1的Paint事件pictureBox1_Paint
FormMain的KeyDown事件FormMain_KeyDown
FormMain的Load事件FormMain_Load
至于这三个事件是干什么用的,估计大家大致也能猜的到,pictureBox1_Paint用于更新游戏画面,FormMain_KeyDown用于呼利用户按键,FormMain_Load用于做一些初始化的工作
添加完成当前代码里应当是这个模样吧
Block类和Palette类
Block类用于描述蛇块信息,记录每个蛇块的坐标,色彩,和大小这些信息,具体代码如下
这个类比较简单,Pointp用于记录该蛇块的“坐标”,留意这里的坐标不是真实的坐标,因为蛇块是一个块,不是一个点,这里记录的是这个块的坐标,比方,如果是Point(3,2),那么就是暗示第四列,第三行的那个块
Paint函数根据坐标和蛇块大小计算出实际绘图的坐标,进行绘图,蛇块是一个正方形(矩形),我们用矩形绘制,在代码中我们看到,绘制的大小比size小1个像素,这么做的缘由是为了突出蛇块与蛇块之间的间隙,也就是说蛇块与蛇块之间有1个像素的间隙,这就是我们看到游戏后果图中的蛇块是一段一段的缘由
Palette类是端的游戏的核心处理类,里面定义了画布的大小,布景色,蛇块列表和游戏速度,挪动方向等属性
另外还提供了timer计时器,用于定时更新蛇块坐标地位,和如何在画面上画图的函数,全部代码如下
从函数定义中我们可以大致了解一下这个类的功能和实现方法了,类的属性定义就不再细说了,这些都是很明显的,接上去我们一步一步介绍各个函数的实现
7.1Start函数
Start函数用于开始游戏,这个函数的内部其实就是设定食物,和触发计时器.代码片段如下:
这里面定义了计时器的事件触发间隔,是通过level然后找到speed数组里的对应毫秒值设定的.
然后触发事件是OnBlockTimedEvent,这个函数后面再讲.
最初是启动计时器开始计时.
7.2OnBlockTimedEvent函数
OnBlockTimedEvent函数是计时器的履行函数,这个函数用于更新蛇块信息列表,和检测游戏是否结束等等,代码片段如下
可以看到,函数内部调用了两个函数,一个是Move函数,一个是CheckDead函数,从字面意思上我们就可以看出来是怎样个流程了.
7.3CheckDead函数
checkDead函数用于检测游戏是否结束,具体检查规则如下
检测是否结束分两种情况,一种是撞上鸿沟,即蛇头坐标超出画布范围,一种是蛇头撞上了蛇身,也就是蛇头的坐标和蛇身的某个坐标重合,通过for轮回来检查第二种情况
7.4Move函数
Move函数用于更新全部蛇块的坐标,我们前面通过将蛇块信息放到ArrayList里来暗示贪吃蛇的全部信息,其中根据下标从0到Count-1顺次暗示各个蛇块的信息,比方说,ArrayList里此刻顺次是
_blocks[0]:
Point(5,2)
_blocks[1]:
Point(4,2)
_blocks[2]:
Point(3,2)
此时蛇块的外形如下
假设此刻蛇块的挪动方向是向右,那么下一刻挪动当前的形态应当是如许
_blocks[0]:
Point(6,2)
_blocks[1]:
Point(5,2)
_blocks[2]:
Point(4,2)
也就是
和上图比拟,我们会发现其实就是蛇头酿成了一个新的蛇头了,本来的舌头酿成是蛇身,本来的蛇尾没有了,改成蛇尾前一个蛇块了,所以通过这个分析我们可以得到如何挪动的解决方案,就是在ArrayList的0下标处拔出一个新的蛇块(蛇头),然后把本来最初一个(Count-1)的那个蛇块(蛇尾)去掉.代码实现片段如下
实际代码中添加了吃食物的情况判断,也就是说如果新蛇头的坐标和食物的坐标分歧,那么就不做删除原蛇尾的操纵了,如许发生的后果就是蛇块列表的长度添加了一个,达到吃食物变长的后果,信任很好理解,我就不再作图了.
7.5GetFood函数
GetFood函数用于生成下一个食物,其实就是一个蛇块,生成的规则就是,坐标要在画布范围内,而且食物的坐标不克不及和贪吃蛇的坐标重合,具体代码如下
通过for轮回检查食物坐标是否和贪吃蛇的蛇块列表ArrayList里的蛇块有冲突,很容易理解,就不多说了
7.6PaintPalette函数
PaintPalette函数须要一个参数,也就是绘图句柄,然后在这个画布上画图也就是我们看到的游戏后果
首先用布景色清空画布,然后画食物,其次是通过for轮回将贪吃蛇的每个蛇块画在画布上,以此达到游戏后果.
7.7构造函数
呵呵,这个函数我觉得没东西,回头看看,这个函数里面有一句话很次要,得说明一下
构造函数很简单就是设定类属性值,还有初始化蛇块列表ArrayList,然后须要说明的是你得手动生成一个蛇块放到列内里面,否则连个蛇头都没有怎样玩啊.
this._blocks.Insert(0,(newBlock(Color.Red,this._size,newPoint(width/2,height/2))));
这句话就是在画布的正地方发生一个只要一节的贪吃蛇.
至此贪吃蛇的核心代码就算介绍完了
贪吃蛇的灵魂曾经具有了,怎样让这个贪吃蛇跑起来呢,上面看看主界面是怎样使用这个贪吃蛇的吧
8.主界面的实现
在主界面的类里面定义个Palette
privatePalettep;
然后在page_load里实现初始化贪吃蛇
代码很简单吧,呵呵,不多说了
看下一个函数FormMain_KeyDown函数,这个函数用于更改贪吃蛇的挪动方向,这里设定了wdsa和上下摆布都可以使用,更改挪动方向的前提就是新的方向不克不及和当前方向相反,也即是只能90度拐弯,不克不及180度拐弯.
最初一个函数是pictureBox1_Paint函数,这个事件在pictureBox1须要从头绘制的时候发生,这里面只需简单调用一下让贪吃蛇从头绘制一下流戏就行了
至此,全部贪吃蛇的项目就算结束了,可以看到基本和俄罗斯方块的思路是一样的,纷歧样的就是功能简单了一点,实现起来难度低了一点,如果这个贪吃蛇的代码完整理解了,估计那个俄罗斯方块也就不在话下了.等你完成了这个丑陋的贪吃蛇当前,你就可以继续丰富一下,美化一下,信任可以达到更好的后果.
但愿这几篇文章对大家有帮忙.
文章旧址.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c# 贪吃 实现 完整 流程