贪吃蛇Java课程设计.docx
贪吃蛇Java课程设计 目录 1.设计任务与要求 (1) 1.1设计任务 (1) 1.2具体要求 (1) 2.软件主要模块流程图 (2) 3.总体方案与说明 (3) 3.1总体方案 (3) 3.2系统模块 (3) 3.2.1游戏界面设计 (3) 3.2.2贪吃蛇蛇身及运动设置 (5) 3.2.3游戏控制设置 (3) 4.程序设计 (4) 4.1GamePanel类 (4) 4.2.Snake类 (4) 5.分析问题与解决方案 (5) 5.1 问题处理 (5) 6小结与体会 (6) 参考文献(资料) (7) 程序代码: (8) 基于Java的游戏“贪吃蛇”的设计和实现 内容提要: “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分六个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。 1.设计任务与要求 1.1设计任务 设计一个贪吃蛇的游戏 功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中各种情况,以及其它的辅助功能。 设计任务要完成设计、编码、测试等过程,给出设计思路、 主要代码。源代码以及可运行的贪吃蛇游戏。 1.2具体要求 具体内容如下: 1) 设计任务与要求 2) 总体方案与说明 3) 面向对象的设计(主要类的设计) 4) 源程序清单与注释 5) 软件主要模块流程图 6) 问题分析与解决方案(包括调式记录、调式报告,即在调式 过程中遇到的主要问题、解决方法及改进设想); 7) 小结与体会 2.软件主要模块流程图 软件的主要模块流程如下图5-1所示 图51 游戏处理流程 3.总体方案与说明 3.1总体方案 我们设计的贪吃蛇主要利用键盘控制蛇的前进移动方向,是否吃到食物,是否撞墙以及是否暂停、开始游戏等。当吃到食物的时候,蛇就自动长大一格,在游戏中可进行暂停和开始操作。中途若是撞到墙或是撞到自己,同样也结束。 3.2系统模块 根据总体方案,我把贪吃蛇游戏分为:游戏界面设置(即绘图)、贪吃蛇蛇身及运动与碰撞问题(食物、蛇身、石头)设置三大模块来设计。 3.2.1游戏界面设计 游戏界面设置包括:游戏区,蛇的长度信息,获得分数的信息以及历史最高分的信息。 游戏界面使用简单和直观的布局设计,游戏区放置在界面的主题位置上,在游戏区右上方放置蛇的长度数据及获得的分数数据,具体设计效果如图2-1所示。 图2-1 游戏界面 附加代码: import java.awt.*; import java.io.*; import java.util.*; import javax.swing.JFrame; public class GameFrame extends JFrame public GamePanel panel = new GamePanel(this); public Snake xiaoqing = new Snake(this); public Control ct = new Control(this); public Food food = new Food(this); public LinkedList rocks = new LinkedList(); public GameFrame() public void intiRocks() public void inti() private Snake snake; Properties dbconfig = new Properties(); static FileInputStream file; public String msg() throws IOException private class SnakeDriver implements Runnable Override public void run() public static void main(String args) GameFrame gf = new GameFrame(); 3.2.2贪吃蛇蛇身及运动设置 贪吃蛇的蛇身设置是整个游戏设计的关键。它的基本思路是:移动的时候去掉蛇尾,将其添加在蛇头(去尾加头),吃到食物时将之前去掉的尾部在重新加上,完成蛇头吃食物的处理操作,显示蛇头。具体效果如图2-2所示。 而蛇运动的四个方向,则通过按键来控制。蛇吃到一个食物,就加分。每次食物出现的位置不能在蛇身上也不能在屏幕外面,如果蛇在运动的过程中撞到自己或者撞墙,则游戏结束,具体效果如图2-3所示。 图2-2游戏运行中的效果 图2-3就是蛇撞到墙之后,提示游戏结束。 附加代码: 蛇的移动 public void move() /蛇的移动方法 if(gf.panel.isPause() return; /判断游戏是否暂停 if(!life) return; /判断游戏是否GAME OVER tail = bady.getLast(); /记录下它尾节点 bady.removeLast(); /删除它的尾节点 int x = bady.getFirst().x; /获取它头结点的X int y = bady.getFirst().y; /获取它头节点的Y if(key + KeyBuffer != 0) switch(key) /就算其头结点坐标 /防止蛇跑出屏幕 if(x PANY_WIDTH - 1) x = 0; if(y PANY_HEIGHT - 1) y = 0; bady.addFirst(new Point(x,y); /在其头部加上新的X,Y坐标 蛇吃食物,撞墙,撞身体 public boolean eatFood(Food food) public boolean eatRock(Rocks rock) public boolean eatBody() 3.2.3游戏控制设置 游戏控制设置就是控制游戏的暂停与开始及重新游戏。W、S、A、D或上、下、左、右键控制蛇的上、下、左、右移动,设置enter按键来暂停或开始进行中的游戏,设置F1来重新开始游戏。 4.程序设计 贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。 4.1GamePanel类 该类包含六个主要的功能方法,分别是: (1)构造函数public paintComponrnt (),主要用来设置用户控制面。 (2)public void keyPressed()方法,主要用来对游戏的按键操作进行处理。 (3)void drawFood() drawRocks()主要用来绘制游戏界面食物和石头。 (4)public void drawfenshu ()方法主要用来改变积分器。 (5) public void drawPause()方法用来实现暂停 (6)void drawGameOver()方法用来控制游戏的开始界面。 4.2.Snake类 该类包含多个功能方法,分别是: (1)构造函数public Snake(),该方法主要用来初始化游戏界蛇的位置及大小且给其一个初始方向。用一个LinkedList,用来保 存蛇的每一节;在利用drawMe()方法遍历LinkedList中保存的 节点来画出游戏界面中的蛇。 (2) public void move()方法主要用来改变蛇的运动方向, 首先判断游戏是否暂停,还有是否GameOver 跳出该方法,蛇不能移动否则先保存它的尾节点,在将其尾节点删除,获取其头 节点的XY坐标,如果你同时按下2个按键其和为0则按原始方向 移动,在获取到移动后XY坐标,将其加在蛇的头部 (3) public boolean eatRocks()方法使实现蛇吃石头的函数,首先判断蛇身体的头节点是否和石头重合如果重合,去除蛇身体的 头节点,在再其尾节点出加一节身体,并设置Life为false。 (4) public boolean eatBody()方法实现蛇吃到自己的身体。 (5) public Boolean eatFood()方法实现蛇吃到食物 5.分析问题与解决方案 5.1 问题处理 问题一: 不能实现游戏中最高分数的存储与读取 使用.properties来存储其最高分数 在用msg()方法来实现其对应数据的读取与存储 问题二:蛇在吃掉食物时,画出其身体的方法 将先前去除的尾节点在重新加在其尾部 问题三:图形界面的覆盖 使用双缓冲技术:双缓冲技术在很多动画中被采用。主要 原理是创建一幅图像,将每一帧画入图 像,然后将整个图像一次画到屏幕上去, 将其原来的东西覆盖掉。 问题四:线程的使用 如何将其节点无限重画,及睡眠时间 使用死循环 问题五:实现键盘操控游戏 使用键盘监听器 6小结与体会 回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时,我又从中学到了许多东西。但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做得不是很好,界面的设计及整体的布局还比较简单,没有突出特色出来,这也可能是我这个系统的不足之处,在这里也恳请各位老师能够对我的作品指明不足并加以改正。 总之,在这一次的课程设计过程中,我查阅了大量的资料,对Java有了一点初步的认识,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设提供了很大的帮助,锻炼了我的能力让我掌握了一门新的程序设计语言:java语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这样才能在程序设计方面有所收获。