贪吃蛇Java课程设计.doc

上传人:jian****018 文档编号:8989326 上传时间:2020-04-02 格式:DOC 页数:25 大小:109KB
返回 下载 相关 举报
贪吃蛇Java课程设计.doc_第1页
第1页 / 共25页
贪吃蛇Java课程设计.doc_第2页
第2页 / 共25页
贪吃蛇Java课程设计.doc_第3页
第3页 / 共25页
点击查看更多>>
资源描述
目录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技术开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分六个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。1.设计任务与要求1.1设计任务设计一个贪吃蛇的游戏 功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中各种情况,以及其它的辅助功能。 设计任务要完成设计、编码、测试等过程,给出设计思路、主要代码。源代码以及可运行的贪吃蛇游戏。1.2具体要求 具体内容如下: 1) 设计任务与要求 2) 总体方案与说明 3) 面向对象的设计(主要类的设计) 4) 源程序清单与注释 5) 软件主要模块流程图 6) 问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);7) 小结与体会2.软件主要模块流程图 软件的主要模块流程如下图5-1所示单击“enter”按钮,游戏开始。键盘操作: 右移 左移 上移 sdasdasd 下移没有吃到食物且蛇碰到边界游戏结束按F1重新开始游戏中途欲中断,稍后继续游戏按enter游戏暂停进入游戏画面再次开始按enter按钮,游戏恢复图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 IOExceptionprivate class SnakeDriver implements Runnable Overridepublic 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 OVERtail = bady.getLast(); /记录下它尾节点bady.removeLast(); /删除它的尾节点int x = bady.getFirst().x; /获取它头结点的Xint y = bady.getFirst().y; /获取它头节点的Yif(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)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语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这样才能在程序设计方面有所收获。参考文献(资料)1 谢希仁. 计算机网络(第五版). 北京:电子工业出版社,20082 胡小强 计算机网络. 北京:北京邮电大学出版社2005 3 陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,20064 杨昭编著.二级Java语言程序设计教程.北京:中国水利水电出版社,20065 赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,20066 赵毅主编.跨平台程序设计语言Java.西安:西安电子科技大学出版社,20067 王路群.Java高级程序设计.北京:中国水利水电出版社,20068 雍俊海编著.Java程序设计习题集.北京:清华大学出版社,20069 朱福喜编著.Java语言习题与解析.北京:清华大学出版社,200610 吴其庆编著.Java程序设计实例教程.北京:冶金产业出版社,2006程序代码:package cn;import java.awt.*;import java.io.*;import java.util.LinkedList;import java.util.Properties;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()int width = Constant.COMPANY * Constant.COMPANY_WIDTH;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(true);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.parseInt(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 Overridepublic void run() while(true)GameFrame.this.panel.repaint();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 JPanelprivate 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;Overrideprotected void paintComponent(Graphics g) g.setColor(Color.WHITE);g.fillRect(0, 0, Constant.COMPANY * Constant.COMPANY_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.panel.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 * 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: + gf.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暂停或开始, Constant.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;public void setPause(boolean pause) this.pause = pause;public int getHigh() return high;public void setHigh(int high) this.high = high;/蛇类import java.awt.*;import java.util.LinkedList;public class Snake private int key;private int KeyBuffer;private int speed;public static final int UP = 1;public static final int DOWN = -1;public static final int LEFT = 2;public static final int RIGHT = -2;private LinkedList body = new LinkedList();private boolean life;private Point tail;private GameFrame gf;public int getSpeed() return speed;public void setSpeed(int speed) this.speed = speed;public Point getTail() return tail;public void setTail(Point tail) this.tail = tail;public boolean isLife() return life;public void setLife(boolean life) this.life = life;public LinkedList getBobay() return body;public void setBobay(LinkedList bobay) this.body = bobay;public int getKeyBuffer() return KeyBuffer;public void setKeyBuffer(int keyBuffer) KeyBuffer = keyBuffer;public int getKey() return key;public void setKey(int key) this.key = key;public Snake(int key) this.key = key;public Snake(GameFrame gf) this.gf = gf;speed = Constant.SEEPD;body.addFirst(new Point(10,10);body.add(new Point(10,11);key = UP;KeyBuffer = key;life = true;public void drawMe(Graphics g) g.setColor(Color.RED);for (Point p: body) g.fill3DRect(p.x * Constant.COMPANY, p.y* Constant.COMPANY, Constant.COMPANY,Constant.COMPANY, true);public void move() if(gf.panel.isPause() return;if(!life) return;tail = body.getLast();body.removeLast();int x = body.getFirst().x;int y = body.getFirst().y;if(key + KeyBuffer != 0)key = KeyBuffer;switch(key)case UP:y-;break; case DOWN: y+; break;case LEFT:x-;break;case RIGHT:x+;break;if(x Constant.COMPANY_WIDTH - 1) x = 0;if(y Constant.COMPANY_HEIGHT - 1) y = 0;body.addFirst(new Point(x,y);public boolean eatRock(Rocks rock)if(body.getFirst().x = rock.x & body.getFirst().y = rock.y)body.removeFirst();body.addLast(tail);setLife(false);return true;return false;public boolean eatBody()Point p;for(int i = 1; i body.size(); i+)p = body.get(i);if(body.getFirst().x = p.x & body.getFirst().y = p.y)body.removeFirst();body.addLast(tail);setLife(false);return true;return false;public boolean eatFood(Food food) if(body.getFirst().x = food.x & body.getFirst().y = food.y)body.addLast(tail);gf.food.reMove();speed *= 0.95;int score = gf.panel.getScore();gf.panel.setScore(score += (Constant.SEEPD - speed) * 2 );return true;return false;/食物类import java.awt.*;import java.util.Random;public class Food extends Point private Random random = new Random();private GameFrame gf;private boolean fristTime;public Food(GameFrame gf) fristTime = true;x = random.nextInt(18);y = random.nextInt(18);this.gf = gf;public void drawMe(Graphics g) if(fristTime)reMove();fristTime = false;g.setColor(Color.YELLOW);g.fill3DRect(x * Constant.COMPANY_WIDTH , y * Constant.COMPANY_HEIGHT,Constant.COMPANY, Constant.COMPANY, true);public void reMove() boolean flag;do flag = false;x = random.nextInt(18);y = random.nextInt(18);for(Point p : gf.xiaoqing.getBobay()if(x = p.x & y = p.y)flag = true;break;for(Rocks r : gf.rocks)if(x = r.x & y = r.y)flag = true;break; while (flag);/石头类import java.awt.*;public class Rocks extends Point private GameFrame gf;public Rocks(int x, int y, GameFrame gf) this.x = x;this.y = y;this.gf = gf;public void drawMe(Graphics g) g.setColor(Color.DARK_GRAY);g.fill3DRect(x * Constant.COMPANY, y * Constant.COMPANY,Constant.COMPANY, Constant.COMPANY, true);/变量类public class Constant public static final int COMPANY = 20;public static final int COMPANY_WIDTH = 20;public static final int COMPANY_HEIGHT = 20;public static int SEEPD = 300;/控制类import java.awt.*;public class Control extends KeyAdapter private GameFrame gf;public Control(GameFrame gf) this.gf = gf;public void keyPressed(KeyEvent e) int key = e.getKeyCode();switch(key)case KeyEvent.VK_W:gf.xiaoqing.setKeyBuffer(Snake.UP);break;case KeyEvent.VK_S:gf.xiaoqing.setKeyBuffer(Snake.DOWN);break;case KeyEvent.VK_A:gf.xiaoqing.setKeyBuffer(Snake.LEFT);break;case KeyEvent.VK_D:gf.xiaoqing.setKeyBuffer(Snake.RIGHT);break;case KeyEvent.VK_UP:gf.xiaoqing.setKeyBuffer(Snake.UP);break;case KeyEvent.VK_DOWN:gf.xiaoqing.setKeyBuffer(Snake.DOWN);break;case KeyEvent.VK_LEFT:gf.xiaoqing.setKeyBuffer(Snake.LEFT);break;case KeyEvent.VK_RIGHT:gf.xiaoqing.setKeyBuffer(Snake.RIGHT);break;case KeyEvent.VK_ENTER:gf.panel.setPause(!gf.panel.isPause();break;case KeyEvent.VK_F1:gf.inti();break;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!