程序设计方法与优化第六次作业

第四章 面向对象程序设计方法
一、题目分析
本次题目要求编写一个简化的创建游戏角色的程序。角色拥有相应的属性,可以用一个类来进行设计,另一个类实例化该类完成角色的创建。

二、类图设计
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、程序实现
源代码:
package package1;
import java.io.;
import java.util.
;
class gameRole{//创建角色类
//角色的一些属性
String name;
String sex;
String race;
String profession;
int power;
int agility;
int physicalPower;
int intelligence;
int wisdom;
int healthPoint;
int magicPoint;
public void createRole(){//创建角色的方法
//获取姓名
Scanner sc=new Scanner(System.in);
Random rand=new Random();
System.out.println(“请输入您的姓名:”);
name=sc.nextLine();
//获取角色性别
int item;
System.out.println(“请选择角色性别:1.男性 2.女姓”);
item=sc.nextInt();
switch(item){
case 1:
sex=“男性”;break;
case 2:
sex=“女性”;break;
}
//获取种族
System.out.println(“请选择种族:1.人类 2.精灵 3.兽人 4.矮人 5.元素”);
item=sc.nextInt();
switch(item){
case 1:race=“人类”;break;
case 2:race=“精灵”;break;
case 3:race=“兽人”;break;
case 4:race=“矮人”;break;
case 5:race=“元素”;break;
}
//根据相应的种族提供相应的职业选择
if(race==“人类”)
{
System.out.println(“请选择职业:1.狂战士 2.圣骑士 3.刺客 4.猎手 5.祭司 6.巫师”);
item=sc.nextInt();
switch(item){
case 1:profession=“狂战士”;break;
case 2:profession=“圣骑士”;break;
case 3:profession=“刺客”;break;
case 4:profession=“猎手”;break;
case 5:profession=“祭司”;break;
case 6:profession=“巫师”;break;
}
}
else if(race==“精灵”){
System.out.println(“请选择职业:1.刺客 2.猎手 3.祭司 4.巫师”);
item=sc.nextInt();
switch(item){
case 1:profession=“刺客”;break;
case 2:profession=“猎手”;break;
case 3:profession=“祭司”;break;
case 4:profession=“巫师”;break;
}
}
else if(race==“兽人”){
System.out.println(“请选择职业:1.狂战士 2.圣骑士 3.祭司”);
item=sc.nextInt();
switch(item){
case 1:profession=“狂战士”;break;
case 2:profession=“猎手”;break;
case 3:profession=“祭司”;break;
}
}
else if(race==“矮人”){
System.out.println(“请选择职业:1.狂战士 2.猎手 3.祭司”);
item=sc.nextInt();
switch(item){
case 1:profession=“狂战士”;break;
case 2:profession=“圣骑士”;break;
case 3:profession=“祭司”;break;
}
}
else
{
System.out.println(“请选择职业:1.祭司 2.巫师”);
item=sc.nextInt();
switch(item){
case 1:profession=“祭司”;break;
case 2:profession=“巫师”;break;
}
}
//不同的职业赋予不同的属性值
if(profession==“狂战士”){
while(true){
power=rand.nextInt(11)+35;
agility=rand.nextInt(11)+15;
physicalPower=rand.nextInt(11)+25;
intelligence=rand.nextInt(5)+3;
wisdom=rand.nextInt(5)+3;
if(power+agility+physicalPower+intelligence+wisdom100)
break;
}
}
else if(profession
"圣骑士"){
while(true){
power=rand.nextInt(11)+20;
agility=rand.nextInt(11)+10;
physicalPower=rand.nextInt(11)+25;
intelligence=rand.nextInt(11)+20;
wisdom=rand.nextInt(11)+5;
if(power+agility+physicalPower+intelligence+wisdom100)
break;
}
}
else if(profession
"刺客"){
while(true){
power=rand.nextInt(11)+15;
agility=rand.nextInt(11)+30;
physicalPower=rand.nextInt(11)+15;
intelligence=rand.nextInt(11)+10;
wisdom=rand.nextInt(11)+5;
if(power+agility+physicalPower+intelligence+wisdom100)
break;
}
}
else if(profession
"猎手"){
while(true){
power=rand.nextInt(11)+10;
agility=rand.nextInt(11)+35;
physicalPower=rand.nextInt(11)+10;
intelligence=rand.nextInt(11)+5;
wisdom=rand.nextInt(11)+15;
if(power+agility+physicalPower+intelligence+wisdom100)
break;
}
}
else if(profession
"祭司"){
while(true){
power=rand.nextInt(11)+10;
agility=rand.nextInt(11)+15;
physicalPower=rand.nextInt(11)+10;
intelligence=rand.nextInt(11)+30;
wisdom=rand.nextInt(11)+10;
if(power+agility+physicalPower+intelligence+wisdom100)
break;
}
}
else
{
while(true){
power=rand.nextInt(11)+5;
agility=rand.nextInt(11)+15;
physicalPower=rand.nextInt(11)+5;
intelligence=rand.nextInt(11)+15;
wisdom=rand.nextInt(11)+35;
if(power+agility+physicalPower+intelligence+wisdom
100)
break;
}
}
//生命值=体力*20,魔法值=(智力+智慧)10.
healthPoint=power
20;
magicPoint=(intelligence+wisdom)*10;
//输出角色信息
System.out.println(“您的信息:\n”+"姓名 “+name+” 性别 “+sex+” 种族 “+race+” 职业 "+profession);
System.out.println("力量 “+power+” 敏捷 “+agility+” 体力 “+physicalPower+” 智力 “+intelligence+” 智慧 “+wisdom+” 生命值 “+healthPoint+” 魔法值 "+magicPoint);

}

}
public class Example {//具体实现类
public static gameRole gr=new gameRole(); //创建角色类类对象

public static void main(String[] args) throws IOException{
//定义输出文件
File file=new File(“out.txt”);
FileWriter pw=new FileWriter(file,true);
gr.createRole();//对象调用角色生成方法
int item;//是否成功创建标志
Scanner s=new Scanner(System.in);
//如果用户不满意该创建角色,可以再次创建,直到满意为止
while(true){
System.out.println(“您对创建的角色是否满意? 1.满意 2.不满意”);
item=s.nextInt();
if(item1){
System.out.println(“创建角色成功!”);
break;
}
else
{
gr.createRole();
}
}
//输出角色信息到文件中
pw.write(“姓名 性别 种族 职业 力量 敏捷 体力 智力 智慧 生命值 魔法值\n”);
pw.write(gr.name+" “+gr.sex+” “+gr.race+” “+gr.profession+” “+gr.power+” “+gr.agility+” “+gr.physicalPower+” “+gr.intelligence+” “+gr.wisdom+” “+gr.healthPoint+” “+gr.magicPoint+”\n");
//关闭输入输出流
s.close();
pw.close();
}
}
四、调试、测试及运行结果
gameRole类用于创建角色,类中的createRole方法具体实现相应操作,另一个类Example负责实例化gameRole类。
在这里插入图片描述
程序到现在为止看起来一切正常,可是仅接着就出现了问题:
在这里插入图片描述
由于需要向用户进行询问是否满意该创建角色,如不满意需要重新创建角色,重新创建角色代码如下:
int item;//是否成功创建标志
Scanner s=new Scanner(System.in);
//如果用户不满意该创建角色,可以再次创建,直到满意为止
while(true){
System.out.println(“您对创建的角色是否满意? 1.满意 2.不满意”);
item=s.nextInt();
if(item
1){
System.out.println(“创建角色成功!”);
break;
}
else
{
gr.createRole();
}
}
而程序中报错部分如下:
在这里插入图片描述
再结合报错提示 没有这样的元素的异常,那么应该是输入流出了问题,经过仔细排查,是因为gameRole类的createRole方法中以及Example类的main方法中都定义了输入流,
gameRole类的createRole方法中的输入流:
在这里插入图片描述
Example类的main方法中的输入流见上图
而在gameRole类的createRole方法中最后又关闭了输入流通道:
在这里插入图片描述
这就导致在调用完createRole方法后输入流通道被关闭,后面main方法中的输入流无法读取数据,因此可将createRole方法中的关闭输入流略去。修改后运行程序:
在这里插入图片描述
程序运行成功,
题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,如何让五项属性的总和达到100,这里采取的是暴力循环的方法,如下:
在这里插入图片描述
关于文件的输出,如何在文件的末尾写入数据而不覆盖原来的数据?只需如下定义:
在这里插入图片描述
这样定义后就能在文件末尾写入数据,FileWriter中的true表示append参数的值为true,这样就能在已存在的文件内容之后追加新内容。
程序最终运行流程:
在这里插入图片描述
将信息输出到文件中:
在这里插入图片描述
五、经验归纳
本次题目整体设计比较简单,主要是进行类的设计及类的对象化应用,创建一个类对象,并调用类的方法完成实现。
输入流通道一旦关闭,其它的输入流就无法继续进行输入读取,这是一个需要注意的问题。
关于文件的输出,将FileWriter中append参数的值设置为true,这样就能在已存在的文件内容之后追加新内容。
文件的输入输出要抛出异常,要记得写throws IOException。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值