RPG角色生成器

题目要求

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.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。

源码

package rpg.role;

import java.util.Random;
import java.util.Scanner;

/**
 * 项目名称:RPG角色生成器
 * 编辑时间:2019年4月18日
 * @author 万物甦醒
 * 思路:定义一个角色类,角色类封装角色的各个属性和字段,并没有特殊的方法实现功能
 * 方法主要是get来获取属性和字段,set初始化各项属性和字段。这个方法和其他类的实例化对象
 * 接触的比较多,因为需要这个方法来获取其他类传递而来的属性值
 */

public class GameRole {
	String name;
	char sex;
	String racial;
	String career;
	private int strength;  //力量
	private int agility;//敏捷度
	private int physical;//体力
	private int intelligence;//智力
	private int wisdom; //智慧
	private int lifevalue; //生命值
	private int magicvalue;//魔法值
	public String getName() {
		return name;
	}
	public char getSex() {
		return sex;
	}
	public String getRacial() {
		return racial;
	}
	public String getCareer() {
		return career;
	}
	public int getStrength() {
		return strength;
	}
	public int getAgility() {
		return agility;
	}
	public int getPhysical() {
		return physical;
	}
	public int getIntelligence() {
		return intelligence;
	}
	public int getWisdom() {
		return wisdom;
	}
	public int getLifevalue() {
		return lifevalue;
	}
	public int getMagicvalue() {
		return magicvalue;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public void setSex(char sex) {
		this.sex = sex;
	}
	public void setRacial(String racial) {
		this.racial = racial;
	}
	public void setCareer(String career) {
		this.career = career;
	}
	public void setStrength(int strength) {
		this.strength = strength;
	}
	public void setAgility(int agility) {
		this.agility = agility;
	}
	public void setPhysical(int physical) {
		this.physical = physical;
	}
	public void setIntelligence(int intelligence) {
		this.intelligence = intelligence;
	}
	public void setWisdom(int wisdom) {
		this.wisdom = wisdom;
	}
	public void setLifevalue(int lifevalue) 	{
		this.lifevalue = lifevalue;
	}
	public void setMagicvalue(int magicvalue) {
		this.magicvalue = magicvalue;
	}
}

package rpg.role;
/**
 * 项目名称:RPG角色生成器
 * 编辑时间:2019年4月18日
 * @author 万物甦醒
 * 思路:1.定义一个职业选择类,从主函数获取种族,在这个类中将种族传递给角色类;
 * 2.根据传来的种族选择所能够匹配的职业,将职业传递给角色类来初始化
 */

import java.util.Scanner;

public class ChoiceCareer {

	//String racial;
	String career;//要传给角色类的职业


	//将职业的值传给GameRole类
	public void careertoRole(GameRole gr)
	{
//		GameRole gr = new GameRole();
		gr.setCareer(career);
	}
	/**根据种族选择职业
	 * 根据种族提示用户哪些可供选择职业,利用switch实现
	 * 不过还是觉得有些冗余~~~
	 * @param racial
	 */
	public void setCareer(int m,GameRole gr) {
		if(m == 1)
		{
			gr.setRacial("人类");//设置角色类的种族为人类
			//开始个根据种族选择职业
			System.out.println("请输入你的而游戏角色的职业:1 狂战士 2圣骑士 3刺客 4猎手 5祭司 6 巫师");
			int choice;
			Scanner scan = new Scanner(System.in);
			choice = scan.nextInt();
			switch(choice)
			{
				case 1: this.career = "狂战士";break;
				case 2: this.career = "圣骑士";break;
				case 3: this.career = "刺客";break;
				case 4: this.career = "猎手";break;
				case 5: this.career = "祭司";break;
				case 6: this.career = "巫师";break;
				default:this.career =null;break;
			}
		}
		else if(m ==2)
		{
			gr.setRacial("精灵");
			System.out.println("请输入你的而游戏角色的职业:1  刺客 2猎手 3祭司 4 巫师");
			int choice;
			Scanner scan = new Scanner(System.in);
			choice = scan.nextInt();
			switch(choice)
			{
				case 1: this.career = "刺客";break;
				case 2: this.career = "猎手";break;
				case 3: this.career = "祭司";break;
				case 4: this.career = "巫师";break;
				default:this.career =null;
			}
		}
		else if(m == 3)
		{
			gr.setRacial("兽人");
			System.out.println("请输入你的而游戏角色的职业:1 狂战士 2猎手 3祭司 4 巫师");
			int choice;
			Scanner scan = new Scanner(System.in);
			choice = scan.nextInt();
			switch(choice)
			{
				case 1: this.career = "狂战士";break;
				case 2: this.career = "猎手";break;
				case 3: this.career = "祭司";break;
				case 4: this.career = "巫师";break;
				default:this.career =null;break;
			}
		}
		else if(m == 4)
		{
			gr.setRacial("矮人");
			System.out.println("请输入你的而游戏角色的职业:1 狂战士 2圣骑士  3祭司 ");
			int choice;
			Scanner scan = new Scanner(System.in);
			choice = scan.nextInt();
			switch(choice)
			{
				case 1: this.career = "狂战士";break;
				case 2: this.career = "圣骑士";break;
				case 3: this.career = "祭司";break;
				default:this.career =null;break;
			}
		}
		else if(m == 5)
		{
			gr.setRacial("元素");
			System.out.println("请输入你的而游戏角色的职业:1 祭司 2巫师 ");
			int choice;
			Scanner scan = new Scanner(System.in);
			choice = scan.nextInt();
			switch(choice)
			{
				case 1: this.career = "祭司";break;
				case 2: this.career = "巫师";break;
				default:this.career =null;break;
			}
		}
		else {
			System.out.println("输入错误");
		}
		careertoRole(gr);
	}
}

package rpg.role;

import java.util.Random;
/**
 * 项目名称:RPG角色生成器
 * 编辑时间:2019年4月18日
 * @author 万物甦醒
 * 思路:1.定义一个属性类,根据职业初始角色各项属性,分配一个大致的比例
 * 2.生成随机数在固定分配的值上有所增减,但保证总和为100,大致符合比例
 * 3.将计算后的属性值传递给角色类
 */

public class Attribute {
		
		int strength ;  //力量
		int agility ;//敏捷度
		int physical ;//体力
		int intelligence; //智力
		int wisdom; //智慧
		int lifevalue; //生命值
		int magicvalue;//魔法值
		/**
		 * 设置属性,根据不同的职业分配五大属性不同的比例
		 * @param career
		 */
		void setAttribution(GameRole gr)
		{
			int sum ;
			//定义一个角色类对象,并获取角色的职业
//			//GameRole gr = new GameRole();
			String career = gr.getCareer();
			//根据职业的不同分配不同的属性参数计算,不同的职业给的比例不同
			if(career.equals("狂战士"))
			{
				calculateAttribution(40,20,30,5,5);
			}
			if(career.equals("圣骑士"))
			{
				calculateAttribution(25,15,30,20,10);
			}
			if(career.equals("刺客"))
			{
				calculateAttribution(20,35,20,15,10);
			}
			if(career.equals("猎手"))
			{
				calculateAttribution(15,40,15,10,20);
			}
			if(career.equals("祭司"))
			{
				calculateAttribution(15,20,15,35,15);
			}
			if(career.equals("巫师"))
			{
				calculateAttribution(10,20,10,20,40);
			}
			deliverAttribution(gr);
		}
		/**
		 * 计算属性值
		 * 根据传入的参数a,b,c.d,e为前五个属性的比例分配
		 * 利用Random类的随机生成整数函数nextInt()生成各项属性值
		 * 由于题目要求需满足在分配数值左右浮动,所以nextInt()方法在其分配数值的基础上增加一个[-5,5]的数字
		 */
		void calculateAttribution(int a ,int b,int c,int d,int e)
		{
			int sum ;
			//定义随即类,用于后面随机生成属性
			Random rand = new Random();
			do
			{
				//在根据职业所提供的比例上适当有所增减,能够保证总和为100,又能够基本保持比例,没有极大的浮动
				//职业分配分数固定,在有一个[-2,5]的浮动,这个范围开发人员可任意修改,波动无需太大
				strength = a + rand.nextInt(5) - 2 ;
				agility =  b + rand.nextInt(5) - 2 ;
				physical = c + rand.nextInt(5) - 2 ;
				intelligence = d + rand.nextInt(5) - 2 ;
				wisdom = e + rand.nextInt(5) - 2 ;
				lifevalue = physical*20;
				magicvalue = (wisdom + intelligence)*10;
				sum = strength +agility + physical + intelligence +wisdom;
			}while(sum != 100);
		}
	/**
	 * 将计算后的值传送给GameRole类来初始化角色类各项数据
	 */
	void deliverAttribution(GameRole gr)
	{
		//定义一个角色类对象,并获取角色的职业
		//GameRole gr = new GameRole();
		//依次设置各项属性,将计算后
		gr.setStrength(strength);
		gr.setAgility(agility);
		gr.setPhysical(physical);
		gr.setIntelligence(intelligence);
		gr.setWisdom(wisdom);
		gr.setLifevalue(lifevalue);
		gr.setMagicvalue(magicvalue);
	}
}

package rpg.role;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner =new Scanner(System.in);
		GameRole gr = new GameRole();
		/**
		 * 输入姓名,判断姓名字符串长度是否小于50 利用judge()方法实现
		 */
		String name;
		//输入姓名
		do {
		System.out.print("请输入游戏角色的姓名:");
		name = scanner.nextLine();
		gr.setName(name);//角色姓名
		}while(judgename(name));
		
		/**
		 * java中Scanner类没有关于输入字符的函数,因此还需利用
		 * String类中的charAt()方法提取字符串的第一个字符
		 */
		//输入性别
		System.out.print("请输入的你游戏角色的性别(男OR女):");
		char sex = scanner.next().charAt(0);
		gr.setSex(sex);;//角色性别
		
		//实例化职业选择类,初始化角色类的career
		ChoiceCareer cc = new ChoiceCareer();//定义职业选择类
		//输入种族
		System.out.print("请输入游戏角色的种族(1.人类2.精灵3.兽人4.矮人5.元素):");
		int m = scanner.nextInt(); //定义变量m存种族序号
		cc.setCareer(m,gr);//角色种族
		
		//实例化参数类,初始化角色类的属性值
		Attribute attribute =new Attribute();
		attribute.setAttribution(gr);
		
		//依次输出角色的所有信息
		System.out.println("角色姓名    :"+gr.getName());
		System.out.println("角色性别    :"+gr.getSex());
		System.out.println("角色种族    :"+gr.getRacial());
		System.out.println("角色职业    :"+gr.getCareer());
		System.out.println("角色力量    :"+gr.getStrength());
		System.out.println("角色敏捷    :"+gr.getAgility());
		System.out.println("角色体力    :"+gr.getPhysical());
		System.out.println("角色智力    :"+gr.getIntelligence());
		System.out.println("角色智慧    :"+gr.getWisdom());
		System.out.println("角色生命值:"+gr.getLifevalue());
		System.out.println("角色魔法值:"+gr.getMagicvalue());

	}
	//判断姓名是否输入正确
	private static boolean judgename(String name) {
		// TODO 自动生成的方法存根
		if(name.length()>50)
			return true;
		else
			return false;
	}

}

在这里插入图片描述

运行结果

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值