一. 问题描述
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();
}
以上便是我对这次程序中重要的部分的总结!