任务要求:
- 定义一个描述战斗单位的类,此类必须包含以下成员变量:名称,生命值,攻击力,防御力,命中率。此类还必须包含以下成员方法:遭到攻击时的处理函数,阵亡时的处理函数。请自行设计生命值,攻击力,防御力,命中率之间的关系。请自行设计各处理函数被执行时的提示信息。
- 此游戏中存在多种战斗角色,每种角色都是由要求1所定义的类派生出来的子类。每种角色类除了继承自父类的成员变量和函数之外,可以增加一些成员变量和成员函数,例如增加防御这一动作的处理函数。
战斗角色例:战士,生命高,普通攻击敌人,攻击力中,防御力高
骑兵,生命中,普通攻击敌人,攻击力高,防御力高
法师,生命极低,法术攻击敌人,攻击力极高,防御力低 - 此游戏采用回合制,人对人或人对电脑。每个角色对象依次顺序被使用,游戏操作者通过选菜单的方式操作角色对象的攻击、攻击谁、防御等等动作。游戏以某方全体阵亡而结束。
- 游戏必须具有完备的提示信息,例如每个回合都要提示轮到那方的那名角色对象行动,每个回合菜单之前都必须显示敌我双方每一个角色对象的各种参数值,并且每个回合必须重新刷新显示屏幕上的提示内容等。
任务的理解:
难点主要在于如何实现回合制以及当玩家选择角色时如何创建对象,起初我的思想是通过if判断语句来判断玩家的输入然后根据输入的信息进行创建对象,但是我发现在if语句中创建的对象不能在if语句之外进行调用,所以只好采用笨的办法,采用switch语句来判断输入的信息然后再进行创建对象,就是说3个角色在在代码中需要创建18个对象,通过重复的语句实现功能。回合制的实现是通过在for语句中嵌套一个if语句判断for循环中的变量i是奇数还是偶数,奇数则玩家1操作,偶数则玩家2操作,以此来实现回合制的功能。
代码部分:
import java.io.IOException; //导入异常处理类
import java.util.Scanner; //导入扫描类
import java.util.Random; //导入随机类
public class task1_2challenge{
//创建主类
String name; //定义成员变量名字
int healthValue; //定义成员变量生命值
int aggressivity; //定义成员变量攻击力
int defense; //定义成员变量防御力
//double hitRate;
//hitRate=0.8;
public static int beAttacked(int healthValue,int aggressivity,int defense){
//定义一个攻击时造成伤害的函数
double damageValue; //定义变量伤害值
Random d=new Random(); //创建一个随机数的对象
int e=d.nextInt(5); //生成一个0-5之间的随机数并赋值给e
double jianmian; //定义一个变量存放减免伤害的百分数
double defenses=(double)defense;//把防御力转化为小数型的变量
double aggressivitys=(double)aggressivity;//把攻击力转化为小数型的变量
jianmian=(defenses/(defenses+100)); //计算减免伤害的百分比
damageValue=aggressivitys*(1-jianmian)+e;//造成伤害的计算公式
int damageValues=(int)damageValue;//将伤害值强制转为整数
System.out.println("漂亮的一击,造成了"+damageValues+"点伤害");//输出一段文字描述造成的伤害
return damageValues; //返回伤害值
}
public static int hitRatio(){
//定义一个命中率的方法
Random r=new Random(); //实例化一个随机数对象
int a=r.nextInt(100); //生成一个0-100之间的随机数并赋值给a
int b; //定义一个整数b作为方法的返回值
if(a<=80){
//判断随机数a的大小
b=1; //小于等于80时b=1
}else{
//
b=0; //大于80时b=0
}
return b; //返回b的值
}
public static boolean fallInBattle(int healthValue){
//定义阵亡的处理函数
if(healthValue<=0){
//如果生命值低于0
System.out.println("You are die,game is over!");//则输出一段文字
return false; //并返回false
}else{
return true; //否则返回true
}
}
public task1_2challenge(){
//构造函数
}
public static void main(String[] args)throws IOException, InterruptedException {
//main主函数
System.out.println("请玩家选择角色\n1:战士 2:射手 3:法师"); //输出一段信息
Scanner s1=new Scanner(System.in); //创建一个扫描器对象s1
String a; //定义字符串a
a=s1.nextLine(); //将键盘获取的值赋予a
Scanner s2=new Scanner(System.in); //创建一个扫描器s2
String b; //定义字符串b
b=s2.nextLine(); //将扫面值赋予b
String c=a+b; //定义c=a+b
switch(c){
//switch语句
case "11": //都选择战士时的处理语句
System.out.println("战士VS战士"); //输出文字
Combatant combatant1=new Combatant(); //创建一个子类Combatant的对象
Combatant combatant2=new Combatant(); //再创建一个子类Combatant的对象
for(int i=1;i<=50;i++){
//for循环语句对回合制进行循环操作
int d=hitRatio(); //将命中率函数的返回值赋给d
Thread.currentThread().sleep(1000 * 2); //调用线程,休眠2000毫秒
cls(); //调用清屏方法
//输出人物的信息
System.out.println("第"+(i+1)/2+"回合:\n玩家1的生命值为:"+combatant1.healthValue+" 攻击力为:"+combatant1.aggressivity+" 防御力为:"+combatant1.defense+"\n玩家2的生命值为:"+combatant2.healthValue+" 攻击力为:"+combatant2.aggressivity+" 防御力为:"+combatant2.defense);
boolean p1=fallInBattle(combatant1.healthValue);//调用死亡处理函数判断玩家1的情况
boolean p2=fallInBattle(combatant2.healthValue);//玩家2
if((i%2)==0){
//判断回合数
if(p1&&p2){
//玩家1和玩家2都没死的情况下
System.out.println("请玩家2选择:a、普通攻击 b、释放技能 c、跳过本回合");//输出文字
Scanner k1=new Scanner(System.in);//创建扫描器
String k11=k1.nextLine(); //把输入的值赋给k11
switch(k11){
case "a": // 如果是a,调用这个方法
if(d==1){
int damageValues= beAttacked(combatant1.healthValue,combatant2.aggressivity,combatant1.defense);//确定伤害
combatant1.healthValue=combatant1.healthValue - damageValues;//计算生命值
}else{
System.out.println("未命中目标");
}
break;
case "b":
combatant2.defense=Combatant.shield(combatant2.defense);//技能方法,赋值
System.out.println("防御力增加");
break;
case "c":
break;
}
}else{
if(p1){
System.out.println("玩家2阵亡");//对象死亡,结束循环
break;
}else{
System.out.println("玩家1阵亡");
break;
}
}
}else{
if(p1&&p2){
System.out.println("请玩家1选择:a、普通攻击 b、释放技能 c、跳过本回合");
Scanner k1=new Scanner(System.in);
String k11=k1.nextLine();
switch(k11){
case "a":
if(d==1){
int damageValues= beAttacked(combatant2.healthValue,combatant1.aggressivity,combatant2.defense);
combatant2.healthValue=combatant2.healthValue - damageValues;
}else{
System.out.println("未命中目标");
}
break;
case "b":
combatant1.defense=Combatant.shield(combatant1.defense);
System.out.println("防御力增加");
break;
case "c":
break;
}
}else{
if(p1){
System.out.println("玩家2阵亡");
break;
}else{
System.out.println("玩家1阵亡");
break;
}
}
}
}
break;
case "12":
System.out.println("战士VS射手");
Combatant combatant3=new Combatant();
Shooter shooter1=new Shooter();
for(int i=1;i<=50;i++){
int d=hitRatio();
Thread.currentThread().sleep(1000 * 2);
cls();
System.out.println("第"+(i+1)/2+"回合:\n玩家1的生命值为:"+combatant3.healthValue+" 攻击力为:"