电子与信息工程系开放性实验报告JAVA程序设计开放性实验报告专业:计算机科学与技术班级:2012级2班学号:姓名:实验报告实验2贪吃蛇游戏设计(4学时)1.实验内容(1)创建软件主窗体和相关控制菜单;在窗体中以图形模拟蛇的形状,使用键盘控制图形在窗体中任意移动,模拟贪吃蛇的行为.(2)在窗体中可以设置障碍或奖励物品,以达到游戏的娱乐性。2.预习内容JavaGUI编程;鼠标和键盘的事件处理;Java多媒体编程。3.实验类型综合性4.实验目的(1)了解JavaGUI编程特别是窗体,菜单;熟悉Java的事件委托处理机制,能完成鼠标和键盘的事件处理;(2)熟悉Java中的多媒体技术如:音频文件的播放控制,游戏中各种事件的音效添加。熟悉Java中的绘图操作,可以使用绘图函数进行图形的绘制和重绘等基本操作;(3)熟悉模块的划分及游戏控制类的编写,了解相关的游戏设计和实现模式;(4)设计可视化界面,添加其他必要组件,对窗体进行相应的键盘事件处理,使蛇能移动,依据实验内容结合自己的设计想法,实现模拟贪吃蛇的游戏效果。5.实验要求依据实验内容,编写相关类,实现所需软件功能。6.实验过程(分析设计、源文件、执行结果)代码如下:1、Node类publicclassNode{privateintx;privateinty;publicNode(){}publicNode(intx,inty){this.x=x;this.y=y;}publicintgetX(){returnx;}publicvoidsetX(intx){this.x=x;}publicintgetY(){returny;}电子与信息工程系开放性实验报告publicvoidsetY(inty){this.y=y;}publicStringtoString(){//方便类型转换//括号里不是String类型通过toString来转换,不然会输出一个地址return(+x+,+y+);}@Override//伪代码可以理解为注释,重写:下面的方法名是否在父类中存在,如果没有//的话会报错。//publicinthashCode(){//假设Node是list集合里面,只有把Node节点对象//放在set集合时候写hashCode();finalintprime=31;intresult=1;result=prime*result+x;result=prime*result+y;returnresult;}@Override//比较Node对象是否在同一坐标都要写上equals方法publicbooleanequals(Objectobj){if(this==obj){returntrue;}if(this==null){returnfalse;}if(getClass()!=obj.getClass())returnfalse;Nodeother=(Node)obj;if(x!=other.x){returnfalse;}if(y!=other.y){returnfalse;}returntrue;}}2、Worm类importjava.util.LinkedList;publicclassWorm{privateLinkedListNodeworm=newLinkedListNode();intdir;publicstaticfinalintUP=-1;publicstaticfinalintDOWN=1;publicstaticfinalintLEFT=-10;publicstaticfinalintRIGHT=10;publicstaticfinalintROWS=400;//ROWS行。宽度范围,publicstaticfinalintCOLS=500;//COLS列。长度范围publicWorm(){getWorm().add(newNode(90,90));//第90行90列,蛇扩大10倍getWorm().add(newNode(80,90));getWorm().add(newNode(70,90));getWorm().add(newNode(60,90));getWorm().add(newNode(50,90));dir=RIGHT;}publicvoidstep(){//走一步Nodehead=getWorm().get(0);//找到头节点intx=head.getX()+dir/10*10;//X,Y横坐标与纵坐标inty=head.getY()+dir%10*10;if(x0&&xWorm.COLS&&y0&&yWorm.ROWS-30实验报告&&!getWorm().contains(newNode(x,y))){//!getWorm().contains(newNode(x,y))是否落到蛇身上getWorm().addFirst(newNode(x,y));getWorm().removeLast();//删除}else{dir=100;thrownewRuntimeException(你错了!);}}publicvoidstep(intdir){//控制蛇走的方向this.dir=dir;step();}publicLinkedListNodegetLinkedListWorm(){returngetWorm();}publicStringtoString(){returngetWorm().toString();//输出蛇}publicLinkedListNodegetWorm(){returnworm;}publicvoidsetWorm(LinkedListNodeworm){this.worm=worm;}}3、WormDemo类importjava.awt.Cursor;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;publicclassWormDemoextendsJFrame{//privateWormpanelpanel;privatestaticintdir;publicWormDemo(){panel=newWormpanel();//形成蛇的界面add(panel);//将蛇面板放到游戏里面去setTitle(贪吃蛇);//题目setSize(500+15,400+35);//大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口就是关闭程序setCursor(newCursor(12));//定义鼠标属性setVisible(true);//可视化为truepanel.requestFocus();//面板后区信息焦点setLocationRelativeTo(null);//设置窗口组建定义的位置this.setResizable(false);}publicstaticvoidmain(String[]args){finalWormDemowd=newWormDemo();//new一个自己创建的一个属性游戏窗口//设置一个监听电子与信息工程系开放性实验报告JMenuBarjmb=newJMenuBar();//导包,然后设置wd.setJMenuBar(jmb);//往自己new的窗口加上监听JMenufm=newJMenu(选项);jmb.add(fm);JMenuItemmi=newJMenuItem(重新再来);//mi.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){wd.panel.setWorm(newWorm());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);JMenuItemmi2=newJMenuItem(暂停);mi2.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){dir=wd.panel.getWorm().dir;wd.panel.getWorm().dir=-100;}});fm.add(mi2);JMenuItemmi3=newJMenuItem(开始);mi3.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){//dir=wd.panel.getWorm().dir;wd.panel.getWorm().dir=dir;}});fm.add(mi3);}}4、Wormpanel类importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Random;importjava.util.Set;importjavax.imageio.ImageIO;importjavax.swing.JPanel;//JPanelpublicclassWormpanelextendsJPanel{//蛇的面板上有蛇,食物privatestaticfinalStringTOOL_TIP_TEXT_KEY_ERROR=null;privateWormworm;privateMoveListenerlistener=newMoveListener();//监听器privateSetNodefoods=newHashSetNode();//设置食物publicintn=10;//个数publicintt=1000;//时间publicintgetN(){returnn;}publicvoidsetN(intn){实验报告this.n=n;}publicintgetT(){returnt;}publicvoidsetT(intt){this.t=t;}publicvoidsetFoods(SetNodefoods){this.foods=foods;}privateServicese=newService();publicWormpanel(){setWorm(newWorm());//生成一条蛇foods=initFoods(n);//生成食物addKeyListener(listener);//加上监听器,监听键盘se.start();//启动线程}publicSetNodeinitFoods(intn){SetNodefoods=newHashSetNode();//食物也是Randomrandom=newRandom();for(;;){intx=random.nextInt(480)/10*10+10;inty=random.nextInt(360)%10*10+10;if(getWorm().getLink