1. 程式人生 > >Java:RPG角色生成器

Java:RPG角色生成器

                                                                  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.顯示資訊

       最後向用戶顯示該角色的所有資訊,然後詢問使用者是否滿意,如使用者不滿意則重新建立,若使用者滿意則程式結束,並將使用者建立角色的相關資訊寫入檔案儲存。

原始碼:

RoleDefinition類:

package com._520it.chapter02;

import java.util.Scanner;

/**
 * 角色定義
 * @author Jack
 * @date 2018-10-01
 * @version 1.0
 */
public class RoleDefinition {
	private String name; // 角色姓名
	private int gender; // 角色性別

	/**
	 * 獲取角色姓名
	 * @return 角色姓名
	 */
	public String getName() {
		return name;
	}

	/**
	 * 設定角色姓名
	 * @param name 角色姓名
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * 獲取角色性別
	 * @return 角色性別
	 */
	public int getGender() {
		return gender;
	}

	/**
	 * 設定角色性別
	 * @param gender 角色性別
	 */
	public void setGender(int gender) {
		this.gender = gender;
	}

	/**
	 * 設定角色的姓名和性別
	 * @return 角色性別
	 */
	public int inputNameAndGender() {
		System.out.println("請輸入您遊戲角色的姓名:");
		Scanner sc = new Scanner(System.in);
		this.name = sc.next();
		while (true) {
			System.out.println("請選擇您遊戲角色的性別(0男性,1女性):");
			this.gender = sc.nextInt();
			// 判斷性別輸入是否正確
			if (gender == 0 || gender == 1) {
				// 輸入正確
				break;
			} else {
				System.out.println("請輸入0或1來選擇性別!");
			}
		}
		return gender;
	}

	/**
	 * 輸出角色的姓名和性別資訊
	 */
	public void outputNameAndGender() {
		System.out.println("==============================");
		System.out.println(" 姓名\t\t\t" + this.name);
		System.out.println("==============================");
		if (this.gender == 0) {
			System.out.println(" 性別\t\t\t" + "男性");
		} else {
			System.out.println(" 性別\t\t\t" + "女性");
		}
	}

}

RaceAndProfession類:

package com._520it.chapter02;

import java.util.Scanner;

/**
 * 角色的種族和職業
 * @author Jack
 * @date 2018-10-01
 * @version 1.0
 */
public class RaceAndProfession {
	private int race; // 種族
	private int profession; // 職業
	private String[] races = { "人類", "精靈", "獸人", "矮人", "元素" };
	private String[] professions = { "狂戰士", "聖騎士", "刺客", "獵手", "祭司", "巫師" };

	/**
	 * 獲取角色職業資訊
	 * @return 角色職業資訊
	 */
	public int getProfession() {
		return this.profession;
	}

	/**
	 * 獲取角色種族資訊
	 * @return 角色種族資訊
	 */
	public int getRace() {
		return race;
	}

	/**
	 * 設定角色種族
	 * @param race 角色種族
	 */
	public void setRace(int race) {
		this.race = race;
	}

	/**
	 * 選擇角色種族
	 * @return 角色種族資訊
	 */
	public int selectRace() {
		while (true) {
			System.out.println("請選擇您遊戲角色的種族(0人類,1精靈,2獸人,3矮人,4元素):");
			Scanner sc = new Scanner(System.in);
			this.race = sc.nextInt();
			// 判斷種族輸入是否正確
			if (race >= 0 && race <= 4) {
				// 輸入正確跳出迴圈
				break;
			} else {
				System.out.println("請輸入0到4之間的數字來選擇種族!");
			}
		}
		return race;
	}

	/**
	 * 選擇角色職業
	 * @param race 角色種族資訊
	 * @return 角色職業資訊
	 */
	public int selectProfession(int race) {
		switch (race) {
		case 0:
			while (true) {
				System.out.println("請選擇您的職業(0狂戰士,1聖騎士,2刺客,3獵手,4祭司,5巫師):");
				Scanner sc = new Scanner(System.in);
				this.profession = sc.nextInt();
				// 判斷職業輸入是否正確
				if (profession >= 0 && profession <= 5) {
					// 輸入正確跳出迴圈
					break;
				} else {
					System.out.println("請輸入0到5之間的數字來選擇職業!");
				}
			}
			break;
		case 1:
			while (true) {
				System.out.println("請選擇您的職業(2刺客,3獵手,4祭司,5巫師):");
				Scanner sc = new Scanner(System.in);
				this.profession = sc.nextInt();
				// 判斷職業輸入是否正確
				if (profession >= 2 && profession <= 5) {
					// 輸入正確跳出迴圈
					break;
				} else {
					System.out.println("請輸入2到5之間的數字選擇職業!");
				}
			}
			break;
		case 2:
			while (true) {
				System.out.println("請選擇您的職業(0狂戰士,3獵手,4祭司):");
				Scanner sc = new Scanner(System.in);
				this.profession = sc.nextInt();
				// 判斷職業輸入是否正確
				if (profession == 0 || profession == 3 || profession == 4) {
					// 輸入正確跳出迴圈
					break;
				} else {
					System.out.println("請輸入數字0、3或4來選擇職業!");
				}
			}
			break;
		case 3:
			while (true) {
				System.out.println("請選擇您的職業(0狂戰士,1聖騎士,4祭司):");
				Scanner sc = new Scanner(System.in);
				this.profession = sc.nextInt();
				// 判斷職業輸入是否正確
				if (profession == 0 || profession == 1 || profession == 4) {
					// 輸入正確跳出迴圈
					break;
				} else {
					System.out.println("請輸入數字0、1或4來選擇職業!");
				}
			}
			break;
		case 4:
			while (true) {
				System.out.println("請選擇您的職業(4祭司,5巫師):");
				Scanner sc = new Scanner(System.in);
				this.profession = sc.nextInt();
				// 判斷種族輸入是否正確
				if (profession == 4 || profession == 5) {
					// 輸入正確跳出迴圈
					break;
				} else {
					System.out.println("請輸入數字4或5來選擇職業!");
				}
			}
			break;
		default:
			break;
		}
		return profession;
	}

	/**
	 * 輸出角色的種族和職業資訊
	 */
	public void outputRaceAndProfession() {
		System.out.println("==============================");
		System.out.println(" 種族\t\t\t" + races[this.race]);
		System.out.println("==============================");
		System.out.println(" 職業\t\t\t" + professions[this.profession]);
	}
}

ProfessionAttribute類:

package com._520it.chapter02;

import java.util.Random;

/**
 * 角色的職業屬性
 * @author Jack
 * @date 2018-10-01
 * @version 1.0
 */
public class ProfessionAttribute {
	private int strength; // 力量
	private int agility; // 敏捷
	private int physical; // 體力
	private int intelligence; // 智力
	private int wisdom; // 智慧
	private int HP; // 生命值ֵ
	private int MP; // 魔法值ֵ

	/**
	 * 獲取角色的力量屬性
	 * @return 力量屬性
	 */
	public int getStrength() {
		return strength;
	}

	/**
	 * 獲取角色的敏捷屬性
	 * @return 敏捷屬性
	 */
	public int getAgility() {
		return agility;
	}

	/**
	 * 獲取角色的體力屬性
	 * @return 體力屬性
	 */
	public int getPhysical() {
		return physical;
	}

	/**
	 * 獲取角色的智力屬性
	 * @return 智力屬性
	 */
	public int getIntelligence() {
		return intelligence;
	}

	/**
	 * 獲取角色的智慧屬性
	 * @return 智慧屬性
	 */
	public int getWisdom() {
		return wisdom;
	}

	/**
	 * 獲取角色的生命值屬性
	 * @return 生命值屬性
	 */
	public int getHP() {
		return HP;
	}

	/**
	 * 獲取角色的魔法值屬性
	 * @return 魔法值屬性
	 */
	public int getMP() {
		return MP;
	}

	/**
	 * 自動生成角色屬性
	 * @param str 角色初始力量屬性
	 * @param agi 角色初始敏捷屬性
	 * @param phy 角色初始體力屬性
	 * @param intell 角色初始智力屬性
	 * @param wis 角色初始智慧屬性
	 */
	public void AutoGenerateAttribute(int str, int agi, int phy, int intell, int wis) {
		int sum = 0;
		Random random = new Random();
		do {
			strength = random.nextInt(5) % 10 + str;
			agility = random.nextInt(5) % 10 + agi;
			physical = random.nextInt(5) % 10 + phy;
			intelligence = random.nextInt(5) % 10 + intell;
			wisdom = random.nextInt(5) % 10 + wis;
			sum = strength + agility + physical + intelligence + wisdom;
		} while (sum != 100);
		// 生命值為體力的20倍
		HP = physical * 20;
		// 魔法值為智力與智慧之和的10倍
		MP = (wisdom + intelligence) * 10;
	}

	/**
	 * 初始化角色屬性
	 * @param profession 角色職業資訊
	 */
	public void initialAttributes(int profession) {
		if (profession == 0) {
			AutoGenerateAttribute(40, 20, 30, 5, 5);
		}
		if (profession == 1) {
			AutoGenerateAttribute(25, 15, 30, 20, 10);
		}
		if (profession == 2) {
			AutoGenerateAttribute(20, 35, 20, 15, 10);
		}
		if (profession == 3) {
			AutoGenerateAttribute(15, 40, 15, 10, 20);
		}
		if (profession == 4) {
			AutoGenerateAttribute(15, 20, 15, 35, 15);
		}
		if (profession == 5) {
			AutoGenerateAttribute(10, 20, 10, 20, 40);
		}
	}

	/**
	 * 輸出角色的屬性資訊
	 */
	public void outputProfessionAttribute() {
		System.out.println("==============================");
		System.out.println(" 力量\t\t\t" + this.strength);
		System.out.println("==============================");
		System.out.println(" 敏捷\t\t\t" + this.agility);
		System.out.println("==============================");
		System.out.println(" 體力\t\t\t" + this.physical);
		System.out.println("==============================");
		System.out.println(" 智力\t\t\t" + this.intelligence);
		System.out.println("==============================");
		System.out.println(" 智慧\t\t\t" + this.wisdom);
		System.out.println("==============================");
		System.out.println(" 生命值\t\t\t" + this.HP);
		System.out.println("==============================");
		System.out.println(" 魔法值\t\t\t" + this.MP);
		System.out.println("==============================");
	}
}

RolePlaying類:

package com._520it.chapter02;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

/**
 * 角色生成器測試類
 * @author Jack
 * @date 2018-10-01
 * @version 1.0
 */
public class RolePlaying {
	public static void main(String[] args) {
		boolean flag = true;
		Scanner sc = new Scanner(System.in);
		// 建立角色物件
		RoleDefinition role = new RoleDefinition();
		RaceAndProfession rap = new RaceAndProfession();
		ProfessionAttribute pa = new ProfessionAttribute();
		do {
			role.inputNameAndGender();
			int race = rap.selectRace();
			rap.selectProfession(race);
			// 輸出角色基本資訊
			role.outputNameAndGender();
			rap.outputRaceAndProfession();
			pa.initialAttributes(rap.getProfession());
			pa.outputProfessionAttribute();
			// 判斷使用者是否滿意
			System.out.println("是否滿意角色屬性?(Y/N)若不滿意,則重新建立!");
			String str = sc.next();
			if ("Y".equals(str) || "y".equals(str)) {
				break;
			}
		} while (flag);
		// 將角色資訊儲存到檔案中
		saveRoleInformation(role, rap, pa);
		System.out.println("角色資訊已成功儲存!");
	}

	/**
	 * 將角色資訊儲存到檔案中
	 * @param role 角色類物件
	 * @param rap 種族職業類物件
	 * @param pa 職業屬性類物件
	 */
	public static void saveRoleInformation(RoleDefinition role, RaceAndProfession rap, ProfessionAttribute pa) {
		try {
			// 建立字元輸出流物件
			FileWriter desFile = new FileWriter("resources/roles_information.txt", true);
			// 字元緩衝輸出流
			BufferedWriter out = new BufferedWriter(desFile);
			out.write(" 姓名\t\t\t" + role.getName());
			// 輸出換行
			out.newLine();
			if (role.getGender() == 0) {
				out.write(" 性別\t\t\t" + "男性");
			} else {
				out.write(" 性別\t\t\t" + "女性");
			}
			out.newLine();
			switch (rap.getRace()) {
			case 0:
				out.write(" 種族\t\t\t" + "人類");
				break;
			case 1:
				out.write(" 種族\t\t\t" + "精靈");
				break;
			case 2:
				out.write(" 種族\t\t\t" + "獸人");
				break;
			case 3:
				out.write(" 種族\t\t\t" + "矮人");
				break;
			case 4:
				out.write(" 種族\t\t\t" + "元素");
				break;
			default:
				break;
			}
			out.newLine();
			switch (rap.getProfession()) {
			case 0:
				out.write(" 職業\t\t\t" + "狂戰士");
				break;
			case 1:
				out.write(" 職業\t\t\t" + "聖騎士");
				break;
			case 2:
				out.write(" 職業\t\t\t" + "刺客");
				break;
			case 3:
				out.write(" 職業\t\t\t" + "獵手");
				break;
			case 4:
				out.write(" 職業\t\t\t" + "祭司");
				break;
			case 5:
				out.write(" 職業\t\t\t" + "巫師");
				break;
			default:
				break;
			}
			out.newLine();
			out.write(" 力量\t\t\t" + pa.getStrength());
			out.newLine();
			out.write(" 敏捷\t\t\t" + pa.getAgility());
			out.newLine();
			out.write(" 體力\t\t\t" + pa.getPhysical());
			out.newLine();
			out.write(" 智力\t\t\t" + pa.getIntelligence());
			out.newLine();
			out.write(" 智慧\t\t\t" + pa.getWisdom());
			out.newLine();
			out.write(" 生命值\t\t\t" + pa.getHP());
			out.newLine();
			out.write(" 魔法值\t\t\t" + pa.getMP());
			out.newLine();
			// 關閉資源
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

                                                                                             執行效果展示