- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章 贪吃蛇游戏的编制
贪吃蛇游戏和俄罗斯方块游戏一样风靡全球,而且原理基本相似,是游戏编程人员入门学习的首选。
4.1 程序概述
4.1.1 游戏的功能
游戏贪吃蛇就是在屏幕上画出蛇,同时随机地给出食物。游戏者通过键盘操作控制贪吃蛇的移动,去吃食物,吃到后食物消失,然后再随机给出食物同时蛇的身体增长,分数相应增加,当蛇碰撞到墙壁时或自身身体时就死亡。画蛇的原理就是利用人眼的视觉效应先将蛇头向前移动一格,然后所有蛇身依次向前移动一格。
4.1.2 游戏的预览
游戏运行的主操作界面如图4-1所示。
图4-1主操作界面
在菜单栏中【游戏设置】中可以选择【颜色设置】,可以设置蛇体和食物的颜色,颜色设置界面如图4-2所示。
图4-2颜色选择界面
在菜单栏中【游戏设置】中的【难度选择】中,可以选择游戏的难度,共分四个级别:菜鸟、大鸟、老鸟和自虐。
4.2 游戏的概要设计
4.2.1游戏实现方案
贪吃蛇的核心算法时如何实现移动和吃掉食物。没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色重绘这个节点。然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。
4.2.2游戏逻辑设计
蛇身由若干基本单元组成,这些单元存放在一个Queue结构中,表示对象的先进先出集合。Snake类里面主要包含Add(添加新对象),Clear(清除对象),Slither(蛇身移动), PointOnSnake(判断某点是否在蛇身内部)几个方法。
移动控制模块定义了蛇头的坐标,移动的方向等信息,并且判断下一步移动的点的坐标。
主窗体实现游戏的核心是通过窗体接受键盘的按键来设置蛇身的移动方向,和判断是否吃到食物是否游戏结束等逻辑处理,并实时更新游戏的画面。
4.3 游戏的详细设计及编码
在游戏的概要设计中,已解决了实现该游戏需要的方案和设计问题。本节将介绍系统的详细设计。在游戏的详细设计中,将确定如何具体的实现该游戏,从而在编码阶段可以把这个描述直接翻译成用具体的程序语言书写的程序。
4.3.1主界面设计编码
主界面的作用就是显示本游戏所有的功能菜单项,提供游戏的显示界面。在本界面中共设计了4种控件,通过这些控件玩家可以方便的控制游戏,各个控件的名称、作用和类型如表4-1所示。
表4-1主界面的控件设计
控件类型 控件名称 作用 mainMenu menuItem2 蛇体颜色设置 menuItem3 食物颜色设置 menuItem4 游戏难度设置 menuItem6 游戏控制说明 menuExit 退出 panel Panel1 显示游戏界面 textBox textBox1 显示手速 Button Button1 开始 【开始】按钮的事件调用画蛇的函数,开始游戏,并把各控件置于非操作状态。主要代码如例程4-1所示。
例程4-1【开始】按钮事件代码
private void button1_Click(object sender, System.EventArgs e)
{
//屏蔽游戏菜单
this.menuItem1.Enabled = false;
this.menuItem5.Enabled = false;
//画蛇
this.snake.DrawSnake();
game = new Thread(new ThreadStart(StartGame));
game.Start();
this.DrawSnake();
this.button1.Enabled = false;
this.Focus();
}
private void DrawSnake()
{
lock(this)
{
foreach(Label temp in snake.GetSnake())
{
this.panel1.Controls.Add(temp);
}
}
}
//开始游戏
private void StartGame()
{
drawDelegate = new DrawDele(PutFood);
this.Invoke(drawDelegate,null);
while(true)
{
Thread.Sleep(speed);
if(this.IsGameOver())
{
MessageBox.Show(GAME OVER);
try
{
this.game.Abort();
}
文档评论(0)