C语言贪吃蛇游戏的设计与实现.doc_第1页
C语言贪吃蛇游戏的设计与实现.doc_第2页
C语言贪吃蛇游戏的设计与实现.doc_第3页
C语言贪吃蛇游戏的设计与实现.doc_第4页
C语言贪吃蛇游戏的设计与实现.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c#.贪吃蛇游戏设计课题名称: 贪吃蛇游戏的设计与实现 院 (系): 专 业: 计算机科学与技术 学生姓名: 学 号: 指导教师: 2010年6月摘 要c#是微软公司发布的一种面向对象的、运行于.net framework之上的高级程序设计语言。并定于在微软职业开发者论坛(pdc)上登台亮相。c#是微软公司研究员anders hejlsberg的最新成果。c#看起来与java有着惊人的相似;它包括了诸如单一继承、接口、与java几乎同样的语法和编译成中间代码再运行的过程。但是c#与java有着明显的不同,它借鉴了delphi的一个特点,与com(组件对象模型)是直接集成的,而且它是微软公司.net windows网络框架的主角。“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于c#技术和.net framework开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏包括开始、暂停、结束、音乐的播放及关数的选择等功能。通过本游戏的开发,达到学习c#技术和熟悉软件开发流程的目的。本文在介绍c#相关技术和国内外发展现状的基础上,对“贪吃蛇”游戏的整个生命周期的各个开发阶段进行了详细地介绍。首先,分析了开发本游戏软件的可行性,重点分析本设计所采用的技术的可行性。其次,从游戏主界面等几方面,分析了本游戏的功能需求;从可使用性和安全性方面分析了属性需求。然后,进行了游戏的概要设计和详细设计,这也是本文的重点。本文还介绍了游戏软件的程序调试过程和功能测试结果。关键词:c#;.net framework;“贪吃蛇”游戏目 录第一章游戏开发环境11.1 开发工具11.2 应用环境2第二章游戏需求分析22.1 需求分析22.2 可行性分析2第三章程序概要设计23.1 设计目标23.2 程序功能模块3第四章程序详细设计44.1 程序设计4第五章游戏测试205.1 测试的意义205.2 测试过程205.3 测试结果20参考文献213第一章游戏开发环境1.1 开发工具 c#(读做 c sharp)中文译音暂时没有.专业人士一般读c sharp,现在很多非专业一般读c井。c#是一种安全的、稳定的、简单的、优雅的,由c和c+衍生出来的面向对象的编程语言。它在继承c和c+强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。c#综合了vb简单的可视化操作和c+的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.net开发的首选语言。并且c#成为ecma与iso标准规范。c#看似基于c+写成,但又融入其它语言如pascal、java、vb等。microsoft在正式的场合把c#描述为一种简单、现代、面向对象、类型非常安全、派生于c和c+的编程语言。大多数独立的评论员对其说法是“派生于c、c+和java”。这种描述在技术上是非常准确的,但没有涉及到该语言的真正有点。从语法上看,c#非常类似于c和java,许多关键字都是相同的,c#也使用类似于c和c+的块结构,并用括号()来标识代码块,用分号分隔各行语句。对c#代码的第一印象是它非常类似于c和java代码。但在这些表面上的类似性后面,c#学习起来要比c+容易得多,但比java难一些。其设计与现代开发工具的适应性要比其他语言更高,它同时具有visual basic的易用性、高性能以及c+的低级内存访问性。#包括以下一些特性:l 完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理。l 定义完整、一致的基本类型集。l 对自动生成xml文档说明的内存。l 自动清理动态分配的内存。l 可以用用户定义的特性来标记类或方法l 对.net基类库的完全访问权,并易于访问windows api。l 可以使用指针和直接内存访问,但c#语言可以在没有它们的条件下访问内存。l 以vb的风格支持属性和事件。l 改变编译器选项,可以把程序编译为可执行文件或.net组件库,该组件库可以用与activex控件(com组件)相同的方式由其他代码调用。l c#可以用于编写asp.net动态web页面和xml web服务。1.2 应用环境(1)操作系统:windows nt、windows xp、windows 7(2). 应用软件:microsoft visual studio 2008 第二章游戏需求分析2.1 需求分析本游戏用户可以自己练习和娱乐。本游戏需要满足以下几点要求:(1) 利用方向键“w、a、s、d”来改变蛇的运行方向。 (2) 空格键暂停游戏,并在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。(4) 用户可以根据需要暂停或播放背景音乐,以及根据水平选择不同的游戏难度。2.2 可行性分析贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始及背景音乐的播放。玩家可以根据自己的水平选择不同的级别进行游戏挑战。当每个级别的分数达到200后,会提示玩家选择进入下一关进行更高难度的挑战。第三章程序概要设计3.1 设计目标本软件是针对贪吃蛇小游戏的c#程序,利用方向键来改变蛇的运行方向,空格键暂停游戏,并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行,背景音乐可以暂停或播放。3.2 程序功能模块游戏大体框架如下所示:键盘控制蛇运动蛇吃食物吃一个加分,当分数达到时,提示进入下一关开始暂停蛇开始运动蛇暂停运动游戏启动界面游戏主菜单游戏窗口结束重新开始显示重新绘制蛇显示分数结束游戏动下一关进入下一关图1游戏大体框架第四章程序详细设计4.1 程序设计1.游戏启动窗口 此窗口为进入游戏的欢迎界面,在任务栏上不显示图标。窗口界面截图如下:图游戏启动窗口主要功能代码如下:private void 启动窗口_load(object sender, eventargs e) /设置启动窗体 this.formborderstyle = formborderstyle.none; this.backgroundimage = image.fromfile(贪吃蛇.jpg); this.timer1.start(); this.timer1.interval = 1500; private void timer1_tick(object sender, eventargs e) /关闭启动窗体 this.close(); private void 启动窗口_formclosed(object sender, formclosedeventargs e) /关闭定时器 this.timer1.stop();.游戏主菜单窗口此窗口为进入游戏与否及获取游戏帮助的界面,选择“帮助”按钮可以获得游戏相关操作的帮助,选择退出可直接退出游戏,选择进入游戏则可以开始游戏。主菜单窗口和帮助窗口都会在任务栏上显示图标。窗口界面截图如下:图主菜单窗口帮助窗口截图如下:图帮助窗口主要功能代码如下:private void btnstart_click(object sender, eventargs e)messagebox.show(游戏即将开始!); this.dialogresult = dialogresult.ok; private void btnexit_click(object sender, eventargs e) this.close(); private void btnhelp_click(object sender, eventargs e) var frm_help = new frmhelp(); frm_help.show(); private void form2_load(object sender, eventargs e) 启动窗口 myflash = new 启动窗口(); myflash.showdialog(); .游戏主窗口此窗口为整个程序的主要部分,该窗口包含了游戏开始、暂停、重新开始、停止音乐、退出游戏、难度选择及分数显示等功能。当进入游戏窗口后,开始按钮就会自动获得聚焦,只要玩家按下回车或点击“开始”按钮就可以开始游戏。蛇的初始默认为左上角,颜色为蓝色;食物为随机产生,颜色为红色;游戏背景为轻绿色,整个游戏框架按红、蓝、绿三原色设计。窗口截图如下所示:图游戏初始窗口游戏开始后,蛇通过蛇头headpoint获取下一个位置,然后将下一个点绘制成蛇体新蛇头,而同时蛇尾则绘制成游戏框架gameframe的一部分,从而实现了蛇体不断向前移动的效果。当蛇遇到食物时,蛇头headpoint与食物foodpoint重合,使其绘制成为新的蛇头,然后又重新随机产生一个食物。当蛇吃够20个食物时,也就是分数达到200时,游戏会暂停,提示玩家选择下一关进行游戏。每一关游戏的速度都会按一定的比例递增增加,此功能的实现代码如下: switch (bobox1.selectedindex) case 0: this.timer1.interval = 500; break; case 1: this.timer1.interval = 400; break; case 2: this.timer1.interval = 300; break; case 3: this.timer1.interval = 200; break; case 4: this.timer1.interval = 100; break; 窗口截图如下所示:图闯关成功窗口或者如果玩家想重新开始游戏,则点击“重新开始”按钮,此时会弹出一个对话框,要求玩家确认是否重新开始,如果选择“否”,则游戏继续进行,如果选择“是”,则此时游戏的基本框架会自动重新绘制,蛇体回到初始默认状态。窗口截图如下所示:图重新开始窗口当蛇头碰到自身或是碰到墙壁时,则游戏暂停,系统提示玩家是否重新开始游戏。如果选择“否”,则游戏结束,否则游戏重新开始。窗口截图如下所示:图死亡窗口过程中,玩家可以随时选择游戏的难度进行挑战,当点击难度选择框时,游戏会暂停选择关数后,会弹出一对话框,要求玩家确认是否进入所选难度挑战,如果点击“否”,则游戏继续进行,如果点击“是”,则进入该难度,游戏框架重新绘制,基本和重新开始一样,不同的难度蛇的移动速度会加快。窗口如下所示:图选择难度窗口snake类 成员变量见表:表 主要成员变量成员变量描述变量类型名称蛇体arraylistsnake食物nodefood方向intderection分数intscore时间booltimer死亡判断booldiedif运动中boolplay暂停boolpause左keycodea上keycodew右keycoded下keycodes 主要功能代码如下:public partial class 游戏窗口 : form snack snack1 = new snack(4); /初始化蛇 /食物颜色 private system.drawing.color foodcolor = system.drawing.color.green ; food food = new food(); /初始化食物 bool play = false; /判断是否进行游戏 bool fooddraw = false; /记录得分 int scores = 0; /得分 bool musicplay = false; /播放音乐 /定义播放音乐组件 public static uint snd_async = 0x0001; / play asynchronously public static uint snd_filename = 0x00020000; / name is file name dllimport(winmm.dll) public static extern uint mcisendstring(string lpstrcommand, string lpstrreturnstring, uint ureturnlength, uint hwndcallback); public 游戏窗口() initializecomponent(); /游戏基本框架 public void drawgameframe(graphics g) for(int i=0;ithis.picturebox1.width;i+=10) for (int j = 0; j this.picturebox1.height; j += 10) g.fillellipse(brushes.lightgreen, i, j, 10,10); /蛇的定义 class snack public point startpoint = new point(0, 0);/初始话开始的坐标 point addpoint; public arraylist snackpoint = new arraylist(); point headpoint; public point headpoint get return headpoint; set headpoint = value; int direction = 1; /初始方向向右 public int direction get return direction; set direction = value; /蛇的构造器 public snack(int lenth) for (int i = 0; i lenth; i+) snackpoint.add(startpoint); if (i = lenth - 1) headpoint = startpoint; return; startpoint = new point(startpoint.x + 10, startpoint.y); /画蛇函数 public void drawsnack(graphics g) for (int i = 0; i snackpoint.count; i+) g.fillellipse(brushes.blue, (point)snackpointi).x, (point)snackpointi).y, 10, 10); /添加一节蛇 public void addsnack() if (direction = 1) addpoint = new point(headpoint.x + 10, headpoint.y); else if (direction = 2) addpoint = new point(headpoint.x - 10, headpoint.y); else if (direction = 3) addpoint = new point(headpoint.x, headpoint.y - 10); else if (direction = 4) addpoint = new point(headpoint.x, headpoint.y + 10); snackpoint.add(addpoint); headpoint = addpoint; /减少一节蛇 public void removesnacknode() snackpoint.removeat(0); /蛇移动函数 public void snackmoce(graphics g) / 蛇的移动函数主要通过在蛇头部多加一点, / 在蛇尾部删除一点,从而实现蛇移动的效果 drawsnack(g); removesnacknode(); /判断死亡 public bool diedif() for (int i = 0; i snackpoint.count - 1; i+) if (point)snackpointi = headpoint) return true; /判断是否咬到自己 if (headpoint.x 390 | headpoint.y 370) return true; /判断是否撞到墙 return false; /食物的定义 class food point foodpoint = new point(100, 200); /食物坐标的构造器 public point foodpoint get return foodpoint; set foodpoint = value; /构建随机的食物点 public void getfoodpoint() /随机产生食物 random random = new random(); int x = random.next(1, 38) * 10; int y = random.next(2, 36) * 10; foodpoint = new point(x, y); /画出食物 public void drawfood(graphics g) g.fillellipse(brushes.red, foodpoint.x, foodpoint.y, 10, 10); /游戏 private void picturebox1_paint(object sender, painteventargs e) graphics g = e.graphics; drawgameframe(e.graphics); /画出游戏轮廓 snack1.drawsnack(e.graphics); /画出蛇 if (fooddraw = false) food.getfoodpoint(); fooddraw = true; food.drawfood(e.graphics); /画出食物 if (play) snack1.snackmoce(e.graphics); this.txtscores.text = scores.tostring(0); if (this.timer1.enabled = true) this.btnbegin.focus(); private void timer1_tick(object sender, eventargs e) if (play) snack1.addsnack(); if (snack1.headpoint = food.foodpoint) scores += 10; fooddraw = false; snack1.addsnack(); /每吃一个食物,速度就会加快 / timer1.interval -= 5; if (snack1.diedif() timer1.enabled = false; play = false; musicplay = false; if (dialogresult.yes = messagebox.show(您已经死亡,是否重新开始游戏?, , messageboxbuttons.yesno, messageboxicon.information) mcisendstring(close temp_alias, null, 0, 0); mcisendstring( alias temp_alias, null, 0, 0); mcisendstring(play temp_alias repeat, null, 0, 0); scores = 0; snack1 = new snack(4); this.refresh(); this.timer1.interval = 500; bobox1.text = 第一关; else messagebox.show(游戏结束!); snack1.snackpoint.clear(); this.refresh(); this.refresh(); private void form1_load(object sender, eventargs e) this.formborderstyle = formborderstyle.fixeddialog; this.txtscores.clear(); this.txtscores.text = scores.tostring(0); /方向控制 private void btnbegin_keyup(object sender, keyeventargs e) if (e.keycode = keys.a & snack1.direction != 1) snack1.direction = 2; else if (e.keycode = keys.d & snack1.direction != 2) snack1.direction = 1; else if (e.keycode = keys.w & snack1.direction != 4) snack1.direction = 3; else if (e.keycode = keys.s & snack1.direction != 3) snack1.direction = 4; else if (e.keycode = keys.space) this.btnpause.focus(); this.musicplay = false; if (this.timer1.enabled =!false) this.btnbegin.focus(); this.play = false; this.timer1.enabled = false; this.musicplay = false; mcisendstring(close temp_alias, null, 0, 0); mcisendstring( , null, 0, 0); mcisendstring(play temp_alias repeat, null, 0, 0); private void 游戏窗口_load(object sender, eventargs e) this.formborderstyle = formborderstyle.fixeddialog; this.txtscores.clear(); this.txtscores.text = scores.tostring(0); /开始游戏 private void btnbegin_click_1(object sender, eventargs e) play = true; this.timer1.enabled = true; musicplay = true; mcisendstring(close temp_alias, null, 0, 0); mcisendstring(open 甩葱歌.mp3 alias temp_alias, null, 0, 0); mcisendstring(play temp_alias repeat, null, 0, 0); /暂停 private void btnpause_click_1(object sender, eventargs e) this.timer1.enabled = false; play = false; musicplay = false; mcisendstring(close temp_alias, null, 0, 0); mcisendstring( , null, 0, 0); mcisendstring(play temp_alias repeat, null, 0, 0); /重新开始游戏 private void btnreplay_click_1(object sender, eventargs e) this.timer1.enabled = false; if (dialogresult.yes = messagebox.show(确定要重新开始吗?, xx, messageboxbuttons.yesno, messageboxicon.information) /选择重新开始游戏 mcisendstring(close temp_alias, null, 0, 0); mcisendstring( , null, 0, 0); mcisendstring(play temp_alias repeat, null, 0, 0); snack1 = new snack(5); this.refresh(); this.timer1.interval = 500; this.txtscores.text = scores.tostring(0); scores = 0; bobox1.text = 第一关; else this.timer1.enabled = true; /停止播放音乐 private void button1_click_1(object sender, eventargs e) mcisendstring(close temp_alias, null, 0, 0); mcisendstring( alias temp_alias, null, 0, 0); mcisendstring(play temp_alias repeat, null, 0, 0); /退出游戏 private void button2_click_1(object sender, eventargs e) this.close(); /难度选择 private void combobox1_selectedindexchanged(object sender, eventargs e) /游戏难度共有关 switch (bobox1.selectedindex) case 0: this.timer1.interval = 500; break; case 1: this.timer1.interval = 400; break; case 2: this.timer1.interval = 300; break; case 3: this.timer1.interval = 200; break; case 4: this.timer1.interval = 100; break; /进入下一关 this.timer1.enabled = false; if (dialogresult.yes = messagebox.show(确定要进入下一关吗?, xx, messageboxbuttons.yesno, messageboxicon.information) mcisendstring(close temp_alias, null, 0, 0); mcisendstring( , null, 0, 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论