耿祥义
1995年中国科学技术大学博士毕业,获理学博士学位。1997年从中山大学博士后流动站出站,现任大连交通大学教授。有多年教授Java语言的经验,已编写出版十余部教材。
报告PPT
案列实训——动物换位
1. 设计要求
2. 数据模型
3. 简单测试
4. 视图设计
5. GUI程序
6. 程序发布
7. 课程题目
------------------------------------------------------------------
1. 设计要求
设计GUI界面的动物换位游戏,游戏结果是让左右两组动物交换位置。具体要求如下:
1).在水平排列的7个位置上,左右各有3个类型相同的动物,中间的位置上没有动物。左边动物将其右侧视为自己的前进方向,右边动物将其左侧视为自己的前进方向。
2).用鼠标单击一个动物,如果该动物前方位置上没有动物,该动物就跳跃到该位置上,如果该动物前方位置有其他动物,但相隔一位的位置上没有其他动物,该动物就越过自己前面的动物跳跃至该隔位上,其他情形,该动物不能跳跃(跳跃时不能越过2个位置)。
3).左面的动物只能向右方跳跃,右面的动物只能向左方跳跃。
4).单击撤销按钮,撤销上一次移动的动物,单击重新开始按钮可重新开始游戏。
----------------------------------------------
按着MVC-Model View Control(模型,视图,控制器)的设计思想,展开程序的设计和代码的编写。数据模型部分相当于MVC中的Model角色,视图设计部分给出的界面部分相当于MVC中的View,视图设计部分给出的事件监视器相当于MVC中的Control。
-----------------------------------------------
2. 数据模型
●Animal类,封装了左右动物共同的属性和行为。
●LeftAnimal类,Animal的子类,封装了左边动物的独特行为。
●RightAnimal类,Animal的子类,封装了右边动物的独特行为。
●Point类,刻画动物可以到达的位置。
●ViewForAnimal类,封装制作动物视图的方法。
讲解顺序Animal ,Point
LeftAnimal,RightAnimal
ViewForAnimal
----------------------------------------------------------------------------
3 简单测试
按着源文件中的包语句,将相关的Java源文件保存到:
D:> ch1data
目录中。编译各个源文件,例如:
D:>javac /ch1/data/Animal.java
或一次编译全部源文件:
D:>javac /ch1/data/*.java
把1.2节给出的类看作一个小框架,下面用框架中的类编写一个简单的应用程序,测试左右动物运动换位.
★即在命令行,表述对象的行为过程。
★如果表述成功(如果表述困难,说明数据模型不是很合理),那么就为以后GUI程序设计提供了很好的对象功能测试。
★在后续的GUI设计中,仅仅重要的工作是为某些对象提供视图界面,并处理相应的界面事件而已。
将下列AppTest.java源文件按着包名保存到
D: ch1test
目录中,并编译源文件:
D:>javacch1/test/AppTest.java
如下运行AppTest类
D:>java ch1.test.AppTest
package ch1.test;
import ch1.data.*;
public class AppTest {
public static void main(String [] args) {
Point [] point = new Point[7]; //创建7个点
for(int i=0;i<point.length;i++) {
point[i] = new Point();
point[i].setX(i);
point[i].setY(10);
}
Animal [] left = new Animal[3]; //3个左边动物
Animal [] right = new Animal[3]; //3个右边动物
for(int i =0;i<left.length;i++ ){ //把左边动物放在点上
left[i] = new LeftAnimal();
left[i].setName("猫"+i);
left[i].setAtPoint(point[i]);
left[i].setAllCanAtPoint(point);
}
for(int i =0;i<right.length;i++ ){ //把右边动物放在点上
right[i] = new RightAnimal();
right[i].setName("狗"+i);
right[i].setAtPoint(point[4+i]);
right[i].setAllCanAtPoint(point);
}
input(point);
if(right[0].move()) //让右边第1个动物运动
input(point); //输出各个点上的有、无动物的信息
if(left[2].move())
input(point);
if(left[1].move())
input(point);
if(right[0].move())
input(point);
if(right[1].move())
input(point);
if(right[2].move())
input(point);
if(left[2].move())
input(point);
if(left[1].move())
input(point);
if(left[0].move())
input(point);
if(right[0].move())
input(point);
if(right[1].move())
input(point);
if(right[2].move())
input(point);
if(left[1].move())
input(point);
if(left[0].move())
input(point);
if(right[2].move())
input(point); //恭喜成功了
}
static void input(Point [] point){
for(int i=0;i<point.length;i++){
Animal animal=point[i].getAtPointAnimal();
if(animal!=null)
System.out.print(animal.getName());
else
System.out.print(" ");
}
System.out.println();
}
}
---------------------------------------------------------------------------
4. 视图设计
设计GUI程序除了使用1.2节给出的类以外,需要使用javax.swing包提供的视图(也称Java Swing框架)以及处理视图上触发的界面事件。GUI程序与1.3中简单的测试相比,可以提供更好的用户界面,完成1.1提出的设计要求。
GUI部分设计的类有:
●AnimalView类,其实例为动物提供外观显示。
●GamePanel类,其实例用于放置动物的外观,并组合负责处理界面事件的监视器。
●HandleAnimalMove类,其实例是一个监视器,该监视器负责处理AnimalView视图,即动物视图上触发的MouseEvent事件。当用户在动物视图上按下鼠标时,该监视器让动物执行move()方法、松开鼠标时,该监视器检查用户是否成功地将左右动物互换完毕。
●HandleRedo类,其实例是一个监视器,该监视器负责监视按钮上触发的ActionEvent事件,当用户单击按钮触发ActionEvent事件时,该监视器负责撤销用户移动动物的操作。
●HandleReStart类,其实例是一个监视器,该监视器负责监视按钮上触发的ActionEvent事件,当用户单击按钮触发ActionEvent事件时,该监视器负责将游戏还原成最初始的样子。
讲解顺序AnimalView GamePanel
HandleAnimalMove HandleRedo HandleReStart
--------------------------------------
5 GUI 程序
按着源文件中的包语句,将1.4节中相关的源文件保存到:
D: ch1view
目录中。编译各个源文件,例如:
D>javac ch1/view/ AnimalView.java
把1.2和1.4节给出的类看作一个小框架,下面用框架中的类编写GUI应用程序,完成1.1给出的设计要。
将下列AppWindow.java源文件按着包名保存到
D:> ch1/gui
目录中,并编译源文件:
D:>javac ch1/gui/AppWindow.java
或一次编译全部源文件:
D:>javac /ch1/view/*.java
建立名字是image和ch1同级别文件夹(这里需要在D:盘下建立),并将名字是cat.jpg和dog.jpg的图像文件保存到该image中。
AppWindow是JFrame的子类,其实例将GamePanel类的实例集成到窗体中,即提供游戏的主界面外观。如下运行AppWindow类
D:>java ch1.gui.AppWindow
AppWindow.java
package ch1.gui;
import javax.swing.*;
import java.awt.*;
import ch1.view.GamePanel;
public class AppWindow extends JFrame {
GamePanel gamePanel;
public AppWindow(){
setTitle("动物换位游戏");
gamePanel = new GamePanel();
gamePanel.setAnimalCount(6);
gamePanel.setLeftAnimalImage("image/cat.jpg");
gamePanel.setRightAnimalImage("image/dog.jpg");
add(gamePanel,BorderLayout.CENTER);
gamePanel.setBackground(Color.white);
JPanel northP = new JPanel();
northP.add(gamePanel.buttonReStart);
northP.add(gamePanel.buttonRedo);
add(northP,BorderLayout.NORTH);
setBounds(60,60,9*gamePanel.width+9*gamePanel.gap,300);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[] ){
AppWindow win = new AppWindow();
}
}
----------------------------------------------------------------------
6 程序发布
可以使用jar.exe命令制作JAR文件来发布软件。
1.)清单文件:
编写如下的清单文件(用记事本保存时需要将保存类型选择为“所有文件(*.*)”)
dongwu.mf
Manifest-Version: 1.0
Main-Class: ch1.gui.AppWindow
Created-By: 1.8
将ch1.mf保存到D:,即保存在包名所代表的目录的上一层目录中。
注意:清单中的Manifest-Version和1.0之间、Main-Class和主类ch1.gui.AppWindow之间以及Created-By和1.8之间必须有且只有一个空格。
2.用批处理文件发布程序
在命令行使用jar命令得到.jar文件:
D:>
jar cfm DongwuGame.jar dongwu.mfch1/data/*.class ch1/view/*.class ch1/gui/*.class
其中参数c表示要生成一个新的jar文件,f表示要生成的jar文件的名字,m表示清单文件的名字。如果没有任何错误提示,D:下产生一个名字是AnimalGame.jar的文件
编写如下的animalGame.bat,用记事本保存该文件时需要将保存类型选择为“所有文件(*.*)”。
animalGame.bat
path .jrebin
pause
javaw -jar DongwuGame.jar
将animalGame.bat,DongwuGame.jar和image文件夹(软件需要其他非class文件)复制到某个文件夹中,例如文件夹2000中。然后将调试程序使用的JDK安装目录下的JRE也复制到2000文件夹中。
可以将2000文件夹作为软件发布,也可以用压缩工具将2000下的所有文件压缩成.zip或.jar文件发布。用户解压后,双击animalGame.bat即可运行程序。
如果客户计算机上肯定有JRE,可以不把JRE复制到2000 中,同时去除bat文件中的path.jrebin内容。
-------------------------------
7 课设题目
1).动物换位游戏
在学习本章代码的基础上,改进动物换位游戏,可为程序增加任何合理的并有能力完成的功能,但至少要增加下列所要求的功能。
①在AppWindow类中增加菜单,该菜单下有三个菜单项,分别是初级,中级和高级。初级时,游戏中的动物是6个,中级时是8个,高级时是10个。
②在AppWindow类中增加菜单,该菜单下有2个菜单项,分别是“更改左动物图像”,和“更改右动物图像”。用户单击菜单项弹出文件对话框,比如,单击“更改左动物图像”菜单项,用户可以使用弹出的文件对话框为左边动物选择图像文件。
③增加音乐效果,动物运动时,程序能播放简短的声音,并且让左、右动物运动时,程序播放的声音不同(可参见第8章的ch8.view.PlayMusic类)。
④使用javax.swing.Timer类增加计时功能(可参见java2实用教程第5版的12.9或参考本书第6章的ch6.view.HandleMove类)
⑤如果完成了4,可为各个级别增加相应的“英雄榜”(建议看第8章的英雄榜:ch8.data.RecordOrShowRecord,ch8.view.Record和ch8.view.ShowRecord类)。当用户成功完成动物换位后,如果成绩能排进前三名,就弹出一个对话框,将用户的成绩保存到“英雄榜”。
⑥为每个级别的菜单项增加一个子菜单项,负责查看该级别的“英雄榜”。
2).自定义题目
通过老师指导或自己查找资料自创一个题目。
【专家著作】
-END-
责任编辑:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/14749.html