- 功能描述
几乎所有的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.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
Information基类
package com.rpg.game;
import java.awt.Color;
import java.awt.Font;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
public class Information {
JFrame f = new JFrame("欢迎进入");//窗口名称
JLabel lname=new JLabel(" ☆ 姓名: ");
JTextField name=new JTextField(500);
JLabel lsex=new JLabel(" ☆ 性别: ");
ButtonGroup bgrp_sex=new ButtonGroup();//单选;设置按钮组
JRadioButton sex0=new JRadioButton("男♂");
JRadioButton sex1=new JRadioButton("女♀");
/*
* 设置游戏角色设定窗口
*/
public void frame(){
f.setSize(850,450);//大小
f.setLocation(500,200);//位置
f.setLayout(null);
//进入界面上方标题
JLabel title=new JLabel("龙与地下城");
title.setBounds(300, 30, 500, 50);
title.setFont(new Font("隶书", Font.BOLD, 40));
f.add(title);
JLabel build=new JLabel("请创建您的角色 ");
build.setBounds(50, 80, 500, 50);
build.setFont(new Font("隶书", Font.BOLD, 30));
f.add(build);
//设置窗口背景颜色
f.getContentPane().setBackground(new Color(210,240,240));
f.setVisible(true);
}
/*
* 设定输入姓名和选择性别
*/
public void get_Information(){
//游戏角色姓名输入
lname.setBounds(50, 150, 150, 30);//起始坐标(x,y),长度,高度
f.add(lname);
lname.setFont(new Font("楷体", Font.BOLD, 20));
//静态输入框
name.setBounds(200, 150, 200, 30);
f.add(name);
//游戏性别选择
lsex.setBounds(50, 200, 150, 30);
f.add(lsex);
lsex.setFont(new Font("楷体", Font.BOLD, 20));
//性别的单选按钮
sex0.setBounds(200, 200, 100, 30);
sex1.setBounds(300, 200, 100, 30);
bgrp_sex.add(sex0);
bgrp_sex.add(sex1);
f.add(sex0);
f.add(sex1);
sex0.setOpaque(false);
sex1.setOpaque(false);
f.setVisible(true);
}
}
Race类继承基类
package com.rpg.game;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
public class Race extends Information{
JLabel lrace=new JLabel(" ☆ 种族: ");
ButtonGroup bgrp_race=new ButtonGroup();//单选;设置按钮组
JRadioButton race0=new JRadioButton("人类");
JRadioButton race1=new JRadioButton("精灵");
JRadioButton race2=new JRadioButton("兽人");
JRadioButton race3=new JRadioButton("矮人");
JRadioButton race4=new JRadioButton("元素");
JLabel lcareer=new JLabel(" ☆ 职业: ");
ButtonGroup bgrp_career=new ButtonGroup();//单选;设置按钮组
JRadioButton career0=new JRadioButton("狂战士");
JRadioButton career1=new JRadioButton("圣骑士");
JRadioButton career2=new JRadioButton("刺客");
JRadioButton career3=new JRadioButton("猎手");
JRadioButton career4=new JRadioButton("祭司");
JRadioButton career5=new JRadioButton("巫师");
/*
* 设置种族和职业选项
* 不同种族对应不同职业
* 应对选择的种族添加事件监听 对个别职业设置不可选来实现
*/
public void get_Race(){
//游戏种族选择
lrace.setBounds(50, 250, 150, 30);
f.add(lrace);
lrace.setFont(new Font("楷体", Font.BOLD, 20));
//五个种族的单选按钮
race0.setBounds(200, 250, 100, 30);
race1.setBounds(300, 250, 100, 30);
race2.setBounds(400, 250, 100, 30);
race3.setBounds(500, 250, 100, 30);
race4.setBounds(600, 250, 100, 30);
bgrp_race.add(race0);
bgrp_race.add(race1);
bgrp_race.add(race2);
bgrp_race.add(race3);
bgrp_race.add(race4);
f.add(race0);
f.add(race1);
f.add(race2);
f.add(race3);
f.add(race4);
race0.setOpaque(false);
race1.setOpaque(false);
race2.setOpaque(false);
race3.setOpaque(false);
race4.setOpaque(false);
//游戏职业选择
lcareer.setBounds(50, 300, 150, 30);
f.add(lcareer);
//六个职业的单选按钮
lcareer.setFont(new Font("楷体", Font.BOLD, 20));
career0.setBounds(200, 300, 100, 30);
career1.setBounds(300, 300, 100, 30);
career2.setBounds(400, 300, 100, 30);
career3.setBounds(500, 300, 100, 30);
career4.setBounds(600, 300, 100, 30);
career5.setBounds(700, 300, 100, 30);
bgrp_career.add(career0);
bgrp_career.add(career1);
bgrp_career.add(career2);
bgrp_career.add(career3);
bgrp_career.add(career4);
bgrp_career.add(career5);
f.add(career0);
f.add(career1);
f.add(career2);
f.add(career3);
f.add(career4);
f.add(career5);
career0.setOpaque(false);
career1.setOpaque(false);
career2.setOpaque(false);
career3.setOpaque(false);
career4.setOpaque(false);
career5.setOpaque(false);
//不同种族对应不同职业的选择
race0.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
career0.setEnabled(true);
career1.setEnabled(true);
career2.setEnabled(true);
career3.setEnabled(true);
career4.setEnabled(true);
career5.setEnabled(true);
}
}
});
race1.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
career0.setEnabled(false);
career1.setEnabled(false);
career2.setEnabled(true);
career3.setEnabled(true);
career4.setEnabled(true);
career5.setEnabled(true);
}
}
});
race2.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
career0.setEnabled(true);
career1.setEnabled(false);
career2.setEnabled(false);
career3.setEnabled(true);
career4.setEnabled(true);
career5.setEnabled(false);
}
}
});
race3.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
career0.setEnabled(true);
career1.setEnabled(true);
career2.setEnabled(false);
career3.setEnabled(false);
career4.setEnabled(true);
career5.setEnabled(false);
}
}
});
race4.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
career0.setEnabled(false);
career1.setEnabled(false);
career2.setEnabled(false);
career3.setEnabled(false);
career4.setEnabled(true);
career5.setEnabled(true);
}
}
});
f.setVisible(true);
}
}
Random 生成随机数类
package com.rpg.game;
import java.util.*;
public class get_Random {
public int power;//力量
public int speed;//敏捷
public int physical;//体力
public int IQ;//智力
public int wisdom;//智慧
public int HP=physical*20;//生命值
public int MP=(IQ+wisdom)*10;//魔法值
public String count;
public String getRandom(int a,int b,int c,int d,int e){
int power;//力量
int speed;//敏捷
int physical;//体力
int IQ;//智力
int wisdom;//智慧
Random rand=new Random();
do{
power=a+rand.nextInt()%5;
speed=b+rand.nextInt()%5;
physical=c+rand.nextInt()%5;
IQ=d+rand.nextInt()%5;
wisdom=e+rand.nextInt()%5;
}while(power+speed+physical+IQ+wisdom!=100);
int HP=physical*20;//生命值
int MP=(IQ+wisdom)*10;//魔法值
count="力量值:\t"+power+"\n\n敏捷度:\t"+speed+"\n\n体力值:\t"+physical+"\n\n智力值:\t"+IQ+"\n\n智慧值:\t"+wisdom+"\n\n生命值:\t"+HP+"\n\n魔法值:\t"+MP;
return count;
}
}
RPG_GUI
显示最后生成的界面
package com.rpg.game;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class RPG_GUI extends Race{
JFrame fr=new JFrame();
String user_name;
String user_sex;
String race;
String career;
public static final String NEW_LINE = System.getProperty("line.separator");// 获取系统的换行符
public static final String FILE_PATH = "E:/users.txt";//指定文件的路径
Save save=new Save();
/*
* 设置按钮"下一步"实现生成角色
* 弹出生成的角色的窗口
*/
public void game(){
//设置生成按钮
JButton complete=new JButton("下一步");
complete.setBounds(350, 350, 100, 30);
f.add(complete);
f.setVisible(true);//可见性
//生成按钮的事件响应
complete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==complete){
f.setVisible(false);
//设置生成的角色显示界面
JFrame fr=new JFrame();
fr.setLocation(700, 100);
fr.setTitle("您的角色");
fr.setSize(400,800);
fr.setLayout(null);
fr.getContentPane().setBackground(new Color(40,210,210));
get_Random rand=new get_Random();
user_name=name.getText();//获取静态文本框输入的姓名
user_sex = null;
if(sex0.isSelected()) user_sex="男";//获取选择的性别
else if(sex1.isSelected()) user_sex="女";
JLabel a = new JLabel("姓名: "+user_name);
JLabel b=new JLabel("性别: "+user_sex);
race = null;
String str=null;
if(race0.isSelected()) {race="人类";str=rand.getRandom(40,20,30,5,5);}
else if(race1.isSelected()) {race="精灵";str=rand.getRandom(25,15,30,20,10);}
else if(race2.isSelected()) {race="兽人";str=rand.getRandom(20,35,20,15,10);}
else if(race3.isSelected()) {race="矮人";str=rand.getRandom(15,40,15,10,20);}
else if(race4.isSelected()) {race="元素";str=rand.getRandom(10,20,10,20,40);}
JLabel c=new JLabel("种族: "+race);
career = null;
if(career0.isSelected())career="狂战士";
else if(career1.isSelected()) career="圣骑士";
else if(career2.isSelected()) career="刺客";
else if(career3.isSelected()) career="猎手";
else if(career4.isSelected()) career="祭司";
else if(career5.isSelected()) career="巫师";
JLabel d=new JLabel("职业: "+career);
JTextArea value=new JTextArea();
value.setText(str);
a.setBounds(100, 50, 400, 30);
b.setBounds(100, 100, 300, 30);
c.setBounds(100, 150, 300, 30);
d.setBounds(100, 200, 300, 30);
value.setEditable(false);
value.setBounds(100, 250, 150, 400);
value.setOpaque(false);//设置为不透明
a.setFont(new Font("黑体",Font.BOLD, 20));
b.setFont(new Font("黑体",Font.BOLD, 20));
c.setFont(new Font("黑体",Font.BOLD, 20));
d.setFont(new Font("黑体",Font.BOLD, 20));
value.setFont(new Font("黑体",Font.BOLD, 20));
JLabel isOK =new JLabel("您对生成角色是否满意?");
isOK.setBounds(100, 600, 400, 30);
isOK.setFont(new Font("黑体", Font.PLAIN, 20));
fr.add(isOK);
JButton yes=new JButton("满意");
yes.setBounds(100, 650, 80, 30);
fr.add(yes);
JButton no=new JButton("不满意");
no.setBounds(200, 650, 80, 30);
fr.add(no);
fr.add(a);
fr.add(b);
fr.add(c);
fr.add(d);
fr.add(value);
fr.setVisible(true);
//满意按钮弹出提示框
yes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StringBuffer sb = new StringBuffer();
sb.append("姓名: "+user_name+NEW_LINE+"性别: "+user_sex+NEW_LINE+"种族: "+race+NEW_LINE+"职业: "+career+
NEW_LINE+rand.count+NEW_LINE);
save.saveInfo(sb.toString());
JOptionPane.showMessageDialog(new JFrame().getContentPane(), "恭喜您 创建成功!", "系统信息", JOptionPane.PLAIN_MESSAGE);
}
});
//不满意按钮弹出提示框
no.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = JOptionPane.showConfirmDialog(fr, "您是否想重新创建");
if (JOptionPane.OK_OPTION == option) {
fr.setVisible(false);
name.setText(null);
bgrp_sex.clearSelection();
career0.setEnabled(true);
career1.setEnabled(true);
career2.setEnabled(true);
career3.setEnabled(true);
career4.setEnabled(true);
career5.setEnabled(true);
bgrp_race.clearSelection();
bgrp_career.clearSelection();
f.setVisible(true);
}
else if(JOptionPane.NO_OPTION==option){
fr.setVisible(false);
}
}
});
}
}
});
}
public static void main(String[] args) {
RPG_GUI rpg=new RPG_GUI();
rpg.frame();
rpg.get_Information();
rpg.get_Race();
rpg.game();
}
}
Save 保存信息到文件中
package com.rpg.game;
import java.io.FileWriter;
import java.io.IOException;
public class Save {
public static final String NEW_LINE = System.getProperty("line.separator");// 获取系统的换行符
public static final String FILE_PATH = "E:/users.txt";//指定文件的路径
//方法:保存信息到文件
public boolean saveInfo(String info) {
FileWriter fw;
try {
fw = new FileWriter(FILE_PATH, true);//追加文字到文件尾部
fw.write(info);
fw.close();
} catch (IOException e) {
e.printStackTrace();
return false;//IO异常,保存不成功
}
return true;//保存成功
}
}