本片文章主要是记录这一个星期做项目的收获。 就根据一个界面一个界面的细说。
一.总体思路
创建游戏思路:
1.人物:创建一个固定属性的角色(role)
2.地点:创建一个建筑抽象类(Architecture)
3.事件:定义一个事件接口(IEvent)
4.NPC:创建一个怪兽抽象类(Monster)
游戏玩法思路:
人物来到地点,随机或者固定遇到NPC,产生事件;再由遇到的不同事件来修改人数的各个属性。最后存档人物的属性就可以达到保存进度的功能。
先来说明一下我的核心:也就是我这个游戏的主角,存档也就是为了存它。
角色的所有属性:
public class Role implements Serializable{
//以下是该角色的全部属性
private String name;//名字
private int ATK;//攻击力
private int DEF;//防御力
private int HP;//体力
private int WIT;//智力
private int AGI; //敏捷
private int HS; //血条
private List<Prop> bag = new ArrayList<Prop>();//背包
private List<Prop> inventory = new ArrayList<Prop>();//物品栏
private int key1=0;//小树林进入最终boss的计数器
private int key2 =0; //进入格兰之森的最终boss计时器
private int key3 = 0; //进入天空之城的最终boss计时器
//-------------------------------------------------
//初始化的内容和封装的方法我就不放上来了
}
开始界面
收获(1):序列化(保存文件),反序列化(读取文件)
1.序列化:存档
//序列化
public void serialize(Role role) {//传入我的角色role
try {
File file = new File("d:\\data\\"+role.getName());//根据我的对象role的名字来保存对应为的文件
FileOutputStream fos = new FileOutputStream(file);//创建文件输出流对象
ObjectOutputStream oos = new ObjectOutputStream(fos);//创建对象输出流的对象
oos.writeObject(role); //通过对象输出流来将role保存为文件
oos.close(); //文件输出流关闭
fos.close(); //对象输出流关闭
System.out.println("存档成功");
System.out.println("~~~~~~~~~~~~~~");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("存档失败");
System.out.println("~~~~~~~~~~~~~~");
}
}
2.反序列化:读档
public Role deserialization(File file) { //传入要读取的文件然后返回一个角色对象
Role role = null; //定义一个接受读取对象的空角色对象
FileInputStream fis = null;
try {
fis = new FileInputStream(file); //创建一个件输入流对象
ObjectInputStream ois = new ObjectInputStream(fis); //创建一个对象输入流对象
role = (Role) ois.readObject(); //将读取到的对象保存到role里面
ois.close(); //文件输入流关闭
fis.close(); //对象输入流关闭
System.out.println("读档成功");
System.out.println("~~~~~~~~~~~~~~");
} catch (Exception e) {
System.out.println("读档失败");
System.out.println("~~~~~~~~~~~~~~");
//下面的这条信息是当初一个错误的操作,本来想着如果文件读取失败就删除该文件,但是发现不管怎么删除都不能删除。
//最后找到的原因是:当读取失败也就是读到role = (Role) ois.readObject();就会报错直接跳到了catch里面,文件流没有关闭,无法删除文件
file.delete();
}
return role;
}
3.得到要读档的文件:
//1.创建一个存档根目录文件夹的对象,我的存档放在来D盘 "D:\\data"
File file = new File("D:\\data");
//2.将创建一个保存目录中所有文件名的数组
File[] files = file.listFiles();
//3.遍历数组中的文件名,从而实现选择读档的功能
for(int i = 0;i < files.length;i++){
//4.打印要目录所有文件名
System.out.println((i+1)+"."+files[i].getName());
}
//5.根据控制台接收到的值来确定要读取的文件
Scanner input = new Scanner(System.in);//定义一个scanner对象
int tmp = input.nextInt();
//6.得到该文件
file = files[tmp - 1];
收获(2):
1.随机事件
本次小游戏里面的随机事件主要方式:利用switch选择结构和Random工具类。
//1.Random类默认构造方法
Random random = new Random();
//2.产生1到4的随机数
int tmp = random.nextInt(4)+1;
//3.根据tmp产生不可知的随机事件
switch(tmp){
case 1:
//(任意的随机事件),比如遇到同学,遇到怪兽等等。
break;
case 2:
//...
break;
//...
}
2.产生不同属性的怪兽:
public abstract class Monster(){
private String name;//怪兽名字
private int ATK; //怪兽攻击力
private int DEF; //怪兽防御力
private int HP; //怪兽血量
//set,get方法此处省略
//构造方法
public Monster(int i){
this.ATK = 50 + i*20;
this.DEF = 30 + i*10;
this.HP = 200 = i*50;
}
}
总结:
做这个游戏,让我对java的文件操作有来了进一步的熟悉(序列化与反序列化);怎么样保存为文件,怎么样读取一个文件。其中更重要的是:明白了我为什么要做一个文件操作,知道了需要对谁、那一个对象、或那一个属性进行操作。拿到上面的游戏系统。刚开始我是非常模糊的,发现这么多的东西,该从何保存起啊!!,一脸懵逼(⊙_⊙;)。最后细下心来,发现我的核心是游戏主角呀,只要将所有固定不能重置的字段保存就行了。然后将所有不可被重置的全放在了角色里。
以上就是对上一周的总结了,希望下周的课程能够更愉快哈哈嗝~。