RPG游戏
1.问题描述
编写一个简化的创建游戏角色的程序,有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。种族包括人类、精灵、兽人、矮人、元素,职业包括狂战士、圣骑士、刺客、猎手、祭司、巫师。用户输入角色姓名后选择性别,然后种族职业,自动分配力量等其他属性的值。
2.解题思路
游戏首先根据系统提示用户自行选择姓名,性别,种族和职业。每个种族对应的职业不同,可通过方法的调用参数使用和选择语句对应上所选种族可以选择的职业。同理,根据职业分类力量等属性的值。这个可以继续使用方法调用来确定每个职业的力量等值为多少。具体的属性值大小与其职业有关,且要求是随机产生。使用Random函数,注意接收数字时(以力量举例)strength=r.nextInt(42-38+1)+38;以该形式表示,即可让不同属性随机产生的值在规定范围内。最后是保存函数的实现,将角色的所有属性存入文件中。Main函数中调用save即可。
3.算法构造
4.调试
num2为2,即选择种族为兽人时
执行141行代码,选择兽人对应的角色职业
输入num3,num3=3,即职业为猎手时
执行otherChoose函数,对应职业随机产生的属性值
执行save函数,将角色属性值全部存入文件中
5.测试及结果
用户输入角色信息并对角色创建满意的界面显示
角色信息保存到2.txt文件
6.代码实现
package game;
import java.util.Scanner;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Random;
public class game {
public static void main(String[] args) throws IOException{
rolePlay r=new rolePlay();
System.out.println("=====================================");
System.out.println(" "+rolePlay.name+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.sex+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.racial+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.job+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.strength+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.minjie+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.tili+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.IQ+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.intelligence+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.life+" ");
System.out.println("=====================================");
System.out.println(" "+rolePlay.magic+" ");
System.out.println("=====================================");
System.out.print("请问您对自己的角色信息是否满意?(0满意 1不满意): ");
@SuppressWarnings("resource")
Scanner input=new Scanner(System.in);
int answer=input.nextInt();
if(0==answer) {
rolePlay.save();
System.out.println("创建角色成功,信息已保存到文件!");
}else if(1==answer) {
System.out.println("重新创建角色,请您再次输入角色信息!");
rolePlay r1=new rolePlay();
}
}
}
//创建角色信息
class rolePlay{
static String sex;
static String racial;
static int strength;
static int minjie;
static int tili;
static int IQ;
static int intelligence;
static int life;
static int magic;
static Scanner scanner=new Scanner(System.in);
//输入角色姓名
static String name=scanner.next();
//输入角色性别
int num1=scanner.nextInt();{
if(num1==0){
System.out.print("男\n");
sex="男";
}else{
System.out.print("女\n");
sex="女";
}
//输入角色种族
System.out.print("请输入角色种族(0人类,1精灵,2兽人,3矮人,4元素): "); //此处print后不加ln可以让输入的数字不换行
int num2=scanner.nextInt();
if(num2==0){
racial="人类";
jobChoose(0);
}else if(num2==1){
racial="精灵";
jobChoose(1);
}else if(num2==2){
racial="兽人";
jobChoose(2);
}else if(num2==3){
racial="矮人";
jobChoose(3);
}else{
racial="元素";
jobChoose(4);
}
}
//职业选择函数
public void jobChoose(int num2){
if(0==num2){
System.out.print("请输入角色职业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师): ");
int num3=scanner.nextInt();
if(num3==0){
job="狂战士";
otherChoose(0);
}else if(num3==1){
job="圣骑士";
otherChoose(1);
}else if(num3==2){
job="刺客";
otherChoose(2);
}else if(num3==3){
job="猎手";
otherChoose(3);
}else if(num3==4){
job="祭司";
otherChoose(4);
}else{
job="巫师";
otherChoose(5);
}
}else if(1==num2){
System.out.print("请输入角色职业(2刺客,3猎手,4祭司,5巫师):");
int num3=scanner.nextInt();
if(num3==2){
job="刺客";
otherChoose(2);
}else if(num3==3){
job="猎手";
otherChoose(3);
}else if(num3==4){
job="祭司";
otherChoose(4);
}else if(num3==5){
job="巫师";
otherChoose(5);
}else {
System.out.println("该种族不能选择该职业!请重新选择");
}
}else if(2==num2){
System.out.print("请输入角色职业(0狂战士,3猎手,4祭司):");
int num3=scanner.nextInt();
if(num3==0){
job="狂战士";
otherChoose(0);
}else if(num3==3){
job="猎手";
otherChoose(3);
}else if(num3==4){
job="祭司";
otherChoose(4);
}else {
System.out.println("该种族不能选择该职业!请重新选择");
}
}else if(3==num2){
System.out.print("请输入角色职业(0狂战士,1圣骑士,4祭司):");
int num3=scanner.nextInt();
if(num3==0){
job="狂战士";
otherChoose(0);
}else if(num3==1){
job="圣骑士";
otherChoose(1);
}else if(num3==4){
job="祭司";
otherChoose(4);
}else {
System.out.println("该种族不能选择该职业!请重新选择");
}
}else if(4==num2){
System.out.print("请输入角色职业(4祭司,5巫师):");
int num3=scanner.nextInt();
if(num3==4){
job="祭司";
otherChoose(4);
}else if(num3==5){
job="巫师";
otherChoose(5);
}else {
System.out.println("该种族不能选择该职业!请重新选择");
}
}
}
//力量敏捷体力智力智慧生命值魔法值的选择函数
public void otherChoose(int num3) {
int[]num1=new int[4];
Random r=new Random();
if(0==num3) {
strength = r.nextInt (42 - 38 + 1) + 38;// 38-42
tili = r.nextInt (22 - 18 + 1) + 18;// 18-22
minjie = r.nextInt (32 - 28 + 1) + 28;// 28-32
IQ = r.nextInt (7 - 3 + 1) + 3;// 3-7
intelligence = 100 - strength - tili - minjie - IQ;
life = minjie * 20;
magic = (intelligence + intelligence) * 10;
System.out.println("力量:"+strength );
System.out.println("体力:"+tili );
System.out.println("敏捷:"+minjie );
System.out.println("智力:"+IQ );
System.out.println("智慧:"+intelligence);
int q=tili*20;
System.out.println("生命值:"+q);
int w=(tili+intelligence)*10;
System.out.println("魔法值:"+w);
}else if(1==num3) {
strength = r.nextInt(27 - 23 + 1) + 23;// 23-27
tili = r.nextInt(17 - 13 + 1) + 13;// 13-17
minjie = r.nextInt(32 - 28 + 1) + 28;// 28-32
IQ = r.nextInt(22 - 18 + 1) + 18; //18-22
intelligence = 100 - strength - tili - minjie - IQ;
life = minjie * 20;
magic = (intelligence + intelligence) * 10;
System.out.println("力量:"+strength );
System.out.println("体力:"+tili );
System.out.println("敏捷:"+minjie );
System.out.println("智力:"+IQ );
System.out.println("智慧:"+intelligence);
int q=tili*20;
System.out.println("生命值:"+q);
int w=(tili+intelligence)*10;
System.out.println("魔法值"+w);
}else if(2==num3) {
strength = r.nextInt(22 - 18 + 1) + 18;// 18-22
tili = r.nextInt(37 - 33 + 1) + 33;// 33-37
minjie = r.nextInt (22 - 18 + 1) + 18;// 18-22
IQ = r.nextInt(17 - 13 + 1) + 13; //13-17
intelligence = 100 - strength - tili - minjie - IQ;
life = minjie * 20;
magic = (intelligence + intelligence) * 10;
System.out.println("力量:"+strength );
System.out.println("体力:"+tili );
System.out.println("敏捷:"+minjie );
System.out.println("智力:"+IQ );
System.out.println("智慧:"+intelligence);
int q=tili*20;
System.out.println("生命值:"+q);
int w=(tili+intelligence)*10;
System.out.println("魔法值:"+w);
}else if(3==num3) {
strength = r.nextInt (17 - 13 + 1) + 13;// 13-17
tili = r.nextInt (42 - 38 + 1) + 38;// 38-42
minjie = r.nextInt (17 - 13 + 1) + 13;// 13-17
IQ = r.nextInt (12 - 8 + 1) + 8; //8-12
intelligence = 100 - strength - tili - minjie - IQ;
life = minjie * 20;
magic = (intelligence + intelligence) * 10;
System.out.println("力量:"+strength );
System.out.println("体力:"+tili );
System.out.println("敏捷:"+minjie );
System.out.println("智力:"+IQ );
System.out.println("智慧:"+intelligence);
int q=tili*20;
System.out.println("生命值:"+q);
int w=(tili+intelligence)*10;
System.out.println("魔法值:"+w);
}else if(4==num3) {
strength = r.nextInt(17 - 13 + 1) + 13;// 13-17
tili = r.nextInt(22 - 18 + 1) + 18;// 18-22
minjie = r.nextInt(17 - 13 + 1) + 13;// 13-17
IQ = r.nextInt(37 - 33 + 1) + 33; //33-37
intelligence = 100 - strength - tili - minjie - IQ;
life = minjie * 20;
magic = (intelligence + intelligence) * 10;
System.out.println("力量:"+strength );
System.out.println("体力:"+tili );
System.out.println("敏捷:"+minjie );
System.out.println("智力:"+IQ );
System.out.println("智慧:"+intelligence);
int q=tili*20;
System.out.println("生命值:"+q);
int w=(tili+intelligence)*10;
System.out.println("魔法值:"+w);
}else {
strength = r.nextInt(12 - 8 + 1) + 8;// 8-12
tili = r.nextInt(22 - 18 + 1) + 18;// 18-22
minjie = r.nextInt(12 - 8 + 1) + 8;// 8-12
IQ = r.nextInt(22 - 18 + 1) + 18;// 18-22
intelligence = 100 - strength - tili - minjie - IQ;
life = minjie * 20;
magic = (intelligence + intelligence) * 10;
System.out.println("力量:"+strength );
System.out.println("体力:"+tili );
System.out.println("敏捷:"+minjie );
System.out.println("智力:"+IQ );
System.out.println("智慧:"+intelligence);
int q=tili*20;
System.out.println("生命值:"+q);
int w=(tili+intelligence)*10;
System.out.println("魔法值:"+w);
}
}
//存储角色信息到文件
public static void save() throws IOException {
File file=new File("G:\\程序设计上机练习\\RPG游戏\\2.txt");
Writer out=new FileWriter(file);
String name=rolePlay.name;
out.write("姓名:"+name);
out.write("\r\n"); //换行
String sex=rolePlay.sex;
out.write("性别:"+sex);
out.write("\r\n");
String racial=rolePlay.racial;
out.write("种族:"+racial );
out.write("\r\n");
String job=rolePlay.job;
out.write("工作:"+job);
out.write("\r\n");
int strength=rolePlay.strength;
out.write("力量:"+strength);
out.write("\r\n");
int minjie=rolePlay.minjie;
out.write("敏捷:"+minjie);
out.write("\r\n");
int tili=rolePlay.tili;
out.write("体力:"+tili);
out.write("\r\n");
int IQ=rolePlay.IQ;
out.write("智力:"+IQ);
out.write("\r\n");
int life=rolePlay.life;
out.write("生命值:"+life);
out.write("\r\n");
int magic=rolePlay.magic;
out.write("魔法值"+magic);
out.close();
}
}
7.经验归纳
创建游戏角色程序起初看着感觉不是太难,但编写时还是有很多处出现问题。
1.种族的5种选择用if语句选择实现本身没有问题,但每个种族对应的工作受到限制,并非6个工作都可以完成。因此,想到了通过函数调用语句,以传参的形式来执行使得每个种族调用对应函数。
2.最大的问题应该是在力量体力敏捷智慧智力这几个属性值的确定。不同职业这几个属性值所占比例不同,加在一起是100。也就是说确定4个值就好。开始想的方法是先随机生成4个数,因为作业要求中的表格给出了每个工作的几个属性的大小,所以将4个数从大到小排序后放入数组,属性值最大的属性对应最大的数,依次后推。这样的问题在于,随机生成的4个数固定了范围但4个数范围一致,加起来就可能超过100,产生负数,不合题意。 经改善,不用上述方法,用Random函数接收数时每个属性值时都设定表中给出的范围,这样可以简单迅速得到范围内的数据。以体力属性为例:tili = r.nextInt (22 - 18 + 1) + 18;这个表达式就规定了体力随机产生的值在18到22范围内。
3.最后就是保存功能,保存功能代码的实现过程花费了我很长时间。以写入名字属性为例,给出txt文件的存储路径,写入所有属性后将文件关闭。
File file=new File("G:\\程序设计上机练习\\RPG游戏\\2.txt");
Writer out=new FileWriter(file);
String name=rolePlay.name;
out.write("姓名:"+name);
out.close();
以下代码是从CSDN中“一朵风中摇曳的水仙花”的博主所发的名为“java将数据写入文件中”博客得来。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test2 {
public static void main(String[] args) throws IOException {
File file =new File("D:\\2.txt");
Writer out =new FileWriter(file);
String data="888";
out.write(data);
out.close();
}
}
借助这个微博的内容,我将本次程序的属性保存到了文件中。