本题目要求编写一个简化的在进入游戏时都会让用户自己来创建自己喜欢的游戏角色的程序。
题目分析
本题目要求编写一个简化的在进入游戏时都会让用户自己来创建自己喜欢的游戏角色的程序。
1.1
游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
1.2.
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
1.3.
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取
得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
1.4.
显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
类图设计
程序实现
下面展示一些 内联代码片
。
//writer:liualiu
/date:2020.5.20
Role.java
import java.io.FileOutputStream;
import java.util.Scanner;
public class Role {
private String name ;//名字
private String sex;//性别
private String zhongzu;//种族
private String zhiye;//职业
private int power;//力量
private int minjie;//敏捷
private int body;// 体力
private int inteligence;//智力
private int zhihui;//智慧
private int live;//生命值
private int mofazhi;//魔法值
public String getName() {//返回姓名
return name;
}
public String getSex() {//返回性别
return sex;
}
public String getZhongzu() {//返回种族
return zhongzu;
}
public String getZhiye() {//返回职业
return zhiye;
}
public int getPower() {//返回力量
return power;
}
public int getMinjie() {//返回敏捷
return minjie;
}
public int getBody() {//返回体力
return body;
}
public int getInteligence() {//返回智力
return inteligence;
}
public int getZhihui() {//返回智慧
return zhihui;
}
public int getLive() {//返回生命值
return live;
}
public int getMofazhi() {//返回魔法值
return mofazhi;
}
public void setname(String name) {//设置姓名
this.name=name;
}
public void setsex(String sex) {//设置性别
this.sex=sex;
}
public void setzhongzu(String zhongzu) {//设置种族
this.zhongzu =zhongzu ;
}
public void setzhiye(String zhiye) {//设置职业
this.zhiye=zhiye;
}
public void setlive() {//设置生命值
live=body*20;
}
public void setmofazhi() {//设置魔法值
mofazhi=(inteligence+zhihui)*10;
}
//设置力量,敏捷,体力,智力,智慧等属性值
public void setshuxing(int liliang,int minjie,int tili,int zhili ,int zhihui ) {
this.power =liliang;
this.minjie=minjie ;
this.body=tili;
this.inteligence=zhili;
this.zhihui=zhihui;
}
//不带参数的构造函数
public Role() {
// TODO 自动生成的构造函数存根
}
//显示信息
public void show() {
System.out.println("=======您的信息如下=========");
System.out.println("====================");
System.out.println("姓名 "+name);
System.out.println("====================");
System.out.println("性别 "+sex);
System.out.println("====================");
System.out.println("种族 "+zhongzu);
System.out.println("====================");
System.out.println("职业 "+zhiye);
System.out.println("====================");
System.out.println("力量 "+power);
System.out.println("====================");
System.out.println("敏捷 "+minjie);
System.out.println("====================");
System.out.println("体力 "+body);
System.out.println("====================");
System.out.println("智力 "+inteligence);
System.out.println("====================");
System.out.println("智慧 "+zhihui);
System.out.println("====================");
System.out.println("生命值 "+live);
System.out.println("====================");
System.out.println("魔法值 "+mofazhi);
System.out.println("====================");
}
public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
Method m=new Method();
Role r1=new Role();
Rolejudge rj=new Rolejudge();
m.matchvalue(r1);//为用户匹配对应属性
r1.show();//输出属性
rj.manyi(r1, m);//调用函数,直到得到用户满意的信息为止
//定义一个字符串用于存放Role的成员变量信息
String xinxi="姓名 "+r1.getName()+"\n性别 "+r1.getSex()+"\n种族 "
+r1.getZhongzu()+"\n职业 "+r1.getZhiye()+"\n力量 "+r1.getPower()+"\n敏捷 "
+r1.getMinjie()+"\n体力 "+r1.getBody()+"\n智力 "+r1.getInteligence()+"\n生命值 \t "
+r1.getLive()+"\n魔法值 \t "+r1.getMofazhi();
//创建文件输出流对象,并指定文件名称
FileOutputStream out=new FileOutputStream("小主信息.txt");
//将字符串转换为字节数组
out.write(xinxi.getBytes());
out.close();//关闭文件
System.out.println("拜拜,下次再来玩儿!");
}
}
Method.java
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.locks.ReadWriteLock;
public class Method {
private String[] zhongzus=new String[]
{"人类","精灵","兽人","矮人","元素"};//用字符串数组存储种族信息
private String []zhiyes=new String[] {"狂战士","圣骑士","刺客","猎手","祭司","巫师"};//用字符串数组存储职业信息
//boolean类型的二维数组存储职业限制的表信息
private boolean[][]judge= {
{true,true, true,true,true,true},
{false , false ,true,true,true,true},
{true,false, false,true,true,false},
{true,true, false,false,true,false},
{false,false,false,false,true,true}
};
//用int类型的二维表存储初始属性
private int[][]arr= {
{40,20,30,5,5},
{25,15,30,20,10},
{20,35,20,15,10},
{15,40,15,10,20},
{15,20,15,35,15},
{10,20,10,20,40}
};
//定义函数,根据输入数字匹配对应种族名字
public String matchzhongzu(int number) {
int i;
for( i=0;i<5;i++) {
if(number==i)
break;
}
return zhongzus[i];
}
//定义函数,根据输入数字匹配对应职业名称
public String matchzhiye(int number) {
int i;
for( i=0;i<5;i++) {
if(number==i)
break;
}
return zhiyes[i];
}
//判断该种族是否可以选择该职业,局部变量zhongzu为种族,zhiye为职业
public boolean judgezhiye(int zhongzu,int zhiye) {
if(judge[zhongzu][zhiye])
return true;
else
return false;
}
//定义为游戏玩家设置整个属性值的函数返回值为Role类型
public Role matchvalue(Role r1) {
Scanner in=new Scanner(System.in);
System.out.println("哈喽,欢迎您来到龙与地下城!");
System.out.println("下面就跟随小的指示来玩吧");
System.out.println("请输入您游戏角色的姓名:");
String rname= in.next();//输入姓名
System.out.println("好啦,"+rname +",我已经知道您的尊姓大名啦");
System.out.println("请选择您游戏角色的性别:");
String rsex= in.next();//输入性别
System.out.println("下面请输入数字选择您游戏角色的种族:");
System.out.println("0-人类,1-精灵,2-兽人,3-矮人,4-元素");
int rzhongzu= in.nextInt();//选择种族序号
//对输入异常的处理
while(rzhongzu>4||rzhongzu<0) {
System.out.println("只能在这几个种族里面选哦,再选择一次吧!不要再调皮了奥");
rzhongzu= in.nextInt();
}
//将输入的数据赋给对应变量
r1.setname(rname);
r1.setsex(rsex);
r1.setzhongzu(matchzhongzu(rzhongzu));
System.out.println("请输入数字选择您的职业吧");
System.out.println("0-狂战士,1-圣骑士,2-刺客,3-祭司,5-巫师");
int rzhiye= in.nextInt(); //选择职业序号
while(rzhongzu>4||rzhongzu<0) {
System.out.println("只能在这几个职业里面选哦,再选择一次吧!不要再调皮了奥");
rzhongzu= in.nextInt();//再次选择职业序号
}
while((judgezhiye(rzhongzu, rzhiye))==false) {
System.out.println("哎呀,真抱歉,您不能选择该职业,请重新选择一个职业吧");
rzhiye= in.nextInt(); //选择职业序号
}
//调用匹配职业序号对应的职业名称函数将其返回值赋给职业这个成员变量
r1.setzhiye(matchzhiye(rzhiye));
int[]shuxing=new int[5];//定义一个int型的五维数组
Random r=new Random();
Random ran=new Random();
do {
for(int i=0;i<4;i++) {
int temp=r.nextInt(1);//生成一个int类型的0-1的随机数
//为了让生成的随机数符合初始属性的大概比例,生成0-5的随机数,
//让对应属性的标准值根据另外随机数的值决定他的正负,然后加上这个值,最后一个值,直接用100减去前面对应值加起来的和
if(temp==1) {
shuxing[i]=arr[rzhiye][i]+r.nextInt(5);//生成一个int类型的0-5的随机数
}else {
shuxing[i]=arr[rzhiye][i]-r.nextInt(5);
}
}
if((shuxing[0]+shuxing
[1]+shuxing[2]+shuxing[3])<100) {
shuxing[4]=100-(shuxing[0]+shuxing[1]+shuxing[2]+shuxing[3]);
break;
}
}while(true);
r1.setshuxing(shuxing[0],
shuxing[1],shuxing[2] ,shuxing[3], shuxing[4]);//将对应的五个属性值赋给对应成员变量
r1.setlive();//将生命值赋给对应成员变量
r1.setmofazhi();//将魔法值付给对应成员变量
return r1;//返回类变量
}
}
Rolejudge.java
import java.util.Scanner;
public class Rolejudge {
public void manyi(Role r,Method m) {
int man=0;
//询问用户对匹配的信息是否满意
System.out.println("小主,对您的信息可还满意?不满意输入0,满意的话输入1,如果你调皮输入别的数字那就默认你满意了奥");
Scanner in=new Scanner(System.in);
man= in.nextInt();//man接受用户的反馈
// 如果不满意就在匹配一次
while(man==0)
{
m.matchvalue(r);
r.show();
System.out.println("小主,对您的信息可还满意?不满意输入0,满意的话输入1,如果你调皮输入别的数字那就默认你满意了奥");
man= in.nextInt();
}
// do {
// Scanner in=new
Scanner(System.in);
// System.out.println("小主,对您的信息可还满意?不满意输入0,满意的话输入1,如果你调皮输入别的数字那就默认你满意了奥");
// man= in.nextInt();//man接受用户的反馈
// m.matchvalue(r);
// r.show();
//
// } while (man==0);
//直到用户满意之后,输出提示信息
System.out.println("哈哈,既然小主满意您的信息啦,那小的就为您存档了");
}
}