1、贪吃蛇Java课程设计1.设计任务与要求 21.1设计任务 21.2具体要求 22.软件主要模块流程图 33.总体方案与说明 43.1总体方案 43.2系统模块 43.2.1游戏界面设计 43.2.2贪吃蛇蛇身及运动设置 63.2.3游戏控制设置 34.程序设计 44.1GamePanel类 44.2.Snake类 45.分析问题与解决方案 55.1 问题处理 56小结与体会 6参考文献(资料) 7程序代码: 8基于Java的游戏“贪吃蛇”的设计和实现容提要: “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术开发环境,开发了一个操作简单、界面美观、功能较齐
2、全的“贪吃蛇”游戏。整个游戏程序分六个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。1.设计任务与要求1.1设计任务设计一个贪吃蛇的游戏 功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中各种情况,以及其它的辅助功能。 设计任务要完成设计、编码、测试等过程,给出设计思路、主要代码。源代码以及可运行的贪吃蛇游戏。1.2具体要求 具体容如下: 1) 设计任务与要求 2) 总体方案与说明 3) 面向对象的设计(主要类的设计) 4) 源程序清单与注释 5) 软件主要模块流程图 6) 问题分析与解决方案(包括调式记录、调
3、式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);7) 小结与体会2.软件主要模块流程图 软件的主要模块流程如下图5-1所示3.总体方案与说明 3.1总体方案 我们设计的贪吃蛇主要利用键盘控制蛇的前进移动方向,是否吃到食物,是否撞墙以及是否暂停、开始游戏等。当吃到食物的时候,蛇就自动长大一格,在游戏中可进行暂停和开始操作。中途若是撞到墙或是撞到自己,同样也结束。 3.2系统模块根据总体方案,我把贪吃蛇游戏分为:游戏界面设置(即绘图)、贪吃蛇蛇身及运动与碰撞问题(食物、蛇身、石头)设置三大模块来设计。3.2.1游戏界面设计游戏界面设置包括:游戏区,蛇的长度信息,获得分数的信息以及历史最
4、高分的信息。 游戏界面使用简单和直观的布局设计,游戏区放置在界面的主题位置上,在游戏区右上方放置蛇的长度数据及获得的分数数据,具体设计效果如图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); pub
5、lic 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 IOExce
6、ption private class SnakeDriver implements Runnable Override public void run() public static void main(String args) GameFrame gf = new GameFrame(); 3.2.2贪吃蛇蛇身及运动设置 贪吃蛇的蛇身设置是整个游戏设计的关键。它的基本思路是:移动的时候去掉蛇尾,将其添加在蛇头(去尾加头),吃到食物时将之前去掉的尾部在重新加上,完成蛇头吃食物的处理操作,显示蛇头。具体效果如图2-2所示。而蛇运动的四个方向,则通过按键来控制。蛇吃到一个食物,就加分。每次食物出
7、现的位置不能在蛇身上也不能在屏幕外面,如果蛇在运动的过程中撞到自己或者撞墙,则游戏结束,具体效果如图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 in
8、t y = bady.getFirst().y; /获取它头节点的Y if(key + KeyBuffer != 0) switch(key) /就算其头结点坐标 /防止蛇跑出屏幕 if(x Constant.COMPANY_WIDTH - 1) x = 0; if(y Constant.COMPANY_HEIGHT - 1) y = 0; bady.addFirst(new Point(x,y); /在其头部加上新的X,Y坐标 蛇吃食物,撞墙,撞身体public boolean eatFood(Food food) public boolean eatRock(Rocks rock) pub
9、lic boolean eatBody() 3.2.3游戏控制设置 游戏控制设置就是控制游戏的暂停与开始及重新游戏。W、S、A、D或上、下、左、右键控制蛇的上、下、左、右移动,设置enter按键来暂停或开始进行中的游戏,设置F1来重新开始游戏。4.程序设计贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。4.1GamePanel类 该类包含六个主要的功能方法,分别是: (1)构造函数public paintComponrnt (),主要用来设置用户控制面。 (2)public void keyPressed()方法,主要用来对游戏的按键操作进行处理。 (3)void draw
10、Food() drawRocks()主要用来绘制游戏界面食物和石头。 (4)public void drawfenshu ()方法主要用来改变积分器。(5) public void drawPause()方法用来实现暂停(6)void drawGameOver()方法用来控制游戏的开始界面。4.2.Snake类 该类包含多个功能方法,分别是: (1) 构造函数public Snake(),该方法主要用来初始化游戏界蛇的位置及大小且给其一个初始方向。用一个LinkedList,用来保存蛇的每一节;在利用drawMe()方法遍历LinkedList中保存的节点来画出游戏界面中的蛇。(2) publ
11、ic void move()方法主要用来改变蛇的运动方向, 首先判断游戏是否暂停,还有是否GameOver 跳出该方法,蛇不能移动否则先保存它的尾节点,在将其尾节点删除,获取其头节点的XY坐标,如果你同时按下2个按键其和为0则按原始方向移动,在获取到移动后XY坐标,将其加在蛇的头部(3) public boolean eatRocks()方法使实现蛇吃石头的函数,首先判断蛇身体的头节点是否和石头重合如果重合,去除蛇身体的头节点,在再其尾节点出加一节身体,并设置Life为false。(4) public boolean eatBody()方法实现蛇吃到自己的身体。(5) public Boole
12、an eatFood()方法实现蛇吃到食物5.分析问题与解决方案5.1 问题处理 问题一: 不能实现游戏中最高分数的存储与读取 使用.properties来存储其最高分数 在用msg()方法来实现其对应数据的读取与存储 问题二:蛇在吃掉食物时,画出其身体的方法 将先前去除的尾节点在重新加在其尾部 问题三:图形界面的覆盖使用双缓冲技术:双缓冲技术在很多动画中被采用。主要原理是创建一幅图像,将每一帧画入图像,然后将整个图像一次画到屏幕上去,将其原来的东西覆盖掉。 问题四:线程的使用 如何将其节点无限重画,及睡眠时间 使用死循环 问题五:实现键盘操控游戏 使用键盘监听器6小结与体会回顾这个设计过程,
13、我学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时,我又从中学到了许多东西。但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做得不是很好,界面的设计及整体的布局还比较简单,没有突出特色出来,这也可能是我这个系统的不足之处,在这里也恳请各位老师能够对我的作品指明不足并加以改正。总之,在这一次的课程设计过程中,我查阅了大量的资料,对Java有了一点初步的认识,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设提供了很大的帮助,锻炼了我的能力
14、让我掌握了一门新的程序设计语言:java语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这样才能在程序设计方面有所收获。参考文献(资料)1 希仁. 计算机网络(第五版). :电子工业,20082 胡小强 计算机网络. :邮电大学2005 3 轶.晓昆编著.Java程序设计实验指导.:清华大学,20064 昭编著.二级Java语言程序设计教程.:中国水利水电,20065 文靖编著.Java程序设计基础与上机指导.:清华大学,20066 毅
15、主编.跨平台程序设计语言Java.:电子科技大学,20067 王路群.Java高级程序设计.:中国水利水电,20068 雍俊海编著.Java程序设计习题集.:清华大学,20069 朱福喜编著.Java语言习题与解析.:清华大学,200610 吴其庆编著.Java程序设计实例教程.:冶金产业,2006程序代码:package;import java.awt.*;import java.io.*;import java.util.LinkedList;import java.util.Properties;import javax.swing.JFrame;/游戏界面的主要类public clas
16、s 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() int width = Constant.COMPANY * Constant.COMPANY_W
17、IDTH; int height = Constant.COMPANY * Constant.COMPANY_HEIGHT; panel.setSize(width , height ); panel.setLayout(new BorderLayout(); panel.addKeyListener(ct); this.add(panel,BorderLayout.CENTER); this.setSize(width + 5 , height + 28); this.setLocation(1366-width)/2, (768-height)/2); this.setVisible(tr
18、ue); this.setTitle(贪吃蛇); this.setResizable(false); this.intiRocks(); this.inti(); this.addKeyListener(ct); this.setDefaultCloseOperation(GameFrame.EXIT_ON_CLOSE); new Thread(new SnakeDriver().start(); public void intiRocks() for(int i = 0; i Constant.COMPANY_WIDTH; i+) for(int j = 0; j Integer.parse
19、Int(url1) dbconfig.setProperty(high,panel.getScore()+); panel.setHigh(panel.getScore(); OutputStream out = new FileOutputStream(src/num.properties); dbconfig.store(out, null); return url1; private class SnakeDriver implements Runnable Override public void run() while(true) GameFrame.this.panel.repai
20、nt(); try Thread.sleep(xiaoqing.getSpeed(); catch (InterruptedException e) e.printStackTrace(); public static void main(String args) GameFrame gf = new GameFrame(); /在游戏界面中画出事物的主要类import java.awt.*;import java.io.*;import java.util.Properties;import javax.swing.JPanel;public class GamePanel extends
21、JPanel private GameFrame gf; private Snake s; private int score; private int high; private boolean pause; public GamePanel(GameFrame gf) pause = true; score = 0; this.gf = gf; Override protected void paintComponent(Graphics g) g.setColor(Color.WHITE); g.fillRect(0, 0, Constant.COMPANY * Constant.COM
22、PANY_WIDTH + 20, Constant.COMPANY * Constant.COMPANY_HEIGHT + 40); drawBackGround(g); gf.xiaoqing.move(); if (gf.xiaoqing.isLife() gf.xiaoqing.eatFood(gf.food); for (Rocks rock : gf.rocks) if (gf.xiaoqing.eatRock(rock) break; gf.xiaoqing.eatBody(); gf.xiaoqing.drawMe(g); gf.food.drawMe(g); if(gf.pan
23、el.isPause() drawPause(g); for (Rocks y : gf.rocks) y.drawMe(g); if(!gf.xiaoqing.isLife() gf.xiaoqing.drawMe(g); gf.food.drawMe(g); drawGameOver(g); drawlenth(g); drawfenshu(g); highnum(g); public void drawGameOver(Graphics g) g.setColor(Color.BLUE); g.drawString(Game_Over 按f1重新开始, Constant.COMPANY
24、* Constant.COMPANY_WIDTH/2 - 70, Constant.COMPANY * Constant.COMPANY_HEIGHT/2); public void drawlenth(Graphics g) g.setColor(Color.BLUE); g.drawString(length: + gf.xiaoqing.getBobay().size(), 10, Constant.COMPANY + 20); public void drawfenshu(Graphics g) g.setColor(Color.BLUE); g.drawString(num: + g
25、f.panel.getScore(), 10, Constant.COMPANY + 40); public void highnum(Graphics g) g.setColor(Color.BLUE); try g.drawString(highnum: +gf.msg(), 10, Constant.COMPANY + 60); catch (IOException e) e.printStackTrace(); public void drawPause(Graphics g) g.setColor(Color.BLACK); g.drawString(按Enter暂停或开始, Con
26、stant.COMPANY * Constant.COMPANY_WIDTH/2 - 50, Constant.COMPANY * Constant.COMPANY_HEIGHT/2); public void drawBackGround(Graphics g) g.setColor(Color.LIGHT_GRAY); for(int x = 0; x Constant.COMPANY * Constant.COMPANY_HEIGHT; x += Constant.COMPANY) g.drawLine(0, x, Constant.COMPANY * Constant.COMPANY_WIDTH, x); for(int y = 0; y Constant.COMPANY * Constant.COMPANY_WIDTH; y += Constant.COMPANY) g.drawLine(y, 0, y, Constant.COMPANY * Constant.COMPANY_HEIGHT); public int getScore() return score; public void setScore(int score) this.score = score; public boolean isPause() return pause;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1