C语言贪吃蛇游戏的设计与实现.docx
- 文档编号:29137938
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:28
- 大小:460.44KB
C语言贪吃蛇游戏的设计与实现.docx
《C语言贪吃蛇游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《C语言贪吃蛇游戏的设计与实现.docx(28页珍藏版)》请在冰豆网上搜索。
C语言贪吃蛇游戏的设计与实现
摘要
C#是微软公司发布的一种面向对象的、运行于.NETFramework之上的高级程序设计语言。
并定于在微软职业开发者论坛(PDC)上登台亮相。
C#是微软公司研究员AndersHejlsberg的最新成果。
C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。
但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。
“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。
本文基于C#技术和.NETFramework开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。
整个游戏包括开始、暂停、结束、音乐的播放及关数的选择等功能。
通过本游戏的开发,达到学习C#技术和熟悉软件开发流程的目的。
本文在介绍C#相关技术和国内外发展现状的基础上,对“贪吃蛇”游戏的整个生命周期的各个开发阶段进行了详细地介绍。
首先,分析了开发本游戏软件的可行性,重点分析本设计所采用的技术的可行性。
其次,从游戏主界面等几方面,分析了本游戏的功能需求;从可使用性和安全性方面分析了属性需求。
然后,进行了游戏的概要设计和详细设计,这也是本文的重点。
本文还介绍了游戏软件的程序调试过程和功能测试结果。
关键词:
C#;.NETFramework;“贪吃蛇”游戏
第一章 游戏开发环境
1.1开发工具
C#(读做"Csharp")中文译音暂时没有.专业人士一般读"Csharp",现在很多非专业一般读"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难一些。
其设计与现代开发工具的适应性要比其他语言更高,它同时具有VisualBasic的易用性、高性能以及C++的低级内存访问性。
C#包括以下一些特性:
●完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理。
●定义完整、一致的基本类型集。
●对自动生成XML文档说明的内存。
●自动清理动态分配的内存。
●可以用用户定义的特性来标记类或方法
●对.NET基类库的完全访问权,并易于访问WindowsAPI。
●可以使用指针和直接内存访问,但C#语言可以在没有它们的条件下访问内存。
●以VB的风格支持属性和事件。
●改变编译器选项,可以把程序编译为可执行文件或.NET组件库,该组件库可以用与ActiveX控件(COM组件)相同的方式由其他代码调用。
●C#可以用于编写ASP.NET动态Web页面和XMLWeb服务。
1.2应用环境
(1).操作系统:
WindowsNT、WindowsXP、Windows7
(2).应用软件:
MicrosoftVisualStudio2008
第二章 游戏需求分析
2.1需求分析
本游戏用户可以自己练习和娱乐。
本游戏需要满足以下几点要求:
(1)利用方向键“W、A、S、D”来改变蛇的运行方向。
(2)空格键暂停游戏,并在随机的地方产生食物。
(3)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
(4)用户可以根据需要暂停或播放背景音乐,以及根据水平选择不同的游戏难度。
2.2可行性分析
贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。
贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。
没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。
而在吃到食物的时候,则只需把食物入队即可。
实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始及背景音乐的播放。
玩家可以根据自己的水平选择不同的级别进行游戏挑战。
当每个级别的分数达到200后,会提示玩家选择进入下一关进行更高难度的挑战。
第三章 程序概要设计
3.1设计目标
本软件是针对贪吃蛇小游戏的C#程序,利用方向键来改变蛇的运行方向,空格键暂停游戏,并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行,背景音乐可以暂停或播放。
3.2程序功能模块
游戏大体框架如下所示:
图-1 游戏大体框架
第四章 程序详细设计
4.1程序设计
1.游戏启动窗口
此窗口为进入游戏的欢迎界面,在任务栏上不显示图标。
窗口界面截图如下:
图-2 游戏启动窗口
主要功能代码如下:
privatevoid启动窗口_Load(objectsender,EventArgse)
{
//设置启动窗体
this.FormBorderStyle=FormBorderStyle.None;
this.BackgroundImage=Image.FromFile("贪吃蛇.Jpg");
this.timer1.Start();
this.timer1.Interval=1500;
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{
//关闭启动窗体
this.Close();
}
privatevoid启动窗口_FormClosed(objectsender,FormClosedEventArgse)
{
//关闭定时器
this.timer1.Stop();
}
2.游戏主菜单窗口
此窗口为进入游戏与否及获取游戏帮助的界面,选择“帮助”按钮可以获得游戏相关操作的帮助,选择退出可直接退出游戏,选择进入游戏则可以开始游戏。
主菜单窗口和帮助窗口都会在任务栏上显示图标。
窗口界面截图如下:
图-3 主菜单窗口
帮助窗口截图如下:
图-4 帮助窗口
主要功能代码如下:
privatevoidbtnStart_Click(objectsender,EventArgse)
{
MessageBox.Show("游戏即将开始!
");
this.DialogResult=DialogResult.OK;
}
privatevoidbtnExit_Click(objectsender,EventArgse)
{
this.Close();
}
privatevoidbtnHelp_Click(objectsender,EventArgse)
{
varfrm_Help=newfrmHelp();
frm_Help.Show();
}
privatevoidForm2_Load(objectsender,EventArgse)
{
启动窗口myFlash=new启动窗口();
myFlash.ShowDialog();
}
3.游戏主窗口
此窗口为整个程序的主要部分,该窗口包含了游戏开始、暂停、重新开始、停止音乐、退出游戏、难度选择及分数显示等功能。
当进入游戏窗口后,开始按钮就会自动获得聚焦,只要玩家按下回车或点击“开始”按钮就可以开始游戏。
蛇的初始默认为左上角,颜色为蓝色;食物为随机产生,颜色为红色;游戏背景为轻绿色,整个游戏框架按红、蓝、绿三原色设计。
窗口截图如下所示:
图-5 游戏初始窗口
游戏开始后,蛇通过蛇头headPoint获取下一个位置,然后将下一个点绘制成蛇体新蛇头,而同时蛇尾则绘制成游戏框架GameFrame的一部分,从而实现了蛇体不断向前移动的效果。
当蛇遇到食物时,蛇头headPoint与食物foodPoint重合,使其绘制成为新的蛇头,然后又重新随机产生一个食物。
当蛇吃够20个食物时,也就是分数达到200时,游戏会暂停,提示玩家选择下一关进行游戏。
每一关游戏的速度都会按一定的比例递增增加,此功能的实现代码如下:
switch(boBox1.SelectedIndex)
{
case0:
this.timer1.Interval=500;break;
case1:
this.timer1.Interval=400;break;
case2:
this.timer1.Interval=300;break;
case3:
this.timer1.Interval=200;break;
case4:
this.timer1.Interval=100;break;
}
窗口截图如下所示:
图-6 闯关成功窗口
或者如果玩家想重新开始游戏,则点击“重新开始”按钮,此时会弹出一个对话框,要求玩家确认是否重新开始,如果选择“否”,则游戏继续进行,如果选择“是”,则此时游戏的基本框架会自动重新绘制,蛇体回到初始默认状态。
窗口截图如下所示:
图-7 重新开始窗口
当蛇头碰到自身或是碰到墙壁时,则游戏暂停,系统提示玩家是否重新开始游戏。
如果选择“否”,则游戏结束,否则游戏重新开始。
窗口截图如下所示:
图-8 死亡窗口
过程中,玩家可以随时选择游戏的难度进行挑战,当点击难度选择框时,游戏会暂停选择关数后,会弹出一对话框,要求玩家确认是否进入所选难度挑战,如果点击“否”,则游戏继续进行,如果点击“是”,则进入该难度,游戏框架重新绘制,基本和重新开始一样,不同的难度蛇的移动速度会加快。
窗口如下所示:
图-9 选择难度窗口
4.Snake类
成员变量见表:
表1主要成员变量
成员变量描述
变量类型
名称
蛇体
ArrayList
snake
食物
Node
food
方向
int
derection
分数
int
score
时间
bool
timer
死亡判断
bool
Diedif
运动中
bool
play
暂停
bool
pause
左
KeyCode
A
上
KeyCode
W
右
KeyCode
D
下
KeyCode
S
主要功能代码如下:
publicpartialclass游戏窗口:
Form
{
snacksnack1=newsnack(4);//初始化蛇
//食物颜色
privateSystem.Drawing.ColorfoodColor=System.Drawing.Color.Green;
Foodfood=newFood();//初始化食物
boolplay=false;//判断是否进行游戏
boolfoodDraw=false;//记录得分
intscores=0;//得分
boolMusicPlay=false;//播放音乐
//定义播放音乐组件
publicstaticuintSND_ASYNC=0x0001;//playasynchronously
publicstaticuintSND_FILENAME=0x00020000;//nameisfilename
[DllImport("winmm.dll")]
publicstaticexternuintmciSendString(stringlpstrCommand,
stringlpstrReturnString,uintuReturnLength,uinthWndCallback);
public游戏窗口()
{
InitializeComponent();
}
//游戏基本框架
publicvoidDrawGameFrame(Graphicsg)
{
for(inti=0;i for(intj=0;j { g.FillEllipse(Brushes.LightGreen,i,j,10,10); } } //蛇的定义 classsnack { publicPointstartPoint=newPoint(0,0);//初始话开始的坐标 PointaddPoint; publicArrayListsnackPoint=newArrayList(); PointheadPoint; publicPointHeadPoint { get{returnheadPoint;} set{headPoint=value;} } intdirection=1;//初始方向向右 publicintDirection { get{returndirection;} set{direction=value;} } //蛇的构造器 publicsnack(intlenth) { for(inti=0;i { snackPoint.Add(startPoint); if(i==lenth-1) { HeadPoint=startPoint; return; } startPoint=newPoint(startPoint.X+10,startPoint.Y); } } //画蛇函数 publicvoidDrawSnack(Graphicsg) { for(inti=0;i { g.FillEllipse(Brushes.Blue,((Point)snackPoint[i]).X,((Point)snackPoint[i]).Y,10,10); } } //添加一节蛇 publicvoidAddsnack() { if(direction==1) addPoint=newPoint(headPoint.X+10,headPoint.Y); elseif(direction==2) addPoint=newPoint(headPoint.X-10,headPoint.Y); elseif(direction==3) addPoint=newPoint(headPoint.X,headPoint.Y-10); elseif(direction==4) addPoint=newPoint(headPoint.X,headPoint.Y+10); snackPoint.Add(addPoint); headPoint=addPoint; } //减少一节蛇 publicvoidRemoveSnackNode() { snackPoint.RemoveAt(0); } //蛇移动函数 publicvoidSnackMoce(Graphicsg)//蛇的移动函数主要通过在蛇头部多加一点, {//在蛇尾部删除一点,从而实现蛇移动的效果 DrawSnack(g); RemoveSnackNode(); } //判断死亡 publicboolDiedif() { for(inti=0;i { if((Point)snackPoint[i]==headPoint) returntrue; }//判断是否咬到自己 if(headPoint.X<0||headPoint.X>390||headPoint.Y<0||headPoint.Y>370) returntrue;//判断是否撞到墙 returnfalse; } } //食物的定义 classFood { PointfoodPoint=newPoint(100,200); //食物坐标的构造器 publicPointFoodPoint { get{returnfoodPoint;} set{foodPoint=value;} } //构建随机的食物点 publicvoidGetFoodPoint() {//随机产生食物 Randomrandom=newRandom(); intx=random.Next(1,38)*10; inty=random.Next(2,36)*10; foodPoint=newPoint(x,y); } //画出食物 publicvoidDrawFood(Graphicsg) { g.FillEllipse(Brushes.Red,foodPoint.X,foodPoint.Y,10,10); } } //游戏 privatevoidpictureBox1_Paint(objectsender,PaintEventArgse) { Graphicsg=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(); } } privatevoidtimer1_Tick(objectsender,EventArgse) { 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(@"closetemp_alias",null,0,0); mciSendString(@"""aliastemp_alias",null,0,0); mciSendString("playtemp_aliasrepeat",null,0,0); scores=0; snack1=newsnack(4); this.Refresh(); this.timer1.Interval=500; boBox1.Text=" 第一关"; } else { MessageBox.Show("游戏结束! "); snack1.snackPoint.Clear(); this.Refresh(); } } this.Refresh(); } privatevoidForm1_Load(objectsender,EventArgse) { this.FormBorderStyle=FormBorderStyle.FixedDialog; this.txtScores.Clear(); this.txtScores.Text=scores.ToString("0"); } //方向控制 privatevoidbtnBegin_KeyUp(objectsender,KeyEventArgse) { if(e.KeyCode==Keys.A&&snack1.Direction! =1) snack1.Direction=2; elseif(e.KeyCode==Keys.D&&snack1.Direction! =2) snack1.Direction=1; elseif(e.KeyCode==Keys.W&&snack1.Direction! =4) snack1.Direction=3; elseif(e.KeyCode==Keys.S&&snack1.Direction! =3) snack1.Direction
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 贪吃 游戏 设计 实现