功能描述
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色
游戏角色应有的属性
- 游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值、魔法值和技能。
- 名字:不超过50个字符。
- 性别:可以选择男性和女性。
- 种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
- 职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
- 其余属性均为整数。
- 用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
- 生命值=体力*20。
- 魔法值=(智力+智慧)*10。
职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制
初始属性
力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息保存进数据库。
编码实现
1.首先创建web工程,在这里采用的maven,先导入ssm相关的以及测试的pom依赖
pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--log4j的依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--log4j的依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--mysql的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
<scope>runtime</scope>
</dependency>
<!--c3p0连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!--spring整合mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--Spring的jdbc模块-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!--导入spring的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!--Spring整合单元测试的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
</dependencies>
2.创建相关的配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--Spring的注解扫描器-->
<context:component-scan base-package="edu.xust"/>
<!-- 配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/role?characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!--mybatis整合spring-->
<bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-conf.xml"/>
</bean>
<!--mapper扫描器 bean的id为mapper类名首字母小写-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="edu.xust.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
Springmvc.xml
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置前端控制器(在web.xml中配置)-->
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
<!--配置处理器(注解开发无需配置)-->
<context:component-scan base-package="edu.xust.controller"/>
</beans>
mybatis-conf.xml
该配置文件将在后面的起别名的时候使用
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
</typeAliases>
</configuration>
log4j.properties
用来打印日志
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout
3.实体类的实现
为了节省篇幅,在这里没有写出get和set方法
public class RoleBean {
String username;//姓名
String sex;//性别
String race;//种族
String occupation;//职业
int strength;//力量
int agility;//敏捷
int physicial;//体力
int intellige;//智力
int intelligence;//智慧
int life;//生命值
int magic;//魔法值
String skill;//技能
}
3.mapper代理
RoleMapper.class
package edu.xust.mapper;
import edu.xust.pojo.RoleBean;
import org.springframework.stereotype.Repository;
@Repository
public interface RoleMapper {
//使用mybatis自动代理实现持久层
void insertRole(RoleBean role);
}
RoleMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.xust.mapper.RoleMapper">
<insert id="insertRole" parameterType="edu.xust.pojo.RoleBean">
insert into role values(#{username},#{sex},#{race},#{occupation},#{strength},#{agility},#{physicial},#{intellige},#{intelligence},#{life},#{magic},#{skill});
</insert>
</mapper>
4.生成属性
package edu.xust.utils;
import java.util.Random;
public class RoleUtil {
/**
* 采用随机数生成力量属性,其他属性在此基础上按比例进行计算
* @param occupation
* @return
*/
public static Object[] getProperty(String occupation) {
Object [] pro=new Object[8];
int strength = 0;//力量
int physical = 0;//体力
int inttellige = 0;//智慧
int inttelligence = 0;//智力
int life = 0;//生命值
int magic = 0;//魔法值
String skill = "";//技能
int agility = 0;//敏捷
Random random = new Random();
switch (occupation) {
case "狂战士":
strength = random.nextInt(3) + 39;//力量
agility = strength/2;//敏捷
physical = strength-10;//体力
inttelligence = strength/8;//智力
skill="狂战之崩山裂地斩";
break;
case "圣骑士":
strength = random.nextInt(3) + 23;//力量
agility = strength-10;//敏捷
physical = agility*2;//体力
inttelligence = agility+5;//智力
skill="圣骑之圣骑之光";//技能
break;
case "刺客":
strength = random.nextInt(3) + 20;//力量
agility = strength*2-5;//敏捷
physical = strength;//体力
inttelligence = physical-5;//智力
skill="幻舞";
break;
case "猎手":
strength = random.nextInt(3) + 13;//力量
agility = strength*3-5;//敏捷
physical = strength;//体力
inttelligence = physical-5;//智力
skill="猎手之猎刃";
break;
case "祭司":
strength = random.nextInt(3) + 13;//力量
agility = strength+5;//敏捷
physical = strength;//体力
inttelligence = physical+agility;//智力
skill = "祭司之四魂";
break;
case "巫师":
strength = random.nextInt(3) + 8;//力量
agility = strength*2;//敏捷
physical = strength;//体力
inttelligence = physical*2;//智力
skill = "巫师之怨灵";
break;
}
inttellige = 100-strength-agility-physical-inttelligence;//智慧
magic = (inttelligence+inttellige)*10;//魔法
life = physical*20;//生命值
pro[0]=strength;
pro[1] = agility;
pro[2] = physical;
pro[3] = inttelligence;
pro[4] = inttellige;
pro[5] = magic;
pro[6] = life;
pro[7] = skill;
return pro;
}
}
5.service层
package edu.xust.service;
import edu.xust.mapper.RoleMapper;
import edu.xust.pojo.RoleBean;
import edu.xust.utils.RoleUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RoleService {
@Autowired//按类型注入属性
RoleMapper roleMapper;
public void addRole(RoleBean role) {
roleMapper.insertRole(role);
}
public RoleBean SelectRole(String username, String sex, String race, String occupation) {
//获取属性
Object[] property = RoleUtil.getProperty(occupation);
RoleBean role = new RoleBean();
role.setUsername(username);//名字
role.setSex(sex);//性别
role.setStrength((int)property[0]);//力量
role.setAgility((int)property[1]);//敏捷
role.setPhysicial((int)property[2]);//体力
role.setIntelligence((int)property[3]);//智力
role.setIntellige((int)property[4]);//智慧
role.setMagic((int)property[5]);//魔法
role.setLife((int)property[6]);//生命值
role.setRace(race);//种族
role.setOccupation(occupation);//职业
role.setSkill(property[7].toString());//初始技能
return role;
}
}
6.controller控制层的实现
package edu.xust.controller;
import com.alibaba.fastjson.JSON;
import edu.xust.pojo.RoleBean;
import edu.xust.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class RoleController {
RoleBean roleBean;
@Autowired
private RoleService roleService;//按类型注入
@RequestMapping(value = "/create",produces = "application/json;charset=utf-8")
@ResponseBody
public String createRole(){
roleService.addRole(roleBean);//调用service层添加角色
return null;
}
@RequestMapping(value = "/get",produces = "application/json;charset=utf-8")
@ResponseBody
public String getRole(String username,String sex,String occupation,String race){
roleBean = roleService.SelectRole(username, sex, race, occupation);
String s = JSON.toJSONString(roleBean);//把对象转换为JSON字符串格式
return s;
}
}
7.页面的实现
数据传输格式为JSON,使用ajax实现异步请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>创建角色</title>
<style type="text/css">
#con {
background: url("image/background1.jpg") no-repeat;
background-size: cover;
position: absolute;
top: 0;
bottom: 0px;
right: 0px;
left: 0px;
}
#div{
width: 600px;
height: 600px;
margin-top: 200px;
margin-left: 600px;
}
</style>
</head>
<body>
<div id="con">
<div id="div">
<div>
<span>角色名</span>
<input type="text" id="username">
</div>
<br>
<div>
<span>性别</span>
<select id="sex">
<option >男</option>
<option >女</option>
</select>
</div>
<br>
<div>
<span>种族</span>
<select id="race">
</select>
<span>职业</span>
<select id="occupation">
</select>
</div>
<br>
<div>
<button id="ok" style="margin-left: 60px">确定</button>
<button id="cal" style="margin-left: 40px">取消</button>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="jquery-1.9.1.js"></script>
<script type="text/javascript">
var race = document.getElementById("race");
var occupation = document.getElementById("occupation");
var data=[];
data["人类"]=["狂战士","圣骑士","刺客","猎手","祭司","巫师"];
data["精灵"]=["刺客","猎手","祭司","巫师"];
data["兽人"]=["狂战士","猎手","祭司","巫师"];
data["矮人"]=["狂战士","圣骑士","祭司"];
data["元素"]=["祭司","巫师"];
//动态生成下拉框的选择项
for (key in data) {
var option = document.createElement("option");
option.appendChild(document.createTextNode(key));
option.setAttribute("value", key);
race.appendChild(option);
}
getdata();
//当下拉框数据改变就触发getdata()去更改联动框的数据
race.onchange = getdata;
function getdata() {
occupation.length = 0;
var ss = data[race.value];
for (index in ss) {
var option = document.createElement("option");
option.appendChild(document.createTextNode(ss[index]));
occupation.appendChild(option);
}
}
</script>
<script type="text/javascript">
$ok = $("#ok");
//添加时间
$ok.click(function () {
//获取数据
var username = $("#username").val();
var sex = $("#sex").val();
var race = $("#race").val();
var occupation = $("#occupation").val();
//ajax异步请求
$.ajax({
"url": "/get.action",
"type": "get",
"data": {"username":username,"sex":sex,"race":race,"occupation":occupation},
"success": function (data, msg, xhr) {
if( confirm("用户名: "+data.username+"\n"+
"性别: "+data.sex+"\n"+
"种族: "+data.race+"\n"+
"职业: "+data.occupation+"\n"+
"力量: "+data.strength+"\n"+
"体力: "+data.physicial+"\n"+
"智慧: "+data.intellige+"\n"+
"敏捷: "+data.agility+"\n"+
"智力: "+data.intelligence+"\n"+
"生命值: "+data.life+"\n"+
"魔法: "+data.magic+"\n"+
"初始技能: "+data.skill+"\n")==true){
f1();//点击确定以后正式添加角色
}
},
"error": function () {
console.log("失败...");
}
});
})
</script>
<script type="text/javascript">
function f1() {
$.ajax({
"url": "/create.action",
"type": "get",
"success": function (data, msg, xhr) {
alert("创建成功")
},
"error": function () {
console.log("失败...");
}
});
}
</script>
</html>
结果