C#贪吃蛇游戏课程设计实验报告.docx

上传人:b****5 文档编号:12596306 上传时间:2023-04-20 格式:DOCX 页数:35 大小:601.75KB
下载 相关 举报
C#贪吃蛇游戏课程设计实验报告.docx_第1页
第1页 / 共35页
C#贪吃蛇游戏课程设计实验报告.docx_第2页
第2页 / 共35页
C#贪吃蛇游戏课程设计实验报告.docx_第3页
第3页 / 共35页
C#贪吃蛇游戏课程设计实验报告.docx_第4页
第4页 / 共35页
C#贪吃蛇游戏课程设计实验报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

C#贪吃蛇游戏课程设计实验报告.docx

《C#贪吃蛇游戏课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《C#贪吃蛇游戏课程设计实验报告.docx(35页珍藏版)》请在冰豆网上搜索。

C#贪吃蛇游戏课程设计实验报告.docx

C#贪吃蛇游戏课程设计实验报告

一、概述

1、用C#实现该设计的方法

首先应该了解设计要求,然后按照功能设计出实际模块,每个模块都要完成特定的功能,要实现模块间的高内聚,低耦合。

设计模块是一个相当重要的环节,模块的数量不宜太多,也不宜太少,要是每个模块都能比较简单的转换成流程图。

模块设计完成后,就该给每个模块绘制流程图。

流程图要尽可能的简单且容易理解,多使用中文,补一些过长的代码,增加理解难度。

此外,流程图应容易转换成代码。

根据流程图编写好代码后在WindowsXP操作系统,VS.NET2008开发环境下进行运行测试,检查错误,最终设计出可行的程序。

2、贪吃蛇游戏说明

游戏操作要尽可能的简单,界面要尽可能的美观。

编写程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜欢的游戏:

一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计10分;接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁、障碍物或身体交叉(蛇头撞到自己的身体),则游戏结束。

游戏结束时输出相应得分。

具体要求有以下几点:

 

(1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;

(2)系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;

(3)说明书、流程图要清楚;

二、实验目的及设计要求

1、实验目的

.NET课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对VC#.NET技术的理解和掌握;

提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质;

培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新月异的发展形势;

本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,做出设计报告。

2、实验要求

利用MicrosoftVisualStudio2008平台设计制作一个贪吃蛇小游戏,要求如下:

(1)能够记录游戏成绩(计分按照每吃一块食物增加20累计)

(2)可以暂停/继续游戏(通过按钮实现)

(3)蛇的身体能够随着吃到食物的数量逐渐变长

(4)可以自己添加障碍物,要求设计成红色墙壁

(5)积分每增加50分要求蛇相应的加快速度

(6)要求在游戏的过程中添加背景音乐和随机炸弹

三、课程设计具体实现

1、概要设计

1.1、设计思想

程序关键在于表示蛇的图形及蛇的移动。

用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头(绿色)用三节表示。

移动时必须从蛇头开始,所以蛇不可以向相反的方向移动,如果不按任意键,蛇自行在当前方向右前移,但按下有效方向键后,蛇头朝该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后节用背景色覆盖。

食物的出现与消失也是画矩形块和覆盖矩形块。

为了便于理解,定义两个结构体:

食物与蛇,同时还定义了一个随意的墙。

然后利用图形驱动,,制作美观的游戏界面,通过随机函数产生随机的食物,控制游戏过程食物的出现。

定义键盘操作控制游戏过程蛇的移动方向,画出边界,并判断游戏是否结束,统计游戏过程中蛇吃的食物数量,计算并输出游戏成绩。

1.2、主模块实现

1.snake的设计模块

2.Form的设计模块

1.3、主函数流程图

2、详细设计

2.1、设计思想

首先进入VS2008打开文件新建一个项目,点击windows窗体应用程序,名字设为Snakes。

进入Form的设计界面,首先我们都知道游戏最基本的功能有开始,暂停,继续,退出,所以首先要先加4个button键来控制游戏,再加一个TextBox文本框来显示成绩。

在窗体中加入Panel来实现贪吃蛇的运动空间,设置有一个游戏的界面运动空间。

之后就要定义一个sakes类,来实现蛇的一些属性与方法,首先明白这个游戏实现的是贪吃蛇吃食物,所以还需要定义食物,食物被吃后要实现食物的重建。

玩游戏时还需要有控制键的设置,这一模块可以选用Switch语句来实现。

实现基本的功能后要注意怎样的情况会造成蛇的死亡,可以想到的有越界线,咬到自己都会死亡。

随着思想的成熟,觉得只吃食物好像太简单,所以在这个贪吃蛇游戏的基础上又设置了一些障碍,加了几堵墙,还设置了随机的炸弹,这样游戏就更有意思了,加上以前玩俄罗斯方块的一些感觉,还设置了游戏的不断加速的模块。

2.2、具体模块实现:

1、snake属性定义

2、Form属性定义

3、创建蛇的模块

创建蛇的模块和创建障碍物的思路想法是一致的,都是通过label实现:

4、创建食物模块

创建食物模块和创建随机炸弹思路是一致的,都是在一定范围内随机出现。

通过坐标点的方法来实现食物,食物是随机出现的,而且一旦被吃掉就会立刻创建新的食物。

而且还需要判断食物出现的地方时是否与墙壁重合。

5、蛇吃食物的模块

通过Timer控件来设置时间,,吃到食物之后身体增长,蛇的身体颜色是三色交替出现,每吃到一个食物积分加10,身体加长对应增长。

而且还要判断是否需要更改蛇的运行速度。

7、是否撞到自己模块

当贪吃蛇自己碰到自己的身体时游戏结束

8、游戏结束模块

9、初始化panel

10、初始化Form并添加背景音乐(Kalimba.wav)

11、控制蛇的运动方向

四、调试过程及运行结果

1、调试过程

(1)在实现撞障碍物的过程中,刚刚开始的时候墙不能起作用,贪吃蛇总是能穿过障碍物,后来才发现时障碍物的设置范围出现了错误。

经过不停的尝试与计算才算出正确的范围。

(2)在实现固定墙的过程中是通过使用Label来实现的,跟创建贪吃蛇的思想是一样的,但是在运行过程中刚刚开始的时候不出现障碍物,后来在老师的帮助下发现原来少一句话,需要在NowStar()函数中增加障碍物的显示

for(inti=0;i

{this.panel1.Controls.Add((Label)sk.Wall[i]);}

(3)在玩游戏的过程中发现食物会与墙壁还有炸弹重合的情况,然后通过分析原因,这与构造食物时判断食物与身体是否接触的道理是一样的,这里需要加一个循环语句来判断,如果不是墙的话才在这里创造食物。

(4)在创造炸弹的实现过程中,总是在炸弹的右半边任何位置都爆炸,通过一步一步的调试检查是在判断语句时右侧的范围太大,导致有半侧没有炸弹也爆炸。

通过调试找到正确的范围。

2、实验结果

(1)游戏运行主界面

(2)帮助界面

(3)结束界面

五、实验心得

回顾这个实习过程,发现这次的实训对我来说有很大的收获,我学到了许多课本上没有学到的知识,以前只是纸上谈兵,这次我将将课本上的理论知识充分的转化成了一些实用技能。

通过这次自己制作的软件,丰富了自己的实践技能,扩展课本专业的知识面,使我受益匪浅,同时也体验到了搞软件开发发的困难度。

在这次设计的同时,我又从中学到了许多东西。

但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做的不是很好,界面的设计及整体的布局还是比较简单,没有突出特色来,这也可能使我这个小项目的不足之处,在这里也恳请老师能够对我的小系统知名不足并加以改正。

此外,在这一次的课程设计过程中,我上网查阅了大量的资料,对C#有了更深的理解,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设提供了很大的帮助,锻炼了我的能力。

更重要的是,它还让我认识到了自己的不足之处,在编程方面,我还是比较欠缺,以后的路任重道远,我需要的事不断地丰富自己,充实自己,这样才能在程序设计方面有所收获。

我想要写出好的程序,需要我们有扎实的基础,这样遇到一些基本算法的时候可能就会游刃有余了。

在编程是我们碰到了很多的困难,这就需要我们多与别人交流。

三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。

在编程的过程中我们也看到了有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点。

养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致,这些都是提高我们编程的注意点。

还有在变成中最能体现简单的原则。

所以我们要思考讨论简单的程序,这样简单的方法更容易被人理解,更容易实现,也更容易维护。

遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。

最后感谢程铭老师在这一学期中对我们的悉心教导,通过这一学期的学习,让我们掌握了很多有关C#.NET的应用知识,感谢您给我们提供了一个锻炼自我能力提高自我能力的机会。

六、参考资料

[1]陈俊荣.ASP与网络数据库技术[M].北京:

中国铁道出版社,2005.

[2]张绣兰.ASP网站建设实录[M].北京:

北京希望电子出版社.2008.

[3]李华.DreamWeaver8网页设计程序教程[M].北京:

清华大学出版社.2004.

[4]江开耀.软件工程[M].西安:

西安电子科技大学出版社.

七、附录:

源代码

snake源代码如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.Collections;

usingSystem.Drawing;

usingSystem.ComponentModel;

usingSystem.Data;

namespaceSnake

{

classsnake

{

publicPointfood_p;//定义食物的位置

privateLabelfood;//定义食物

publicLabelFood//食物属性

{

get{returnfood;}

set{food=value;}

}

privateArrayListbody=newArrayList();//定义食物定义食物链表

publicArrayListBody//食物链表属性

{

get{returnbody;}

set{body=value;}

}

//定义障碍物上下左右各面墙蛇撞墙即死

privateArrayListwall=newArrayList();

publicArrayListWall

{

get{returnwall;}

set{wall=value;}

}

privateArrayListwall1=newArrayList();

publicArrayListWall1

{

get{returnwall1;}

set{wall1=value;}

}

privateArrayListwall2=newArrayList();

publicArrayListWall2

{

get{returnwall2;}

set{wall2=value;}

}

privateArrayListwall3=newArrayList();

publicArrayListWall3

{

get{returnwall3;}

set{wall3=value;}

}

publicvoidCreateSnake()//使用Label进行创建一个蛇

{

intleft=20;

Labellb;

for(inti=0;i<2;i++)

{

lb=newLabel();

lb.Name="label"+i.ToString();

lb.BackColor=Color.Green;

lb.Width=10;

lb.Height=10;

lb.Top=0;

lb.Left=left;

body.Add(lb);

left-=10;

}

}

publicvoidCreateWall()//使用Label进行创建障碍物

{

intleft=200;

Labellb0;

for(inti=0;i<10;i++)

{

lb0=newLabel();

lb0.Name="label"+i.ToString();

lb0.BackColor=Color.Red;

lb0.Width=10;

lb0.Height=10;

lb0.Top=50;

lb0.Left=left;

wall.Add(lb0);

left-=10;

}

}

publicvoidCreateWall1()

{

intleft=200;

Labellb1;

for(inti=0;i<10;i++)

{

lb1=newLabel();

lb1.Name="label"+i.ToString();

lb1.BackColor=Color.Red;

lb1.Width=10;

lb1.Height=10;

lb1.Top=310;

lb1.Left=left;

wall1.Add(lb1);

left-=10;

}

}

publicvoidCreateWall2()

{

inttop=200;

Labellb2;

for(inti=0;i<10;i++)

{

lb2=newLabel();

lb2.Name="label"+i.ToString();

lb2.BackColor=Color.Red;

lb2.Width=10;

lb2.Height=10;

lb2.Left=50;

lb2.Top=top;

wall2.Add(lb2);

top-=10;

}

}

publicvoidCreateWall3()

{

inttop=200;

Labellb3;

for(inti=0;i<10;i++)

{

lb3=newLabel();

lb3.Name="label"+i.ToString();

lb3.BackColor=Color.Red;

lb3.Width=10;

lb3.Height=10;

lb3.Left=260;

lb3.Top=top;

wall3.Add(lb3);

top-=10;

}

}

//创建食物

publicvoidCreateFood()

{

Randomrand=newRandom();

food_p.X=rand.Next(36)*10;//限定食物物所能出现的横坐标

food_p.Y=rand.Next(36)*10;//限定食物物所能出现的横坐标

for(inti=0;i

{

if(food_p.Y==((Label)body[i]).Top&&food_p.X==((Label)body[i]).Left)

{

this.CreateFood();

break;

}

}

//判断食物和所见障碍物是否重合

for(inti=0;i

{

if(food_p.Y==((Label)this.Wall[i]).Top&&food_p.X==((Label)this.Wall[i]).Left)

{

this.CreateFood();

}

elseif(food_p.Y==((Label)this.Wall1[i]).Top&&food_p.X==((Label)this.Wall1[i]).Left)

{

this.CreateFood();

}

elseif(food_p.X==((Label)this.Wall2[i]).Left&&food_p.Y==((Label)this.Wall2[i]).Top)

{

this.CreateFood();

}

elseif(food_p.X==((Label)this.Wall3[i]).Left&&food_p.Y==((Label)this.Wall3[i]).Top)

{

this.CreateFood();

}

}

food=newLabel();

food.Width=10;

food.Height=10;

food.Top=food_p.Y;

food.Left=food_p.X;

//加载食物图片

food.Image=Snake.Properties.Resources.food;

}

//蛇吃食物通过timer进行速度的设置

publicPanelEatFood(Panelpanel1,Timertimer1,TextBoxtextBox1,TextBoxtextBox2)

{

if(((Label)body[0]).Top==food_p.Y&&((Label)body[0]).Left==food_p.X)

{

panel1=this.DeFood(panel1);

Labellb=newLabel();//增加蛇身

lb.Name="label"+body.Count.ToString();

inti=body.Count%3;

if(i==0)

lb.BackColor=Color.DimGray;

elseif(i==1)

lb.BackColor=Color.DeepPink;

else

lb.BackColor=Color.DeepSkyBlue;

lb.Width=10;

lb.Height=10;

lb.Top=((Label)body[body.Count-1]).Top;

lb.Left=((Label)body[body.Count-1]).Left;

body.Add(lb);

textBox1.Text=Convert.ToString(Convert.ToInt32(textBox1.Text)+10);

textBox2.Text=textBox1.Text;

if(Convert.ToInt32(textBox2.Text)

textBox2.Text=textBox1.Text;

//修改速度

if(textBox1.Text=="50")

timer1.Interval=150;

elseif(textBox1.Text=="100")

timer1.Interval=100;

elseif(textBox1.Text=="150")

timer1.Interval=80;

elseif(textBox1.Text=="200")

timer1.Interval=50;

elseif(textBox1.Text=="250")

timer1.Interval=20;

}

returnpanel1;

}

//吃过后销毁再创建食物

publicPanelDeFood(Panelpanel1)

{

panel1.Controls.Remove(food);

this.CreateFood();

panel1.Controls.Add(food);

returnpanel1;

}

}

}

//Form源代码:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.Collections;

usingSystem.Media;

namespaceSnake

{

publicpartialclassForm1:

Form

{

publicForm1()

{

InitializeComponent();

}

privatesnakesk=newsnake();//构造一个蛇的对象

privateintdir=3;//初始时要运动的方向(向右)

privatePointbomb_b;//定义炸弹

privateLabelbomb;

publicvoidCreatBomb()//创建炸弹

{

Randomrand=newRandom();

bomb_b.X=rand.Next(20)*10;

bomb_b.Y=rand.Next(20)*10;

bomb=newLabel();

bomb.Width=10;

bomb.Height=10;

bomb.Top=bomb_b.Y;

bomb.Left=bomb_b.X;

bomb.Image=Snake.Properties.Resources.b2;

//判断随机炸弹是否与随机食物重合

if(bomb_b.X==sk.food_p.X&&bomb_b.Y==sk.food_p.Y)

{

CreatBomb();

}

}

//清除炸弹

publicPanelDeBomb(Panelpanel1)

{

panel1.Controls.Remove(bomb);

returnpanel1;

}

privateintdiring=-1;//正在运动的方向

privatevoidbutton1_Click(objects

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1