小角色游戏-RPG游戏

一. 问题描述
1.功能描述:几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
2.游戏角色应有的属性本题目要求的游戏角色应有以下属性:
名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3. 职业限制
在这里插入图片描述
4.初始属性:本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。
例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
在这里插入图片描述
5.显示信息:最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
二.流程图及类图
在这里插入图片描述
在这里插入图片描述
三.完整代码

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值