RPG角色生成器(java)

一、实验目的
1.掌握面向对象程序设计的方法。明确类与对象的概念,掌握面向对象设计七大原则;
2.掌握常见的设计模式以及类图的描述。

二、实验内容

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

2.游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。

3.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
种族/职业 狂战士 圣骑士 刺客 猎手 祭司 巫师

所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
4.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
职业/属性 力量 敏捷 体力 智力 智慧

例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
6.实验要求
1.题目分析
2.类图设计
使用UML的类图结构设计,要求遵循面向对象设计的7大原则,使用适合的设计模式。

三、题目分析及类图设计

1.题目分析
通过对题目的解读,RPG角色生成器共生成角色的姓名、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。可将这11个属性归为3类来实现。
角色基本信息类,此类中仅包含角色的姓名的输入和角色性别的选择。
(2) 角色职业类,此类中包含角色的种族和职业的选择,角色的职业依赖于角色种族的选择,不同的种族可以选择的职业不同。
(3)角色属性值类,此类中包含选中职业的各项属性值,各项属性值因为职业不同而不同,同时各项属性值为随机值,利用传递参数的方法将初始值给定,再给初始值加上随机的一个整数(可能为正可能为负)实现职业的属性值在特定值附近的随机。
属性值随机 = 初始值 + 随机数(正负随机)
(4)角色信息保存类,此类中将角色基本信息类中的姓名和性别、角色职业类中的种族和职业、角色属性值类中的各项属性进行保存。将以上信息同时保存到information.txt文件和已经创建好的RPG数据库中。
a.保存至文件:采用FileWriter创建一个字符输出流对象,将信息输出到指定的文件。
b.保存至数据库:先利用SQL语句在MYSQL中创建RPG数据库,并添加information表,表中包含11项属性,利用JDBC连接MYSQL数据库进行数据保存。

2.类图设计

四、主要代码

BasicInfoemation 类:

package RPG;import java.util.Scanner;class  BasicInfoemation{String name;String sex;Scanner s = new Scanner(System.in);public void setName() {System.out.println("请输入您游戏角色的姓名:");name = s.next();}public void setSex() {int sex_no;System.out.println("请选择您游戏角色的性别(0男性, 1女性):");while(true) {sex_no = s.nextInt();if(sex_no == 0) {sex = "男";break;}else if(sex_no == 1) {sex = "女";break;}else {System.out.println("请输入0或者1来选择性别!请重新输入:");}}}public void showInformation() {System.out.println("--------------------");System.out.println("姓名\t\t" + name);System.out.println("--------------------");System.out.println("性别\t\t" + sex);}
}public class TestRPG {public static void main(String[] args) {// TODO Auto-generated method stubBasicInfoemation b = new BasicInfoemation();b.setName();b.setSex();b.showInformation();}
}

Role类:

package RPG;import java.util.Scanner;class Role{int role_no;int race_no;String role;String race;Scanner s = new Scanner(System.in);public void setRace() {System.out.println("请输入您游戏角色的种族(0人类,1精灵,2兽人,3矮人,4元素):");while(true) {race_no = s.nextInt();if(race_no == 0) {race = "人类";System.out.println("请选择您的择业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师):");break;}else if(race_no == 1) {race = "精灵";System.out.println("请选择您的择业(2刺客,3猎手,4祭司,5巫师):");break;}else if(race_no == 2) {race = "兽人";System.out.println("请选择您的择业(0狂战士,3猎手,4祭司):");break;}else if(race_no == 3) {race = "矮人";System.out.println("请选择您的择业(0狂战士,1圣骑士,4祭司):");break;}else if(race_no == 4) {race = "元素";System.out.println("请选择您的择业(4祭司,5巫师):");break;}else {System.out.println("请输入0~4之中的任意一个选择种族:");}}}public void setRole() {while(true) {role_no = s.nextInt();if(race_no == 0  && (role_no >= 0 && role_no <= 5)) {break;}else if(race_no == 1 && (role_no >= 2 && role_no <= 5)) {break;}else if(race_no == 2 && (role_no == 0 || role_no == 3 || role_no == 4)) {break;}else if(race_no == 3 && (role_no == 0 || role_no == 1 || role_no == 4)) {break;}else if(race_no == 4 && (role_no == 4 || role_no == 5)) {break;}else {System.out.println("您输入的有误,请重新输入职业序号:");}}if (role_no == 0) {role = "狂战士";}if (role_no == 1) {role = "圣骑士";}if (role_no == 2) {role = "刺客";}if (role_no == 3) {role = "猎手";}if (role_no == 4) {role = "祭司";}if (role_no == 5) {role = "巫师";}}public void showRole() {System.out.println("--------------------");System.out.println("种族\t" + race);System.out.println("--------------------");System.out.println("职业\t" + role);}
}public class TestRole {public static void main(String[] args) {// TODO Auto-generated method stubRole r =new Role();r.setRace();r.setRole();r.showRole();}
}

AttributeValue 类:

package RPG;import java.util.Random;class AttributeValue{int strength;          //力量int agility;           //敏捷int physical_power;    //体力int intelligence;      //智力 int wisdom;            //智慧int HP;int MP;public void randomAttributeValue(int strength, int agility, int physical_power, int intelligence, int wisdom){int sum_value = 0;Random r = new Random();while(sum_value != 100){this.strength = strength + r.nextInt(5) - 3;this.agility = agility + r.nextInt(5)- 3;this.physical_power = physical_power + r.nextInt(5)- 3;this.intelligence = intelligence + r.nextInt(5)- 3;this.wisdom = wisdom + r.nextInt(5)- 3;sum_value = this.strength + this.agility + this.physical_power + this.intelligence + this.wisdom;}HP = this.physical_power * 20;MP = (this.wisdom + this.intelligence) * 10;}public void getAttributeValue() {Role role = new Role();if (role.role_no == 0) {randomAttributeValue(40, 20, 30, 5, 5);}if (role.role_no == 1) {randomAttributeValue(25, 15, 30, 20, 10);}if (role.role_no == 2) {randomAttributeValue(20, 35, 20, 15, 10);}if (role.role_no == 3) {randomAttributeValue(15, 40, 15, 10, 20);}if (role.role_no == 4) {randomAttributeValue(15, 20, 15, 35, 15);}if (role.role_no == 5) {randomAttributeValue(10, 20, 10, 20, 40);}}public void showAttributeValue() {System.out.println("--------------------");System.out.println("力量\t" + strength);System.out.println("--------------------");System.out.println("敏捷\t" + agility);System.out.println("--------------------");System.out.println("体力\t" + physical_power);System.out.println("--------------------");System.out.println("智力\t" + intelligence);System.out.println("--------------------");System.out.println("智慧\t" + wisdom);System.out.println("--------------------");System.out.println("生命值\t" + HP);System.out.println("--------------------");System.out.println("魔法值\t" + MP);System.out.println("--------------------");}
}public class TestAttributeValue {public static void main(String[] args) {AttributeValue a = new AttributeValue();a.getAttributeValue();a.showAttributeValue();}
}

SaveInformation 类:

package RPG;import java.io.*;
import java.sql.*;
import java.util.Random;
import java.util.Scanner;class SaveInformation {String flag;BasicInfoemation b = new BasicInfoemation();Role r =new Role();AttributeValue a = new AttributeValue();public void saveToFile() throws Exception{FileWriter f = new FileWriter("C:\\Users\\sqx\\Desktop\\Information.txt",true);f.write("姓名\t\t" + b.name + "\r\n");f.write("性别\t\t" + b.sex + "\r\n");f.write("种族\t" + r.race + "\r\n");f.write("职业\t" + r.role + "\r\n");f.write("力量\t" + a.strength + "\r\n");f.write("敏捷\t" + a.agility + "\r\n");f.write("体力\t" + a.physical_power + "\r\n");f.write("智力\t" + a.intelligence + "\r\n");f.write("智慧\t" + a.wisdom + "\r\n");f.write("HP\t" + a.HP + "\r\n");f.write("MP\t" + a.MP + "\r\n");f.close();}public  void saveToDB() throws SQLException{Connection conn = null;Statement stmt = null;ResultSet rs = null;try {//加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//通过DriverManger获取数据库连接String url = "jdbc:mysql://localhost:3306/RPG";String username = "root";String password = "xxxxxx";  // 密码conn = DriverManager.getConnection(url, username, password);stmt = conn.createStatement();//           BasicInfoemation b = new BasicInfoemation();
//          Role r =new Role();
//          AttributeValue a = new AttributeValue();String sql = "insert  into Information values ('" + b.name + "','" + b.sex + "','" + r.race+ "','" + r.role + "'," + a.strength + "," + a.agility + "," + a.physical_power + "," + a.intelligence+ "," + a.wisdom + "," + a.HP +  "," + a.MP + ")";stmt.execute(sql);}catch(Exception e) {e.printStackTrace();}finally {if(rs != null) {rs.close();}if(stmt != null) {stmt.close();}if(conn != null) {conn.close();}}}public void judge() throws Exception {b.setName();b.setSex();r.setRace();r.setRole();while(true) {a.getAttributeValue();b.showInformation();r.showRole();a.showAttributeValue();System.out.println("对生成的角色是否满意(Y/N):");Scanner s = new Scanner(System.in);flag = s.next();if(flag.equals("Y") || flag.equals("y")) {saveToFile();saveToDB();System.out.println("信息已保存");break;}  }   }
}public class TestSaveInformation {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubSaveInformation c = new SaveInformation();c.judge();}}

五、测试与调试

1.遇到的问题:驱动包url出错,显示com.mysql.jdbc.Driver失效,错误提示将其改为com.mysql.cj.jdbc.Driver之后驱动包正常。
连接数据库时因为时区不一致导致无法连接数据库,经过百度后利用set time_zone = ‘+8:00’ 进行时区设置,数据库可以正常连接。

对BasicInfoemation类的测试:

对Role类的测试:

整体测试:


输入n后重新随机属性,如图:


输入Y进行保存,成功保存进记事本


可见并未保存至数据库,对程序进行Debug发现SQL语句中的各个属性值并没有获取到输入的值,因为在saveToDB()中对每个类新new了一个对象,没有获取到输入的值,将这些对象删掉,直接用原来各个类中的对象调用属性,即可获取输入的值




输入多组,都可保存至mysql数据库中

六、总结
通过本次上机对类和对象的概念更加深刻,在同一个包下,一个类中创建另一个类的对象,虽然用了同样的对象名但是并不能够获得相应的值,直接使用另一个类的对象即可获得所需值。对面向对象的7大原则有了更深的了解,同时对java中的文件操作有了初步的了解,也实现了使用JDBC连接数据库的操作,对于自己来说是一个大的突破,以后对于信息的保存就能够写入数据库,但是对利用程序对数据库进行操作并不熟练,需要进行练习。对uml类图的绘制有了了解,但是对于各个图之间的关系还不能明确定义。

RPG角色生成器(java)相关推荐

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

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

  2. RPG角色生成器(C++)

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

  3. 【C++】RPG角色生成器

    直达快车:           二.类图设计           三.代码实现           四.运行截图 一.题目分析 [功能总述] 1.创建角色,属性为:名字.性别.种族.职业.力量.敏捷. ...

  4. Unity3D RPG角色扮演游戏源码(上下)-----源代码分析----04--修改菜单窗口

    Unity3D RPG角色扮演游戏源码(上下)-----源代码分析----04--修改菜单Shop窗口 此脚本用于创建商店以销售商品 --------------------------------- ...

  5. 狗屁不通文章生成器Java版

    1. 描述 该项目源码文件由四部分组成: Data.java 存储数据,生成的文章在Data类中选取 Driver.java 驱动类,用于生成文章 TitleReader.java 用于读取标题,标题 ...

  6. RPG游戏角色生成器

    一,题目分析: 1. 题目:编写一个简化的创建游戏角色的程序: 2. 分析:要编写此程序,建立一个角色类,围绕角色类进行选择和保存等操作.单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化 ...

  7. SSM实现RPG游戏之角色生成器

    功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色 游戏角色应有的属性 游戏角色应有以下属性:名字.性别.种族.职业.力量.敏 ...

  8. Java—实现 RPG 人物生成器

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

  9. python+pyqt5实现RPG游戏角色生成器

    游戏说明:输入姓名,选择性别,选择种族,职业,点击确定按钮,会生成各属性值,如果不满意,点击返回,重新选择. 首先准备一个保存下拉框选项数据的文件 rpgdict.py dictrace = {1:' ...

最新文章

  1. STM32 内存管理实验
  2. php 按 截取字符串,PHP按符号截取字符串的指定部分
  3. mysql 查询排行_通过mysql查询排行榜
  4. JFreeChart相关类中文说明
  5. 设置tableView的分割线从最左端开始
  6. python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程
  7. Android 友盟推送开发
  8. [转]Spring Cloud在国内中小型公司能用起来吗?
  9. 修复漏洞的Istio 1.1.1 发布了
  10. 使用Anaconda3配置多版本Python虚拟开发环境详细步骤
  11. 使用工具(Database Configuration Assistant)创建Oracle数据库
  12. NYOJ65 - 另一种阶乘问题
  13. Centos7#Linux基础富文本笔记
  14. 微信公众平台的设计与开发之道
  15. CRC16-IBM/MAXIM/USB/MODBUS/CCITT/CCITT-FALSE/X25/XMODEM查表算法
  16. MySQL 性能优化:8 种常见 SQL 错误用法!
  17. 2018上交软科计算机科学排名,2018年上海软科世界一流学科排名出炉!
  18. 关于tof相机很好的总结~
  19. securecrt能输入命令吗?
  20. PTA题目 到底是不是太胖了

热门文章

  1. 前端vue集成金格科技 iwebPdf 2018中间件
  2. java.lang.NullPointerException:null
  3. 写个自己看的博客随笔_发布游戏或者应用
  4. 体外诊断(IVD)高速发展
  5. jenkins中clearcase插件的使用
  6. 黑作坊风光大师完美破解版
  7. NVivo12教程之数据的存储模型
  8. RTMP协议命令的流程详解
  9. UTP: 非屏蔽双绞线
  10. Android Service启动