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.显示信息

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

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;//保存成功
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值