Java—实现 RPG 人物生成器

一. 题目分析

1. 题目内容

1.功能描述
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。

2.游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
种族/职业 狂战士 圣骑士 刺客 猎手 祭司 巫师
人类 允许 允许 允许 允许 允许 允许
精灵 不允许 不允许 允许 允许 允许 允许
兽人 允许 不允许 不允许 允许 允许 不允许
矮人 允许 允许 不允许 不允许 允许 不允许
元素 不允许 不允许 不允许 不允许 允许 允许
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
4.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
职业/属性 力量 敏捷 体力 智力 智慧
狂战士 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
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。

2. 题目分析
  1. 掌握面向对象程序设计的方法。明确类与对象的概念,掌握面向对象设计七大原则;
  2. 掌握常见的设计模式以及类图的描述。
    通过面向对象的方法创建游戏人物,从而加深对面向对象编程的理解,掌握常用的设计方法及类图的 描述。

二. 类图设计

在这里插入图片描述

三. 程序实现

package 基础;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
//import java.io.Writer;
import java.util.Random;
import java.util.Scanner;

public class  RPGrole{
	private  static String rolename;//姓名
	private  static String sex;//性别
	private static String racial;//种族
	private static String career;//职业
	private static int strength,agility,physical,intellige,intelligence,life,magic;//力量,敏捷,体力,智力,智慧,生命值,魔法值

	public static void show() {
		System.out.println("角色姓名			"+rolename);
		System.out.println("角色性别			"+sex);
		System.out.println("种族			"+racial);
		System.out.println("职业			"+career);
		System.out.println("力量			"+strength);
		System.out.println("敏捷			"+agility);
		System.out.println("体力			"+physical);
		System.out.println("智力			"+intellige);
		System.out.println("智慧			"+intelligence);
		System.out.println("生命值			"+life);
		System.out.println("魔法值			"+magic);
	

	}

    Scanner sc = new Scanner(System.in);

	public static void getname() {
		System.out.println("请设置您的角色姓名");
			Scanner sc = new Scanner(System.in);
			 String rolename_def = sc.nextLine();
			 while(true) {
			 if(rolename_def.length()>50)
			 {System.out.println("您设置的角色名过长");
			 System.out.println("请设置您的角色姓名");
			 rolename_def = sc.nextLine();
			 }
			 else 
			 {rolename=rolename_def;
			 break;
			 }
			 }
	}
	public static void getsex()
	{
		System.out.println("请选择角色性别:1.男 2.女");
		   Scanner sc = new Scanner(System.in);
		int sex_def = sc.nextInt();
		switch(sex_def) {
		case 1:
		{
			sex = "男";
			break;
		}
		case 2:
		{
			sex = "女";
			break;
		}	
		}	
	}
	public  static void getracial()
	{
		int choose;
		System.out.println("请选择您游戏角色的种族:(0 人类 1 精灵 2 兽人 3 矮人 4 元素)");
		  Scanner sc = new Scanner(System.in);
		  choose  = sc.nextInt();
		  switch(choose) {
		  case 0:
			  racial="人类";break;  
		  case 1:
			  racial="精灵";break;
		  case 2:
			  racial="兽人";break;
		  case 3:
			  racial="矮人";break;
		  case 4:
			  racial="元素";break;
		 
	}
	}
	
	public static  void getcareer()
	{
	
		Scanner sc = new Scanner(System.in);
		
		int s;
		switch(racial)
		{
		case "人类":
			System.out.println("请选择您角色的职业:(1 狂战士 2 圣骑士 3  刺客 4 猎手 5 祭司 6 巫师)");
			s = sc.nextInt();
			switch(s) {
			case 1:
				career="狂战士";
				break;
			case 2:
				career="圣骑士";
				break;
			case 3:
				career="刺客";
				break;
			case 4:
				career="猎手";
				break;
			case 5:
				career="祭司";
				break;
			case 6:
				career="巫师";
				break;
			}
			break;
		case "精灵":
			System.out.println("请选择您角色的职业:( 1  刺客 2 猎手 3 祭司 4 巫师)");
			s = sc.nextInt();
			switch(s) {	
			case 1:
				career="刺客";break;
			case 2:
				career="猎手";break;
			case 3:
				career="祭司";break;
			case 4:
				career="巫师";break;
			}
			break;
		case "兽人":
			System.out.println("请选择您角色的职业:( 1  狂战士 2 猎手 3 祭司 )");
			s = sc.nextInt();
			switch(s) {
			case 1:
				career="狂战士";break;
			case 2:
				career="猎手";break;
			case 3:
				career="祭司";break;
			}
			break;
		case "矮人":
			System.out.println("请选择您角色的职业:( 1  狂战士 2 圣骑士 3 祭司 )");
			s = sc.nextInt();
			switch(s) {
			case 1:
				career="狂战士";break;
			case 2:
				career="圣骑士";break;
			case 3:
				career="祭司";break;
			}
		case "元素":
			System.out.println("请选择您角色的职业:( 1  祭司 2 巫师  )");
			s = sc.nextInt();
			switch(s) {
			case 1:
				career="祭司";break;
			case 2:
				career="巫师";break;
			}break;
			}
		
		}
	
	public  static void getProperty() {

        
        Random random = new Random();
         
        switch (career) {
            case "狂战士":
            	strength = random.nextInt(3) + 39;//力量
            	agility = strength/2;//敏捷
            	physical = strength-10;//体力
            	intelligence = strength/8;//智力
               
                break;
            case "圣骑士":
            	strength = random.nextInt(3) + 23;//力量
            	agility = strength-10;//敏捷
            	physical = agility*2;//体力
            	intelligence = agility+5;//智力
               
                break;
            case "刺客":
            	strength = random.nextInt(3) + 20;//力量
            	agility = strength*2-5;//敏捷
            	physical = strength;//体力
            	intelligence = physical-5;//智力
                
                break;
            case "猎手":
                strength = random.nextInt(3) + 13;//力量
                agility = strength*3-5;//敏捷
                physical = strength;//体力
                intelligence = physical-5;//智力
                
                break;
            case "祭司":
                strength = random.nextInt(3) + 13;//力量
                agility = strength+5;//敏捷
                physical = strength;//体力
                intelligence = physical+agility;//智力
               
                break;
            case "巫师":
            	strength = random.nextInt(3) + 8;//力量
            	agility = strength*2;//敏捷
            	physical = strength;//体力
            	intelligence = physical*2;//智力
               
                break;
        }
       intellige = 100-strength-agility-physical-intelligence;//智慧
       magic = (intelligence+intellige)*10;//魔法
       life = physical*20;//生命值
       
    }
	/*
	 * 菜单及用户反馈
	 */
	public static void feedback() throws FileNotFoundException, IOException, InterruptedException {
		Scanner sc = new Scanner(System.in);
		while (true)
		{
			getname();//姓名设置
			getsex();//性别
			getracial();//获得种族
			getcareer();//获得职业
			getProperty();//随机生成属性
			show();
			System.out.println("小主,对该角色您还满意吗   0 :满意 anykey: 也不行呀");
			System.out.println("如果您不满意将重新为您生成新角色 ,满意的话就直接保存文件了哦");
			String input = sc.nextLine();
            System.out.println(input);
			if(input.equals("0"))
			{
				File f = new File("RPG.txt");
				FileOutputStream fop = new FileOutputStream(f);
				OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
				writer.append("                            召唤师角色创建详情 ");
				writer.append("\r\n");
				writer.append("	角色姓名		"+rolename);writer.append("\r\n");
				writer.append("  	角色性别		"+sex);writer.append("\r\n");
				writer.append(" 	种族			"+racial);writer.append("\r\n");
				writer.append("  	职业			"+career);writer.append("\r\n");
				writer.append(String.valueOf("  	力量			"+strength));writer.append("\r\n");
				writer.append(String.valueOf("  	敏捷			"+agility));writer.append("\r\n");
				writer.append(String.valueOf("  	体力			"+physical));writer.append("\r\n");
				writer.append(String.valueOf("  	智力			"+intellige));writer.append("\r\n");
				writer.append(String.valueOf("  	智慧			"+intelligence));writer.append("\r\n");
				writer.append(String.valueOf("  	生命值			"+life));writer.append("\r\n");
				writer.append(String.valueOf("  	魔法值			"+magic));writer.append("\r\n");
				writer.close();
				System.out.println("角色已创建,请在文件中查看");
				break;
			}
			else {
				System.out.println("角色重建  loading");
				Thread.sleep(5000);
				feedback();
				
			}
			}
		
	}
	public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {
			System.out.println("欢迎来到地下城,亲爱的召唤师,请创建您的角色");
			System.out.println("==========================================");
			feedback();
		}
	}

四. 调试,测试及运行结果

调试断点单步跳入,跳过

在这里插入图片描述

角色重建

在这里插入图片描述

五. 个人心得

  1. 本次程序设计,深化了对面向对象编程的思想,了解掌握了UML (统一建模语言)类图和常用的设计模式,但是对七大法则运用及理解还是不够深入。
  2. 在编码时开始用this语句对全局变量赋值,所以getname(),getsex()等属性方法都是以动态方法来被调用,Java main()方法默认属性为static静态方法,这就导致了在主类创建对象调用函数是出现一系列问题,如 创建角色RPGrole 当正常调用函数时,需采用RPGrole.function()来实现,这是静态方法调用非静态方法时的方法,但是当函数有参调用上层函数的返回值时,就会出现问题,此时如果仍采用RPGrole.function(RPGrole.function()),虽然按照道理来说并没有什么问题,但是当实际操作起来就会发现这可能会导致函数的重复调用,所以,当函数非静态时,用函数调用函数用起来要慎重。
    3.改进空间:将对象生成类与主类单独分开,更能体现OOP的思想,在主类中只完成对象的属性获取及参数设置,在对象类中对这些主类函数进行调用,生成想要角色。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值