贪吃蛇游戏报告毕业设计android.docx
贪吃蛇游戏报告毕业设计android 武汉理工大学华夏学院课程设计 课程名称面向对象课程设计 题目贪吃蛇游戏 专业软件技术 班级软件2082班 学号10225508318 姓名王亭 成绩 指导教师 2022 年11月29日至2022年12月6日 课程设计任务书 设计题目:贪吃蛇游戏 设计目的 本课程的设计的目的是通过实践使同学们经历面向对象全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的知识。结合具体的开发案例,理解并初步掌握系统分析、系统设计、系统实施的主要环节和步骤以及软件文档的制作能力。 设计任务(在规定的时间内完成下列任务) 1、系统功能的基本要求 移动:按下键盘上的A、D、S、W,分别使得方块向左移、右移、下移、上移,吃掉食物时,食物消失,蛇身自动增长,然后在随机产生食物,并判断食物产生的位置,以及游戏结束情况; 2、保存信息: 当玩家想保存游戏信息时,直接点击保存操作,并且可以查看到保存的信息。 时间安排 消化资料、系统调查 1天 系统分析、总体设计,实施计划、撰写报告3天 演示、验收1天 具体要求 1、明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课程设计任务。 2、设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完全相同者一律以抄袭论处。设计报告正文字数不少于0.2万字(不包括附录) 指导教师签名:2022年6月28日 教研室主任(或责任教师)签名:2022年6月28日 一、游戏功能 1.蛇头能够按照指定的方向进行移动,蛇身则是根据蛇头的移动方向进行移动; 2.蛇头吃掉食物后以后,食物消失并且蛇的身体要增长; 3.食物消失后能够重新产生新的食物,并且产生的新食物不能出现在蛇头和蛇身上; 4.蛇不能超出游戏的面板并且蛇头不能够撞到蛇身,否则游戏结束。 5.蛇头每吃掉一个食物游戏分数就会增长十分,游戏分数达到一定的等级后就会增加游戏的等级,并且还要能够记载游戏的时间; 6.进入游戏时能够选择游戏的难易程度; 7.结束游戏时能够保存游戏的相关信息,并且还能够查看游戏的排行榜。 二、使用的相关知识 winForm的编程、xml文件的数据存取操作、使用LINQ操作xml文件、面向对象的设计(MVC的模式) 三、整体思路 1.创建蛇头(Snakehead)、食物(Snakefood)、蛇身(Snakeblock)三个实体类 1.1 蛇头类中需要实现蛇头的初始化,蛇头的移动; 1.2 蛇身类中需要实现蛇身的移动和蛇身的增长; 1.3 食物类中需要实现食物能够被吃掉和食物的产生,并且在产生食物时要判断食物是否在蛇头和蛇身上,若在蛇头或蛇身上则重新产生食物。 2.创建一个控制类(Game)来实现对游戏的控制 2.1 能够将蛇头、蛇身、食物初始化到游戏面板中去; 2.2 能够判断蛇头超出面板或撞到蛇身时结束游戏; 2.3 能够对游戏的分数和等级的记载; 2.4 能够控制整个游戏的运行规则; 2.5 能够控制蛇头的运动方向。 3. 创建一个保存数据的SavaData类 3.1 能够保存游戏的记录; 3.2 能够查询所有的游戏记录; 4.创建一个窗体(Form1)来显示游戏,一个窗体(Form2)来输入玩家姓名,一个窗体(showData)来显示游戏的记录。 四、具体实现步骤 1.创建一个资源类(Global),这个类能够提供蛇头的大小、蛇头的方向、游戏面板的大小。具体代码: class Global /蛇头的宽度 public static int Snake_Width =20; /蛇头的长度 public static int Snake_Height =20; /蛇头的方向 public static Dircte Snake_Dir = Dircte.Right; /窗体的宽度 public static int Game_Width =400; /窗体的高度 public static int Game_Height =500; 2. 创建一个蛇头类(Snakehead),在构造方法中来接收显示蛇头的面板和位置两个参数;有一个变量oldPoint来保存蛇头移动前的位置,有一个init()方法来初始化蛇头,一个move()方法来进行蛇头的移动。具体代码: class Snakehead Panel panel; Button head; Point location; Point oldPoint; public Snakehead(Panel panel,Point location) this.panel= panel; this.location= location; oldPoint =new Point(); init(); public Button Head get return head; public Point OldPoint set oldPoint = value; get return oldPoint; /初始化蛇头 private void init() head =new Button(); head.Width= Global.Snake_Width; head.Height= Global.Snake_Height; head.Location= location; head.BackColor= Color.Blue; head.Visible=true; panel.Controls.Add(head); /蛇头的移动 public void move() oldPoint.X= head.Left; oldPoint.Y= head.Top; switch(Global.Snake_Dir) case Dircte.Up: head.Top-= head.Height; break; case Dircte.Down: head.Top+= head.Height; break; case Dircte.Left: head.Left-= head.Width; break; case Dircte.Right: head.Left+= head.Width; break; 3.创建一个蛇身类(Snakeblock),在构造方法中接受显示蛇身的面板;一个newPoint变量用来存放每节蛇身移动前的位置,一个blocks 集合变量用来存放每一节蛇身;一个addSnake(Point oldPoint)方法来增长蛇身,其中接受一个点坐标来显示增长的蛇身的位置;一个move(Point oldPoint)方法来移动蛇身,其中接收一个点坐标来表示蛇身的第一个节点移动的坐标。具体代码: class Snakeblock Panel panel; List blocks =new List(); Point newPoint =new Point(); public Snakeblock(Panel panel) this.panel= panel; public List Blocks get return blocks; /增长蛇身 public void addSnake(Point oldPoint) Button block =new Button(); block.Width= Global.Snake_Width; block.Height= Global.Snake_Height; block.Location= oldPoint; block.BackColor= Color.Blue; block.Enabled=false; block.Visible=true; this.panel.Controls.Add(block); blocks.Add(block); /蛇身的移动 public void move(Point oldPoint) foreach(Button btn in blocks) newPoint = btn.Location; btn.Left= oldPoint.X; btn.Top= oldPoint.Y; oldPoint = newPoint; 4.创建一个食物类(Snakefood),在构造方法中来接收显示食物的面板和位置两个参数;一个初始化蛇头的方法init()将食物显示到游戏面板上;一个食物被蛇头吃掉的方法eat(Snakehead head),其中接收的参数是吃掉食物的蛇头;一个判断食物是否在蛇头上的方法isHead(Snakehead head, Point temp),该方法接收一个蛇头和即将创建的食物坐标来判断两点是否在同一位置;一个判断食物是否在蛇身上的方法isBlock(Snakeblock block, Point temp),该方法接收一个蛇身和即将创建的食物坐标,通过遍历存储蛇身的集合来判断这个点是否在蛇身上。具体代码: class Snakefood Panel panel; Button food; Point location; Random random =new Random(); Point temp =new Point(); public Snakefood(Panel panel, Point location) this.panel= panel; this.location= location; init(); /初始化食物 private void init() food =new Button(); food.Width= Global.Snake_Width; food.Height= Global.Snake_Height; food.Location= location; food.BackColor= Color.Red; food.Enabled=false; food.Visible=true; this.panel.Controls.Add(food); public Button Food get return food; /食物被吃掉 public void eat(Snakehead head) if(food.Location= head.Head.Location) food.Visible=false; /产生食物 public void creatFood(Snakehead head,Snakeblock block) int left; int top; do left = random.Next(Global.Game_Width-food.Width); top = random.Next(Global.Game_Height- food.Height); left -= left % Global.Snake_Width; top -= top % Global.Snake_Height; temp.X= left; temp.Y= top; while(isHead(head, temp)| isBlock(block, temp); food.Location= temp; food.Visible=true; /判断食物是否在蛇头上 private Boolean isHead(Snakehead head, Point temp) if(head.Head.Location= temp) return true; return false; /判断食物是否在蛇身上 private Boolean isBlock(Snakeblock block, Point temp) Boolean flag =false; foreach(Button btn in block.Blocks) if(btn.Location= temp) flag =true; break; return flag; 5.创建控制类(Game),在该构造方法中接收显示游戏的窗体和游戏的速度,并建立两个时钟一个用来控制游戏,一个用来给游戏记时;一个init()的方法来初始化整个游戏;一个run()方法来控制游戏的开始;一个puase()方法来暂停游戏;一个stop()方法来停止游戏; 一个save()方法来保存游戏的记录;一个show()来查看整个游戏的记录;在timer_Tick(object sender, EventArgs e)方法中来控制蛇头的移动、食物的消失与产生、蛇身的移动;在timer2_Tick(object sender, EventArgs e)方法中给游戏记时并显示时间;isOver()方法判断游戏是否结束,一种情况是超出边界,一种情况是蛇头撞到蛇身;addLevel()方法是根据游戏的分数来划分游戏等级和游戏的速度;Form_KeyDownForm_KeyDown(object sender, KeyEventArgs e)方法是接收玩家的按键来判断游戏的方向。具体代码: /游戏的初始代 private void init() panel.Width= Global.Game_Width; panel.Height= Global.Game_Height; panel.Left=0; panel.Top=50; panel.BackColor= Color.Yellow; head =new Snakehead(panel,new Point(20,40); food =new Snakefood(panel, new Point(80,80); block =new Snakeblock(panel); timer.Interval= speed; timer2.Interval=1000; form.Controls.Add(label_score); form.Controls.Add(score); form.Controls.Add(label_level); form.Controls.Add(level); form.Controls.Add(label_time); form.Controls.Add(time); form.Controls.Add(panel); /开始游戏 public void run()