最新JAVA开放性实验报告贪吃蛇.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateJAVA开放性实验报告贪吃蛇JAVA程序设计与应用开发JAVA程序设计开放性实验报告 专 业: 计算机科学与技术 班 级: 2012级2班 学 号: 姓 名: 实验2贪吃蛇游戏设计(4学时)1.实验内容(1) 创建软件主窗体和相关控制菜单;在窗体中以图形模拟蛇的形状,使用键盘控制图形在窗体中任意移动,模拟贪吃蛇的行为.(2) 在窗体中可以设置障碍或奖励物品,以达到游戏的娱乐性。2.预习内容Java GUI编程;鼠标和键盘的事件处理;Java多媒体编程。3.实验类型综合性4.实验目的(1)了解JavaGUI编程特别是窗体,菜单;熟悉Java的事件委托处理机制,能完成鼠标和键盘的事件处理;(2)熟悉Java中的多媒体技术如:音频文件的播放控制,游戏中各种事件的音效添加。熟悉Java中的绘图操作,可以使用绘图函数进行图形的绘制和重绘等基本操作;(3)熟悉模块的划分及游戏控制类的编写,了解相关的游戏设计和实现模式;(4)设计可视化界面,添加其他必要组件,对窗体进行相应的键盘事件处理,使蛇能移动,依据实验内容结合自己的设计想法,实现模拟贪吃蛇的游戏效果。5.实验要求依据实验内容,编写相关类,实现所需软件功能。6实验过程(分析设计、源文件、执行结果)代码如下:-1、Node类public class Node private int x;private int y;public Node()public Node(int x,int y)this.x=x;this.y=y;public int getX()return x;public void setX(int x)this.x=x;public int getY()return y;public void setY(int y)this.y=y;public String toString()/方便类型转换/括号里不是String类型通过toString来转换,不然会输出一个地址return"("+x+","+y+")"Override /伪代码可以理解为注释,重写:下面的方法名是否在父类中存在,如果没有/的话会报错。/public int hashCode()/假设Node是list集合里面,只有把Node节点对象 /放在set集合时候写hashCode();final int prime = 31;int result = 1;result=prime*result+x;result=prime*result+y;return result;Override/比较Node对象是否在同一坐标都要写上equals方法public boolean equals(Object obj)if(this=obj)return true;if(this=null)return false;if(getClass()!=obj.getClass()return false;Node other=(Node)obj;if(x!=other.x)return false;if(y!=other.y)return false;return true;2、Worm 类import java.util.LinkedList;public class Worm private LinkedList<Node> worm = new LinkedList<Node>();int dir;public static final int UP = -1;public static final int DOWN = 1;public static final int LEFT = -10;public static final int RIGHT = 10;public static final int ROWS = 400;/ROWS行。宽度范围,public static final int COLS = 500;/COLS列。长度范围public Worm() getWorm().add(new Node(90, 90);/第90行90列,蛇扩大10倍getWorm().add(new Node(80, 90);getWorm().add(new Node(70, 90);getWorm().add(new Node(60, 90);getWorm().add(new Node(50, 90);dir = RIGHT; public void step() / 走一步Node head=getWorm().get(0);/ 找到头节点int x = head.getX() + dir / 10 * 10;/X,Y横坐标与纵坐标int y = head.getY() + dir % 10 * 10;if (x > 0 && x < Worm.COLS && y > 0 && y < Worm.ROWS - 30&& !getWorm().contains(new Node(x, y) /!getWorm().contains(new Node(x, y)是否落到蛇身上getWorm().addFirst(new Node(x, y);getWorm().removeLast();/删除 else dir = 100;throw new RuntimeException("你错了!");public void step(int dir) / 控制蛇走的方向this.dir = dir;step();public LinkedList<Node> getLinkedListWorm() return getWorm();public String toString() return getWorm().toString();/输出蛇public LinkedList<Node> getWorm() return worm;public void setWorm(LinkedList<Node> worm) this.worm = worm;3、WormDemo类import java.awt.Cursor;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;public class WormDemo extends JFrame /private Wormpanel panel;private static int dir;public WormDemo()panel=new Wormpanel();/形成蛇的界面add(panel);/将蛇面板放到游戏里面去setTitle("贪吃蛇");/题目setSize(500+15,400+35);/大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/关闭窗口就是关闭程序setCursor(new Cursor(12);/定义鼠标属性setVisible(true);/可视化为truepanel.requestFocus();/面板后区信息焦点setLocationRelativeTo(null);/设置窗口组建定义的位置this.setResizable(false);public static void main(String args)final WormDemo wd=new WormDemo();/new一个自己创建的一个属性游戏窗口/设置一个监听JMenuBar jmb=new JMenuBar();/导包,然后设置wd.setJMenuBar(jmb);/往自己new的窗口加上监听JMenu fm=new JMenu("选项");jmb.add(fm);JMenuItem mi=new JMenuItem("重新再来");/mi.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)wd.panel.setWorm(new Worm();wd.panel.setN(10);wd.panel.setFoods(wd.panel.initFoods(wd.panel.n);wd.panel.setT(1000);wd.panel.repaint();/重新画wd.repaint(););fm.add(mi);JMenuItem mi2=new JMenuItem("暂停");mi2.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)dir=wd.panel.getWorm().dir;wd.panel.getWorm().dir=-100;);fm.add(mi2);JMenuItem mi3=new JMenuItem("开始");mi3.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)/dir=wd.panel.getWorm().dir;wd.panel.getWorm().dir=dir;);fm.add(mi3);4、 Wormpanel 类import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.HashSet;import java.util.Iterator;import java.util.Random;import java.util.Set;import javax.imageio.ImageIO;import javax.swing.JPanel;/JPanelpublic class Wormpanel extends JPanel/蛇的面板上有蛇,食物 private static final String TOOL_TIP_TEXT_KEY_ERROR = null;private Worm worm; private MoveListener listener=new MoveListener();/监听器 private Set<Node> foods=new HashSet<Node>();/设置食物 public int n=10;/个数 public int t=1000;/时间 public int getN() return n; public void setN(int n) this.n=n; public int getT() return t; public void setT(int t) this.t=t; public void setFoods(Set<Node>foods) this.foods=foods; private Service se =new Service(); public Wormpanel() setWorm(new Worm();/生成一条蛇 foods=initFoods(n);/生成食物 addKeyListener(listener);/加上监听器,监听键盘 se.start();/启动线程 public Set<Node> initFoods(int n) Set<Node>foods=new HashSet<Node>();/食物也是Random random=new Random();for(;)int x=random.nextInt(480)/10*10+10;int y=random.nextInt(360)%10*10+10;if(getWorm().getLinkedListWorm().contains(new Node(x,y)/检查食物是否在蛇上continue;foods.add(new Node(x,y);if(foods.size()=n)break;return foods;/加入背景图片public static BufferedImage image;public static BufferedImage getImage() return image;public static void setImage(BufferedImage image)Wormpanel.image=image;/制作面板,形成面板的形式public void paint(Graphics g)super.paint(g);this.requestFocus();/设置接收信息/this.setBackground(Color.blue);/背景色tryg.drawImage(ImageIO.read(Wormpanel.class.getResource("yy.jpg"), 0, 0, null);catch(IOException e)e.printStackTrace();g.setColor(Color.gray);/画笔色g.fill3DRect(0, 0, 502, 10, false);g.fill3DRect(500, 0, 11, 385, false);g.fill3DRect(0, 375, 520, 10, false);g.fill3DRect(0, 0, 10, 502, false);for(int i=0;i<getWorm().getLinkedListWorm().size();i+)/画虫g.setColor(Color.cyan);/蓝绿色g.fill3DRect(getWorm().getLinkedListWorm().get(i).getX(),getWorm().getLinkedListWorm().get(i).getY(),10,10,false);/虫子的一节if(foods.size()=0)foods=initFoods(+n);t=t-200;Iterator<Node>food=foods.iterator();g.setColor(Color.GREEN);while(food.hasNext()Node f=food.next();g.fill3DRect(f.getX(), f.getY(), 10, 10, false);/画结束界面public void paintEnd(Graphics g)g.setColor(Color.red);/设置画笔颜色g.setFont(new Font(TOOL_TIP_TEXT_KEY,ERROR,30);g.clearRect(0, 150, 550, 100);g.setColor(Color.black);g.fill3DRect(0, 150, 550, 100, false);g.clearRect(150, 180, 200, 40);g.setColor(Color.red);g.drawString("you die!",150,200);Service.interrupted();/跳出线程public Worm getWorm() return worm;public void setWorm(Worm worm) this.worm = worm;class MoveListener extends KeyAdapterint dir;/设置键盘监听器public void keyPressed(KeyEvent e)System.out.println("您按下的是:"+e.getKeyChar();switch(e.getKeyCode()case KeyEvent.VK_UP:dir=Worm.UP;break;case KeyEvent.VK_DOWN:dir=Worm.DOWN;break;case KeyEvent.VK_LEFT:dir=Worm.LEFT;break;case KeyEvent.VK_RIGHT:dir=Worm.RIGHT;break;System.out.println(getWorm();System.out.println("dir="+dir+",worm.dir="+getWorm();step(dir,getWorm(); class Service extends Thread public void run() try for(;) Thread.sleep(t); step(getWorm().dir,getWorm(); catch (Exception e) e.printStackTrace(); public void step(int dir,Worm worm) if(dir+worm.dir=0) paintEnd(Wormpanel.this.getGraphics(); worm.dir=100; return; else if(worm.dir=100) paintEnd(Wormpanel.this.getGraphics(); return; if(worm.dir=-100) return; Node head=worm.getLinkedListWorm().get(0); int x=head.getX()+dir/10*10; int y=head.getY()+dir%10*10; Node n=new Node(x,y); if(foods.contains(n)&&!worm.getLinkedListWorm().contains(n) foods.remove(n); worm.getLinkedListWorm().addFirst(n); worm.dir=dir; else try worm.step(dir); catch (Exception e) paintEnd(Wormpanel.this.getGraphics(); return; Wormpanel.this.repaint(); 执行结果:(1)游戏开始(2)菜单栏(3)结束7 实验总结 在这次试验中主要是对Java中的知识进一步的熟悉,了解javaCUI编程特别是窗口、菜单,熟悉Java的事件委托处理机制,完成鼠标和键盘的事件处理,在编写游戏中要把游戏划分为几个模块,以及运用多个类完成,了解相关的游戏设计和实现模式,在编写过程中还要设计可视化界面,添加其他必要组件,对窗体进行相应的键盘事件处理,使蛇能移动,在这次试验中用到了Node类、Worm类、WormDemo类、WormPanel类进行实现各个功能,在编写的过程中对一些部分不是很了解,对一些知识掌握不是很透彻,在今后的学习中应多看书,多思考,多联系,来提高自己的能力。