一. 问题描述
1.功能描述:几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
2.游戏角色应有的属性本题目要求的游戏角色应有以下属性:
名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3. 职业限制
4.初始属性:本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。
例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
5.显示信息:最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
二.流程图及类图
三.完整代码
- Role类:定义角色的姓名、性别:
import java.util.Scanner;
public class Role {//定义角色的性别、姓名private String name; //姓名private int gender; //性别//获取姓名public String getName() {return name;}//设置姓名public void setName(String name) {this.name = name;}//获取性别public int getGender() {return gender;}//设置性别public void setGender(int gender) {this.gender = gender;}//获取到角色的姓名跟性别public int Define(){System.out.println("请输入您游戏角色的姓名:");Scanner in=new Scanner(System.in);this.name=in.next();while(true){System.out.println("请选择角色的性别:(0.男 1.女)");this.gender=in.nextInt();if(gender==0||gender==1){break;}else{System.out.println("请选择0或1来选择性别!");}}return gender;}//输出角色的姓名跟性别public void output(){System.out.println("===============================");System.out.println("姓名\t\t\t\t"+this.name);System.out.println("===============================");if(this.gender==0){System.out.println("性别\t\t\t\t"+"男");}else{System.out.println("性别\t\t\t\t"+"女");}}
}
2 define_raceANDOccupation类:定义角色的种族跟职业:
import java.util.Scanner;//角色的种族及职业
public class define_raceANDoccupation {private int race;//种族private int occupation;//职业private String[] races={"人类","精灵","兽人","矮人","元素"};private String[] occupations={"狂战士","圣骑士","刺客","猎手","祭司","巫师"};//获取角色种族信息public int getRace(){return this.race;}//获取角色职业信息public int getOccupation(){return this.occupation;}//设置角色种族public void setRace(){this.race=race;}//选择角色种族public int selectRace(){while(true){System.out.println("请输入您要选择的角色的种族:(0.人类 1.精灵 2.兽人 3.矮人 4.元素)");Scanner in=new Scanner(System.in);this.race=in.nextInt();if(race>=0&&race<=4){break;}else{System.out.println("请在0-4数字中选择角色种族!");}}return race;}//选择角色职业public int selectOccupation(){switch (race){case 0:while(true){System.out.println("请选择您要选择的职业:(0.狂战士 1.圣骑士 2.刺客 3.猎手 4.祭司 5.巫师)");Scanner in=new Scanner(System.in);this.occupation=in.nextInt();if(occupation>=0&&occupation<=5){break;}else{System.out.println("请在0-5数字中选择角色职业!");}}break;case 1:while(true){System.out.println("请选择您要选择的职业:(2.刺客 3.猎手 4.祭司 5.巫师)");Scanner in=new Scanner(System.in);this.occupation=in.nextInt();if(occupation>=2&&occupation<=5){break;}else{System.out.println("请在2-5数字中选择角色职业!");}}break;case 2:while(true){System.out.println("请选择您要选择的职业:(0.狂战士 3.猎手 4.祭司)");Scanner in=new Scanner(System.in);this.occupation=in.nextInt();if(occupation==0||occupation==3||occupation==4){break;}else{System.out.println("请在0,3,4数字中选择角色职业!");}}break;case 3:while(true){System.out.println("请选择您要选择的职业:(0.狂战士 1.圣骑士 4.祭司)");Scanner in=new Scanner(System.in);this.occupation=in.nextInt();if(occupation==0||occupation==1||occupation==4){break;}else{System.out.println("请在0,1,4数字中选择角色职业!");}}break;case 4:while(true){System.out.println("请选择您要选择的职业:(4.祭司 5.巫师)");Scanner in=new Scanner(System.in);this.occupation=in.nextInt();if(occupation==4||occupation==5){break;}else{System.out.println("请在4,5数字中选择角色职业!");}}break;default:break;}return occupation;}//输出种族及职业信息public void outRaceANDOccupation(){System.out.println("===============================");System.out.println("种族\t\t\t\t"+races[this.race]);System.out.println("===============================");System.out.println("职业\t\t\t\t"+occupations[this.occupation]);}
}
3 .Attribute类:为职业分配属性值:
import java.util.Random;
//角色属性
public class Attribute {private int strength;//力量private int agility;//敏捷private int power;//体力private int intelligenge;//智力private int wisdom;//智慧private int LP;//生命值private int MP;//魔法值//获取角色力量属性public int getStrength(){return strength;}//获取角色敏捷属性public int getAgility(){return agility;}//获取角色体力属性public int getPower(){return power;}//获取角色智力属性public int getIntelligenge(){return intelligenge;}//获取角色智慧属性public int getWisdom(){return wisdom;}//获取角色生命值属性public int getLP(){return LP;}//获取角色魔力值属性public int getMP(){return MP;}//生成角色属性public void autoattribute(int str,int agi,int pow,int intell,int wis){int sum=0;Random random=new Random();do{strength=random.nextInt(10)+str;agility=random.nextInt(10)+agi;power=random.nextInt(10)+pow;intelligenge=random.nextInt(10)+intell;wisdom=random.nextInt(10)+wis;sum=strength+agility+power+intelligenge+wisdom;}while(sum!=100);//生命值为体力的20倍LP=power*20;//法力值为智力与智慧之和的10倍MP=(intelligenge+wisdom)*10;}//初始化角色属性public void Initialize(int occupation){if(occupation==0){autoattribute(40,20,30,5,5);}if(occupation==1){autoattribute(25,15,30,20,10);}if(occupation==2){autoattribute(20,35,20,15,10);}if(occupation==3){autoattribute(15,40,15,10,20);}if(occupation==4){autoattribute(15,20,15,35,15);}if(occupation==5){autoattribute(10,20,10,20,40);}}//输出属性值public void OutputArrtibute(){System.out.println("===============================");System.out.println("力量\t\t\t\t"+this.strength);System.out.println("===============================");System.out.println("敏捷\t\t\t\t"+this.agility);System.out.println("===============================");System.out.println("体力\t\t\t\t"+this.power);System.out.println("===============================");System.out.println("智力\t\t\t\t"+this.intelligenge);System.out.println("===============================");System.out.println("智慧\t\t\t\t"+this.wisdom);System.out.println("===============================");System.out.println("生命值\t\t\t\t"+this.LP);System.out.println("===============================");System.out.println("魔力值\t\t\t\t"+this.MP);}}
4 .Test类:将角色的信息输出并保存在文件中:
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;//游戏运行类
public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);boolean flag = true;//创建角色对象Role role = new Role();define_raceANDoccupation ro = new define_raceANDoccupation();Attribute att = new Attribute();do {role.Define();int race = ro.selectRace();ro.selectOccupation();//输出角色基本信息role.output();ro.outRaceANDOccupation();att.Initialize(ro.getOccupation());att.OutputArrtibute();//判断对创建的角色是否满意System.out.println("是否满意该角色?(Y/N)若不满意,则重新创建");String str = sc.next();if ("Y".equals(str) || "y".equals(str)) {break;}} while (flag);SaveInformation(role,ro,att);System.out.println("角色已成功保存!");}//将角色信息保存到文件中public static void SaveInformation(Role role,define_raceANDoccupation ro,Attribute att){try{//创建输出流对象FileWriter file=new FileWriter("C://Users//asus//Desktop//roles_information.txt",true);//字符缓冲输出流BufferedWriter bw=new BufferedWriter(file);bw.write("姓名\t\t\t\t"+role.getName());//输出换行bw.newLine();if(role.getGender()==0){bw.write("性别\t\t\t\t"+"男");}else{bw.write("性别\t\t\t\t"+"女");}bw.newLine();switch(ro.getRace()){case 0:bw.write("种族\t\t\t\t"+"人类");break;case 1:bw.write("种族\t\t\t\t"+"精灵");break;case 2:bw.write("种族\t\t\t\t"+"兽人");break;case 3:bw.write("种族\t\t\t\t"+"矮人");break;case 4:bw.write("种族\t\t\t\t"+"元素");break;default:break;}bw.newLine();switch(ro.getOccupation()) {case 0:bw.write("职业\t\t\t\t" + "狂战士");break;case 1:bw.write("职业\t\t\t\t" + "圣骑士");break;case 2:bw.write("职业\t\t\t\t" + "刺客");break;case 3:bw.write("职业\t\t\t\t" + "猎手");break;case 4:bw.write("职业\t\t\t\t" + "祭司");break;case 5:bw.write("职业\t\t\t\t" + "巫师");default:break;}bw.newLine();bw.write("力量\t\t\t\t"+att.getStrength());bw.newLine();bw.write("敏捷\t\t\t\t"+att.getAgility());bw.newLine();bw.write("体力\t\t\t\t"+att.getPower());bw.newLine();bw.write("智力\t\t\t\t"+att.getIntelligenge());bw.newLine();bw.write("智慧\t\t\t\t"+att.getWisdom());bw.newLine();bw.write("生命值\t\t\t\t"+att.getLP());bw.newLine();bw.write("魔力值\t\t\t\t"+att.getMP());//关闭文件bw.close();}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}}
}
四.调试
1.在刚写出程序的时候,运行出来的结果是下图这样的。
种族跟职业的值没有被赋上值,而且下面那些属性值随机分配的也不对,于是我又重新检查了程序,发现,我随机函数那块没有写对。
2… 角色的属性值在运行界面出不来:
五.测试
1.程序运行处出来的结果:
2.文件中保存的结果
六.总结
.在这次程序中,我学会了java中随机函数的应用还有IO(输入输出)流的使用。
下面就这两方面总结:
4. 随机函数:参考https://blog.csdn.net/u012099869/article/details/50394644
①来源:random.nextInt() 为 java.util.Random类中的方法;
Math.random() 为 java.lang.Math 类中的静态方法。
②用法://两种生成对象方式:带种子和不带种子(两种方式的区别见注解)产生[0,n)的随机数
Random random = new Random();
int res = random.nextInt(n);
int res = (int)(Math.random() * n+1);
③总结:a.Math.random() 方法生成[0, 1)范围内的double类型随机数;Random类中的nextXxxx系列方法生成0-n的随机数;
b.Math.random() 线程安全,多线程环境能被调用;
c.如无特殊需求,则使用(int)(Math.random()*n)的方式生成随机数即可。
2. IO(输入输出)流
IO流根据不同的作用可分为不同的流,最常见的就是输入输出流,还有缓冲流。
我们经常在写程序的时候会使用缓冲流,这是因为缓冲流可以增加缓冲功能,避免频繁读取磁盘。
用法:以字符缓冲输出流为例:BufferWriter是在import.java.io.BufferWriter类中的方法;
与它一起使用时要使用异常处理:try{
//定义文件,字符缓冲输出流……
File file=new File(“你所存文件的路径”);B
ufferWriter bw=new BufferWriter(file);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStaceTrace();
}
以上便是我对这次程序中重要的部分的总结!