用java设计实现一个简单的动作冒险类游戏
1、背景
这是java老师布置的本周作业,具体题目截图如下
2、分析
在UML图已经给出的前提下,此作业很容易。自己在此基础上,加了个简单的界面设计和玩家设定的历史记录设计。整体设计见下面自己画的UML图(未加联系的模块间为组合关系),具体设计代码附在下面,加上了详细注释。
3、具体代码设计(附详细注释,共13个.java文件)
(1)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public interface WeaponBehavior { // 武器接口
void useWeapon(); // 玩家使用的武器
}
(2)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class AxeBehavior implements WeaponBehavior { // 斧头类,实现接口WeaponBehavior
@Override
public void useWeapon() {
// TODO Auto-generated method stub
System.out.println("选择技能:使用斧头劈砍");
}
}
(3)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class BowAndArrowBehavior implements WeaponBehavior { // 弓箭类,实现接口WeaponBehavior
@Override
public void useWeapon() {
// TODO Auto-generated method stub
System.out.println("选择技能:使用弓箭射击");
}
}
(4)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class KnifeBehavior implements WeaponBehavior { // 匕首类,实现接口WeaponBehavior
@Override
public void useWeapon() {
// TODO Auto-generated method stub
System.out.println("选择技能:使用匕首刺杀");
}
}
(5)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class SwordBehavior implements WeaponBehavior { // 剑类,实现接口WeaponBehavior
@Override
public void useWeapon() {
// TODO Auto-generated method stub
System.out.println("选择技能:使用剑刺杀");
}
}
(6)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class Character { // 超类,人物角色
WeaponBehavior weaponBehavior; // 武器接口对象
void display() {} // 显示玩家角色设定
void fight() {} // 说明玩家战斗所使用的武器技能
void setWeponBehaivor(WeaponBehavior weaponBehavior) { // 设定人物角色的武器行为
this.weaponBehavior = weaponBehavior;
}
}
(7)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class King extends Character { // 国王类,用于继承父类Character,并重写其中的两方法
void display() {
System.out.println("我是一位国王");
}
void fight() {
weaponBehavior.useWeapon();
}
}
(8)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class Queen extends Character {// 女王类,用于继承父类Character,并重写其中的两方法
void display() {
System.out.println("我是一位女王");
}
void fight() {
weaponBehavior.useWeapon();
}
}
(9)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class Knight extends Character {// 骑士类,用于继承父类Character,并重写其中的两方法
void display() {
System.out.println("我是一位骑士");
}
void fight() {
weaponBehavior.useWeapon();
}
}
(10)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class Troll extends Character {// 巨魔战将类,用于继承父类Character,并重写其中的两方法
void display() {
System.out.println("我是巨魔战将");
}
void fight() {
weaponBehavior.useWeapon();
}
}
(11)
package ActionRisk;
import java.util.Scanner;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class SurfaceDesign { // 界面设计
public void setSurface(){ // 设定显示的界面
Character character = null; // 人物类对象
int chooseCharacter = 0; // 人物选项
int chooseWeapon = 0; // 武器选项
Scanner input = new Scanner(System.in);
String playerName = null; // 玩家姓名
System.out.println("请输入玩家姓名");
if(input.hasNext()){
playerName = input.next();
}
// 选择游戏角色操作
System.out.println("\n请选择游戏角色:");
System.out.println(" 1.国王");
System.out.println(" 2.女王");
System.out.println(" 3.骑士");
System.out.println(" 4.巨魔战将");
System.out.println("请输入选择");
String setCharacter = "设置游戏角色为:";
if(input.hasNext()){
chooseCharacter = input.nextInt();
}
switch(chooseCharacter){
case 1:
character = new King(); // 使用对象的上转型对象
setCharacter += "国王";
break;
case 2:
character = new Queen(); // 使用对象的上转型对象
setCharacter += "女王";
break;
case 3:
character = new Knight(); // 使用对象的上转型对象
setCharacter += "骑士";
break;
case 4:
character = new Troll(); // 使用对象的上转型对象
setCharacter += "巨魔战将";
break;
default:
System.out.println("您的选择出错,请重新选择");
}
// 选择武器操作
System.out.println("\n请选择使用的武器");
System.out.println(" 1.斧头");
System.out.println(" 2.匕首");
System.out.println(" 3.剑");
System.out.println(" 4.弓箭");
System.out.println("请输入您的选择:");
String setWeapon = "选择武器为:";
if(input.hasNext()){
chooseWeapon = input.nextInt();
}
switch(chooseWeapon){
case 1:
character.setWeponBehaivor(new AxeBehavior()); // 使用接口回调
setWeapon += "斧头";
break;
case 2:
character.setWeponBehaivor(new KnifeBehavior()); // 使用接口回调
setWeapon += "匕首";
break;
case 3:
character.setWeponBehaivor(new SwordBehavior()); // 使用接口回调
setWeapon += "剑";
break;
case 4:
character.setWeponBehaivor(new BowAndArrowBehavior()); // 使用接口回调
setWeapon += "弓箭";
break;
default:
System.out.println("您的选择出错,请重新选择");
}
// 人物行为演示
System.out.println();
character.display(); // 显示玩家角色设定
character.fight(); // 说明玩家战斗所使用的武器技能
// 对当前玩家游戏设定信息进行存档
System.out.println("\n提示:");
System.out.println(playerName + "您的当前游戏设定已经存档,历史记录放在history.txt文件中");
SaveHistory history = new SaveHistory();
history.setRole(playerName, setCharacter, setWeapon); // 初始化
history.doSaveHistory(); // 具体保存操作
}
}
(12)
package ActionRisk;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class SaveHistory {
String playerName = null; // 玩家姓名
String setCharacter = null; // 设定的人物角色
String setWeapon = null; // 设定的武器
public void setRole(String playerName,String setCharacter,String setWeapon){ // 初始化
this.playerName = playerName;
this.setCharacter = setCharacter;
this.setWeapon = setWeapon;
}
public void doSaveHistory(){ // 进行存储信息操作
try{
// 游戏设定时间设置
Date nowTime = new Date();
SimpleDateFormat matter = new SimpleDateFormat("'游戏设定时间为:'y年M月d日H时m分s秒");
String setPlayerTime = matter.format(nowTime);
// 文件缓冲流输出操作
File file = new File("history.txt"); // 若无名为history.txt的文件,则创建一个
FileWriter outOne = new FileWriter(file,true);
BufferedWriter outTwo = new BufferedWriter(outOne);
// 写入玩家姓名信息
outTwo.write(playerName);
outTwo.newLine();
// 写入游戏设定时间
outTwo.write(setPlayerTime);
outTwo.newLine();
// 写入设定的人物角色信息
outTwo.write(setCharacter);
outTwo.newLine();
// 写入设定的武器信息
outTwo.write(setWeapon);
outTwo.newLine();
outTwo.newLine();
// 关闭文件
outTwo.close();
outOne.close();
}catch(IOException e){ }
}
}
(13)
package ActionRisk;
/**
*
* @Author 孙琨
* @Date 2013-11-3
* @At XUST
* @All Copyright by 孙琨
*
*/
public class MainClass { // 测试类
public static void main(String[] args) {
// TODO Auto-generated method stub
SurfaceDesign surface = new SurfaceDesign(); // 创建界面设计对象
surface.setSurface(); // 具体设定界面操作
}
}
4、测试结果截图
(1)
(2)
(3)
(4)
5、打包成可执行文件(jar和exe)