动物换位游戏java课设.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流动物换位游戏java课设.精品文档.成 绩 评 定 表学生姓名班级学号 专 业课程设计题目基于Java的动物换位游戏软件设计评语组长签字:成绩日期 2013 年 月 日课程设计任务书学 院信息学院专 业学生姓名班级学号 课程设计题目基于Java的动物换位游戏软件设计实践教学要求与任务:采用java技术设计动物换位游戏软件,设计要求如下:(1) 程序分为3个级别,用户可以通过界面上提供的菜单来选择“初级”、“中级”和“高级”这三个级别。对于“初级”级别,在水平排列的7块石头上的左右各有3个类型相同的动物,中间的石头上没有动物;对于“中级”级别,在水平排列的9块石头上的左右各有4个类型相同的动物,中间的石头上没有动物;对于“高级”级别,在水平排列的11块石头上的左右各有5个类型相同的动物,中间的石头上没有动物。(2) 用鼠标单击一个动物,如果该动物的前方的石头上没有动物,该动物就跳跃到该石头上,如果该动物前方的石头上有其他的动物,但隔位上的石头没有动物,该动物就越过自己前面的动物跳跃到石头上,其他情形时,该动物不跳跃(跳跃时不能超过2块石头)。(3) 左面的动物只能向右方跳跃,右面的动物只能向左方跳跃。(4) 用户可以通过单击界面上提供的按钮,让程序自动完成动物换位。(5) 可以随时单击界面上提供的按钮,重新开始当前的级别。(6) 用户通过菜单选项,可以选择左、右动物的图像。工作计划与进度安排: 第18周:布置课程设计任务,查阅资料,分组设计,程序调试。 第19周:程序调试,编写课程设计报告,验收,答辩。指导教师: 2013年 6月20日专业负责人: 2013年 6月20日学院教学副院长: 2013年 6月20日目录1.设计目的.42.设计内容.43.课程软件主要功能.44.类总体设计.44.1类组合关系图.54.2主类.54.3其他类.55.类详细设计(画UML图).66.关键类成员函数流程图及代码.7 6.1总体流程图 .7 6.2程序代码.87.软件运行结果.14 8.结论.16参考文献.161.设计目的 1.通过实验,使学生进一步加深面向对象的编程设计思想; 2.训练掌握、加深理解并巩固Java程序设计课程中所学到的基本概念、编程思路; 3.综合运用Java程序设计的编程方法,能够利用这些程序设计方法来解决工程和科研中常见的实际问题; 4.培养分析解决问题的实际动手能力,进一步提高进行大型程序设计的能力。2.设计要求 设计GUI界面的动物换位游戏,游戏的结果是让左右两组动物交换位置。具体内容如下:程序分为4个级别,用户可以通过界面上提供的菜单选择“初级”、“中级”、“高级”、“自定义”这4个级别。对于“初级”级别,在水平排列的7块石头上的左右各有3个类型相同的动物,中间的石头上没有动物;对于“中级”级别,在水平排列的9块石头上的左右各有4个类型相同的动物,中间的石头上没有动物;对于“高级”级别,在水平排列的11块石头上的左右各有5个类型相同的动物,中间的石头上没有动物;对于“自定义”级别,用户可以输入自己想设置的一个动物数量(输入的数必须是偶数),在水平排列的N块石头上的左右各有(N-1)/2个类型相同的动物,中间的石头上没有动物。3.课程软件主要功能 程序分为不同的级别,左右各有动物,中间石头没有动物,将左右动物交换,不可后退。用鼠标单击一个动物,如果该动物前方的石头上没有动物,该动物就跳跃到该石头上,如果该动物前方的石头上有动物,但隔位上的石头没有动物,该动物就越过自己前面的动物跃到石头上,其他情形时,该动物不能跳跃。如果对游戏有疑问可以点击帮助,查看游戏规则。不能持续玩的可以点自动演示,将自动完成游戏,可以帮助游戏者更好的了解系统的主体功能4.类总体设计设计动物换位时需要编写10个Java源文件:ChangeAnimalWindow.java、Point.java、Animal.java、Stone.java、HandleMouse.java、AutoMoveAnimal.java、People.java、Record.java、ShowRecordDialog.java和Customdlg.java。动物换位除了需要编写上述10个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如:JmenuItem、File和Jbutton类等。动物换位所用到的一些重要的类以及之间组合关系如图4-1所示。 4.1类组合关系图以下是10个Java源文件的总体设计:图4-1 类之间的组合关系 4.2主类 ChangeAnimalWindow.javaChangeAnimalWindow类负责创建动物换位的主窗口,该类含有main方法,程序从该类开始执行。 4.3其他类Animal.javaAnimal类是JPanel的一个子类,创建的对象是ChangeAnimalWindow类的重要成员之一,用来表示“动物”。Point.java Point类负责创建确定位置的对象,使用Point对象,可以确定Animal以及Stone对象在窗体中的位置。Stone.javaStone类是JButton的一个子类,创建的对象表示“石头”。HandleMouse.javaHandleMouse类所创建的对象负责处理鼠标事件。AutoMoveAnimal.javaAutoMoveAnimal类所创建的对象使用算法完成动物的自动换位。Customdlg.javaCustomdlg类所创建的对象用来设置“自定义”级别的动物数量。People.javaPeople对象封装用户的名字和成绩,以便ShowRecordDialog对象可以排序。Record.java Record类是javax.swing包中JDialog对话框的子类,当用户成功完成相应级别的游戏时,Record创建的对象负责保存用户的名字和成绩到相应的级别文件中。ShowRecordDialog.javaShowRecordDialog类是javax.swing包中JDialog对话框的子类,当用户单击查看相应的级别排行榜时,ShowRecordDialog创建的对象负责显示用户的成绩。5.类详细设计(画UML图)ChangeAnimalWindow类是javax.swing包中的JFrame的一个子类,并实现了ActionListener接口,标明该类的主要成员变量和方法的UML图如图5-1所示。以下是UML图中有关数据和方法的详细说明:图5-1 ChangeAnimalWindow类的UML图6.关键类成员函数流程图及代码 6.1总体流程图 图6-1 总体流程图 6.2程序代码import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.ArrayList;import java.io.*;import javax.swing.filechooser.*;public class ChangeAnimalWindow extends JFrame implements ActionListener int amountOfAnimal=6; int distance=80; Animal animal; Point point; Stone stone; HandleMouse handleMouse; AutoMoveAnimal autoMoveAnimal; File leftImageFile,rightImageFile; JButton renew,quit,autoButton=null; JMenuBar bar; JMenu menuGrade,menuImage; JMenuItem oneGradeItem,twoGradeItem,threeGradeItem; JMenuItem leftIamge,rightIamge,defaultImage; JPanel pCenter; ChangeAnimalWindow() pCenter=new JPanel(); pCenter.setBackground(Color.lightGray); pCenter.setLayout(null); handleMouse=new HandleMouse(); autoMoveAnimal=new AutoMoveAnimal(); leftImageFile=new File("dog.jpg"); rightImageFile=new File("cat.jpg"); init(); bar=new JMenuBar(); menuGrade=new JMenu("选择级别"); menuImage=new JMenu("选择动物图像(JPG,GIF)"); oneGradeItem=new JMenuItem("初级"); twoGradeItem=new JMenuItem("中级"); threeGradeItem=new JMenuItem("高级"); leftIamge=new JMenuItem("左面动物的图像"); rightIamge=new JMenuItem("右面动物的图像"); defaultImage=new JMenuItem("左右面动物的默认图像");menuGrade.add(oneGradeItem); menuGrade.add(twoGradeItem); menuGrade.add(threeGradeItem); menuImage.add(leftIamge); menuImage.add(rightIamge); menuImage.add(defaultImage); bar.add(menuGrade); bar.add(menuImage); setJMenuBar(bar); oneGradeItem.addActionListener(this); twoGradeItem.addActionListener(this); threeGradeItem.addActionListener(this); leftIamge.addActionListener(this); rightIamge.addActionListener(this); defaultImage.addActionListener(this); renew=new JButton("重新开始"); renew.addActionListener(this); autoButton=new JButton("自动演示"); autoButton.addActionListener(this); quit=new JButton("撤消"); quit.addActionListener(this); JPanel north=new JPanel(); north.add(renew); north.add(quit); north.add(autoButton); String mess="互换左右动物位置" JLabel hintMess=new JLabel(mess,JLabel.CENTER); north.add(hintMess); add(north,BorderLayout.NORTH); add(pCenter,BorderLayout.CENTER); JPanel south=new JPanel(); south.add(handleMouse); add(south,BorderLayout.SOUTH); setVisible(true); setBounds(60,60,710,300); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void init() animal=new AnimalamountOfAnimal;point=new PointamountOfAnimal+1; stone=new StoneamountOfAnimal+1; int space=distance; for(int i=0;i<point.length;i+) pointi=new Point(space,100); space=space+distance; for(int i=0;i<animal.length;i+) animali=new Animal(); animali.addMouseListener(handleMouse); if(i<animal.length/2) animali.setIsLeft(true); else animali.setIsLeft(false); for(int i=0;i<stone.length;i+) stonei=new Stone(); pCenter.add(stonei); stonei.setSize(distance*8/9,18); int w=stonei.getBounds().width; int h=stonei.getBounds().height; stonei.setLocation(pointi.getX()-w/2,pointi.getY(); pointi.setThisStone(stonei); for(int i=0;i<animal.length;i+) animali.setSize(distance*6/7,distance*3/4); int w=animali.getBounds().width; int h=animali.getBounds().height; pCenter.add(animali); if(i<animal.length/2) animali.setIsLeft(true); animali.setLeftImage(leftImageFile); animali.repaint(); animali.setLocation(pointi.getX()-w/2,pointi.getY()-h); animali.setAtPoint(pointi); pointi.setThisAnimal(animali); pointi.setIsHaveAnimal(true); else animali.setIsLeft(false); animali.setRightImage(rightImageFile); animali.repaint(); animali.setLocation(pointi+1.getX()-w/2,pointi+1.getY()-h); animali.setAtPoint(pointi+1); pointi+1.setThisAnimal(animali); pointi+1.setIsHaveAnimal(true); handleMouse.setPoint(point); handleMouse.setCountTime(true); autoMoveAnimal.setPoint(point); autoMoveAnimal.setStep(); public void setAmountOfAnimal(int m) if(m>=2&&m%2=0) amountOfAnimal=m; public void removeAnimalAndStone() for(int i=0;i<point.length;i+) if(pointi.getThisAnimal()!=null) pCenter.remove(pointi.getThisAnimal(); for(int i=0;i<stone.length;i+) if(pointi.getThisStone()!=null) pCenter.remove(pointi.getThisStone(); pCenter.validate(); pCenter.repaint(); public void needDoing() init(); handleMouse.initStep(); handleMouse.initSpendTime(); handleMouse.setCountTime(true); autoMoveAnimal.setPoint(point); public void actionPerformed(ActionEvent e) if(e.getSource()=oneGradeItem) distance=80; removeAnimalAndStone(); setAmountOfAnimal(6); needDoing(); else if(e.getSource()=twoGradeItem) distance=70; removeAnimalAndStone(); setAmountOfAnimal(8); needDoing(); else if(e.getSource()=threeGradeItem) distance=60; removeAnimalAndStone(); setAmountOfAnimal(10); needDoing(); else if(e.getSource()=renew) removeAnimalAndStone(); needDoing(); else if(e.getSource()=autoButton) removeAnimalAndStone(); needDoing(); handleMouse.setCountTime(false); autoMoveAnimal.setStep(); int x=this.getBounds().x+this.getBounds().width/2; int y=this.getBounds().y+this.getBounds().height; autoMoveAnimal.setLocation(x,y); autoMoveAnimal.setSize(this.getBounds().width/2,120); autoMoveAnimal.setVisible(true); else if(e.getSource()=quit) ArrayList<Integer> step=handleMouse.getStep(); int length=step.size(); int start=-1,end=-1; if(length>=2) end=step.get(length-1); start=step.get(length-2); step.remove(length-1); step.remove(length-2); Animal ani=pointend.getThisAnimal(); int w=ani.getBounds().width; int h=ani.getBounds().height; ani.setLocation(pointstart.getX()-w/2,pointstart.getY()-h); ani.setAtPoint(pointstart); pointstart.setThisAnimal(ani); pointstart.setIsHaveAnimal(true); pointend.setIsHaveAnimal(false); else if(e.getSource()=leftIamge) JFileChooser chooser=new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); chooser.setFileFilter(filter); int state=chooser.showOpenDialog(null); File file=chooser.getSelectedFile(); if(file!=null&&state=JFileChooser.APPROVE_OPTION) leftImageFile=file; for(int i=0;i<animal.length;i+) if(animali.getIsLeft()=true) animali.setLeftImage(leftImageFile); animali.repaint(); else if(e.getSource()=rightIamge) JFileChooser chooser=new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); chooser.setFileFilter(filter); int state=chooser.showOpenDialog(null); File file=chooser.getSelectedFile(); if(file!=null&&state=JFileChooser.APPROVE_OPTION) rightImageFile=file; for(int i=0;i<animal.length;i+) if(animali.getIsLeft()=false) animali.setRightImage(rightImageFile); animali.repaint(); else if(e.getSource()=defaultImage) leftImageFile=new File("dog.jpg"); rightImageFile=new File("cat.jpg"); for(int i=0;i<animal.length;i+) if(animali.getIsLeft()=true) animali.setLeftImage(leftImageFile); else animali.setRightImage(rightImageFile); animali.repaint(); validate(); public static void main(String args) new ChangeAnimalWindow();7.软件运行结果进入游戏主界面:图7-1 主界面图当用户不知怎么游戏时,可以按下自动演示,可以帮助用户更好的了解,当用户按下自动演示时如图所示:图7-2自动演示按钮调试图选择级别菜单调试如图所示:图7-3 选择难度中级图 用户觉得动物图像太单调时,本系统可以有一个选择不同动物图像的功能,根据用户需求,可以选择左边图像或右边图像,当然也可以恢复默认图像,根据多变的选择如图所示:图7-4 选择左边动物图8.结论这此课程设计我们做的是“动物换位”游戏,主要是让左右两边相同数量的动物通过中间一个空的石头,左边的动物要全部跳到右边的石头上,右边的动物要全部跳到左边的石头上。游戏中采用的技术主要有:AWT组件及事件处理、输入输出流、Java与多媒体、Java Swing和图形图像等。虽然游戏的基本功能都已实现,但还是存在许多问题尚待解决,还是有许多需要改进的地方。比如对“自定义”级别动物数量设置中,数量输入时不能太大,否则在主窗口显示的动物图像会非常窄小。建议应设定一个上限,当达到上限时弹出提示信息,提醒用户“您输入的数量太大”。对“我超时了吗”,如果超时,则弹出提示消息后,左右两边图像被其他图像代替。但是如果在没有关闭游戏时,重新开始再玩一盘,如果再超时,同样弹出提示信息,但图像不会再调换。因此,建议能在此改进,使得能不停调换。对“英雄榜”中记录用户玩游戏时的成绩,但不能在当玩家成绩在排行榜中排进前三弹出提示信息。在此希望在以后的学习中继续有所改进,争取做到更好。最后通过这次课程设计让我对Java语言的运用更加的熟练,在与同学交流沟通方面也有所收获。在实践中成长,在思考中奋进,学习的路程是很遥远的,所以我们要在不断的淬炼中更加努力向前。9.参考文献1耿祥义,张跃平. Java2实用教程(第三版)M . 北京:清华大学出版社, 2006 2耿祥义. Java课程设计(第三版)M . 北京:清华大学出版社, 20043张跃平.Java2实用教程实验指导与习题解答(第三版)M. 北京:清华大学出版社,20044朱喜福等. Java程序设计 . 人民邮电出版社,20055吴其庆. Java程序设计实例教程. 冶金工业出版社,20066陈国君等编著. Java2程序设计基础.北京:清华大学出版社,2006