java实现模拟RPG格斗_java

三个英雄角色参与PK

每个英雄具有以下几个属性:生命值(为0时英雄倒下)、攻击力(每次攻击时扣除对方的生命值点数)、攻击间隔(每次攻击过后都要等待间隔时间才能进行下次攻击,首次攻击之前也要先等待间隔时间)

另外,每个英雄都拥有两个技能:攻击技能和防御技能,攻击技能在攻击对方时有一定概率发动,防御技能在被对方攻击时有一定概率发动,具体参数如下

BM:
生命650 攻击力40 攻击间隔1.5s
攻击技能(跳劈):每次攻击时有30%几率造成双倍伤害
防御技能(反弹):每次被攻击时有30%几率把我方受到的伤害反弹给对方,例如我方被攻击,对方攻击力30,扣除我方30点生命值,如果技能发动,则对方也要扣除30点生命值,伤害只能反弹一次(两个BM相互PK的时候不出现连续反弹)

DH:生命600 攻击力30 攻击间隔1s
攻击技能(吸血):每次攻击时有30%几率把造成的伤害转变为自己的生命值(对被攻击者造成伤害,并且将攻击伤害转变成自己的生命值),但不能超过上限,例如我方攻击,扣除对方30的生命值,同时给自己增加30点生命值
防御技能(闪避):每次被攻击时有30%几率闪避不受伤害

MK:
生命700 攻击力50 攻击间隔2.5s
攻击技能(重击):每次攻击时有30%几率造成对方眩晕3s的效果(对方受到伤害后附加眩晕),对方英雄眩晕期间不能发起攻击,只能挨打,被攻击时也不能发起防御技能,且眩晕结束后对方英雄要重新等待攻击间隔,眩晕时间不能叠加,如果对方已经处于眩晕,我方又发动攻击技能,那么对方眩晕时间重新开始计算
防御技能(天神):每次被攻击时有60%的几率防御一半伤害,例如我方被攻击,对方攻击力为40,如果技能发动,则只扣除我方20点生命值

1.程序启动后,监听控制台输入
2.输入任意两个英雄名称(逗号分隔)发起PK,格式:BM,DH
3.系统输出PK详细过程,直到有一方胜出,格式如下:
BM攻击DH,BM发动攻击技能,DH未发动防御技能,BM:350->350,DH:280->200
....
BM胜出

package com.lxi;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;

//三个人物的基类
abstract class Person {
  int val;       //生命值
  double coldTime;   //冷却时间
  int waitTime;    //晕眩时间
  int fight;     //攻击力
  int chanceHit;   //发起主动技能的概率
  int chanceDefense; //发起防御技能的概率

  abstract void hit(Person p);  //攻击技能

  abstract int defense(Person p); //防御技能,返回被伤害点数
}

class DH extends Person {
  public DH() {
    val = 600;
    coldTime = 1.0;
    fight = 30;
    chanceHit = 3;   //表示30%的概率
    chanceDefense = 3;
    waitTime = 0;
  }

  Random rand = new Random();
  boolean hitFlag = false;   //主动技能发动的标识
  boolean defenseFlag = false; //防御技能发动的标识

  public void hit(Person p) {
    if (rand.nextInt(10) < chanceHit) { //发动主动技能
      int hurt = p.defense(this);
      p.val = p.val - hurt;
      if (p.val <= 0) {
        System.out.println(this.getClass().getSimpleName() + "胜出!");
        System.exit(0);
      }
      val = val + hurt;
      if (val > 600)
        val = 600;
      hitFlag = true;   //标记主动技能已经发动
    } else { //进行普通攻击
      int hurt = p.defense(this);
      p.val = p.val - hurt;
      if (p.val <= 0) {
        System.out.println(this.getClass().getSimpleName() + "胜出!");
        System.exit(0);
      }
    }
    System.out.println(this.getClass().getSimpleName() + "攻击"
        + p.getClass().getSimpleName() + ","
        + this.getClass().getSimpleName()
        + (this.hitFlag ? "发动攻击技能  " : "未发动攻击技能  ")
        + p.getClass().getSimpleName()
        + (this.defenseFlag ? "发动防御技能  " : "未发动防御技能  ")
        + this.getClass().getSimpleName() + ":" + this.val + ","
        + p.getClass().getSimpleName() + ":" + p.val);
    hitFlag = false;   //
    defenseFlag = false; //重置标记,下次重用
  }

  public int defense(Person p) {
    if (rand.nextInt(10) < chanceDefense) {
      defenseFlag = true;  //标记防御技能已经发动
      return 0;
    } else {
      return p.fight;
    }
  }
}
class BM extends Person {
  public BM() {
    val = 650;
    coldTime = 1.5;
    fight = 40;
    chanceHit = 3;
    chanceDefense = 3;
    waitTime = 0;
  }

  int count = 0;  //防御技能发动的次数
  int temp = 40;  //攻击力,值同fight
  boolean hitFlag = false;
  boolean defenseFlag = false;
  Random rand = new Random();

  public void hit(Person p) {
    if (rand.nextInt(10) < chanceHit) {
      fight = fight * 2;  //发动双倍攻击
      hitFlag = true;
    }
    int hurt = p.defense(this);
    p.val = p.val - hurt;
    fight = temp;   //还原为单倍攻击
    if (p.val <= 0) {
      System.out.println(this.getClass().getSimpleName() + "胜出!");
      System.exit(0);
    }
    System.out.println(this.getClass().getSimpleName() + "攻击"
        + p.getClass().getSimpleName() + ","
        + this.getClass().getSimpleName()
        + (this.hitFlag ? "发动攻击技能  " : "未发动攻击技能  ")
        + p.getClass().getSimpleName()
        + (this.defenseFlag ? "发动防御技能  " : "未发动防御技能  ")
        + this.getClass().getSimpleName() + ":" + this.val + ","
        + p.getClass().getSimpleName() + ":" + p.val);
    hitFlag = false;
    defenseFlag = false;
  }

  public int defense(Person p) {
    if (rand.nextInt(10) < chanceDefense) {
      if (count != 0) {
        p.val = p.val - p.fight;
        count++;
        defenseFlag = true;
        if (p.val <= 0) {
          System.out.println(this.getClass().getSimpleName() + "胜出!");
          System.exit(0);
        }
      }
    }
    return p.fight;
  }
}

class MK extends Person {
  public MK() {
    val = 700;
    coldTime = 2.5;
    fight = 50;
    chanceDefense = 6;
    chanceHit = 3;
    waitTime = 0;
  }

  boolean hitFlag = false;
  boolean defenseFlag = false;
  Random rand = new Random();

  public void hit(Person p) {
    if (rand.nextInt(10) < chanceHit) {
      p.waitTime = 3;  //使对方晕眩3s
      hitFlag = true;
    }
    int hurt = p.defense(this);
    p.val = p.val - hurt;
    if (p.val <= 0) {
      System.out.println(this.getClass().getSimpleName() + "胜出!");
      System.exit(0);
    }
    System.out.println(this.getClass().getSimpleName() + "攻击"
        + p.getClass().getSimpleName() + ","
        + this.getClass().getSimpleName()
        + (this.hitFlag ? "发动攻击技能  " : "未发动攻击技能  ")
        + p.getClass().getSimpleName()
        + (this.defenseFlag ? "发动防御技能  " : "未发动防御技能  ")
        + this.getClass().getSimpleName() + ":" + this.val + ","
        + p.getClass().getSimpleName() + ":" + p.val);
    hitFlag = false;
    defenseFlag = false;
  }

  public int defense(Person p) {
    if (rand.nextInt(10) < chanceDefense) {
      defenseFlag = true;
      return p.fight / 2;  //防御技能发动,伤害减半
    }
    return p.fight;
  }
}
public class Rpg {
  @SuppressWarnings("unchecked")
  public static void main(String[] args) throws Exception {
    System.out.println("在这里输入两个人物进行PK,以英文逗号分隔: [BM,DH,MK]");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    Class<Person> c1;
    Class<Person> c2;
    try {
      String temp = br.readLine();
      String[] str = temp.split(",");
      if (str.length != 2) {
        throw new Exception("输入格式有误,按默认PK");
      }
      c1 = (Class<Person>) Class.forName("com.lxi."
          + str[0].toUpperCase());
      c2 = (Class<Person>) Class.forName("com.lxi."
          + str[1].toUpperCase());
    } catch (Exception e) {
      // TODO Auto-generated catch block
      c1 = (Class<Person>) Class.forName("com.lxi.BM");
      c2 = (Class<Person>) Class.forName("com.lxi.DH");
    }
    try {
      Person p1 = c1.newInstance();
      Person p2 = c2.newInstance();
      long time = System.currentTimeMillis();
      long nextTime1 = (long) (time + p1.coldTime*1000); //
      long nextTime2 = (long) (time + p2.coldTime*1000); //发动攻击的时间
      System.out.println("---游戏开始---");
      while (true) {
        long currenTime = System.currentTimeMillis();

        if (nextTime1 < currenTime) { //时间到则发动攻击
          p1.hit(p2);
          nextTime1 += p1.coldTime*1000 + p1.waitTime*1000; //下次攻击时间=冷却时间+被晕眩时间
          p1.waitTime = 0; //回合结束,重置被晕眩时间为0
        }
        if (nextTime2 < currenTime) {
          p2.hit(p1);
          nextTime2 += p2.coldTime*1000 + p2.waitTime*1000;
          p2.waitTime = 0;
        }
      }
    } catch (ClassCastException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (InstantiationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
RPG格斗
java文件系统模拟实现、java实现模拟登录、java实现模拟银行、java程序实现模拟登录、java实现模拟登陆,以便于您获取更多的相关知识。

时间: 2024-09-26 12:20:10

java实现模拟RPG格斗_java的相关文章

Java数组模拟优先级队列数据结构的实例_java

优先级队列如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权

有人做过java httpclient 模拟登陆outlook 获取邮件的吗

问题描述 有人做过java httpclient 模拟登陆outlook 获取邮件的吗 有人做过java httpclient 模拟登陆outlook 获取邮件的吗 解决方案 其实现在很多可以做模拟登录的httpClient,JSOUP,htmlUnit,我做过用Jsoup做模拟登录,要做两次模拟,第一次是获得Cookie,第二次带入cookie就行了,大致思想就是这样. 解决方案二: 这种程序没有意义,因为网页是不断变化的,你应该用mapi从本地outlook获取,或者用pop协议从邮箱服务器

java web模拟word考试系统如何解决对word操作的自动判断问题?

问题描述 java web模拟word考试系统如何解决对word操作的自动判断问题? 这个考试系统是关于计算机基础的,现在大学生考试都是上机考,会考查word.Excel的操作题,每道题会规定你做哪些操作,比如:word中,字体都用黑色?8号宋体,等等然后系统可以自动评阅.请问该如何去做? ? 解决方案 用poi库读取word文件解析http://haohaoxuexi.iteye.com/blog/2031335

解决方案-python或java httpclient模拟登录,cookie获取问题

问题描述 python或java httpclient模拟登录,cookie获取问题 目前准备用python或java httpclient做一个模拟登录的程序,可是无法获取cookie, 原因是,请求登录URL时,服务器反应是分两步来进行的.流程大概如下: 1. 首先,服务器会先发过来一个.JS文件,浏览器执行其中的函数,生成cookie,貌似存到document.cookie中. 2. 然后,需要带着生成的cookie才能去访问登录URL. 因为我的程序不能像浏览器一样执行.js文件,所以也

java后台模拟网银遇到控件怎么办

问题描述 java后台模拟网银遇到控件怎么办 java模拟网银后台登录时,遇到登录控件,该怎么解决啊,是绕过,还是破解.求大神指点 解决方案 http://blog.csdn.net/lxf9601/article/details/6967167

JAVA实现简单抢红包算法(模拟真实抢红包)_java

闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这个算法比较模拟现实抢红包规则.废话少说.先贴代码; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.ut

Java咖啡馆(1)——叹咖啡_Java编程

文章来源:电脑爱好者 作者:Gary Chan 有人说,咖啡馆是一个叫人学会放慢步伐.享受生活的地方.这句话不无道理.港人常把饮咖啡称为"叹咖啡",这个"叹"字就有欣赏.品味的含义,舒适的环境,自然是招徕顾客之道.香港虽然寸金尺土,但无论在闹市或是在风景区,都不难找到精巧雅致的咖啡馆,它们或具欧陆情怀,或富英式韵味,大都环境优美.摆设得体.席位舒适.气派不凡. 一.序言 许多人想学习编程,但不知道从哪里开始.在这个连载中,我将为你介绍Java编程技术,以及Java程

java nio基础使用示例_java

在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式.传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入.归纳为:1.java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了.2.在1的基础上改进为,开设线程,serversocker.accept()后让线程去等待,但是当并发量高的时候,相当耗费资源的.3.java nio为非阻塞,采用的是reactor反应堆模式,或者说observe

(新手帖)Java -&amp;amp;gt; RPG /???

问题描述 请问一下凭借J2SE技术可以完成编写一个以校园生活为背景的RPG游戏吗,类似与北大英雄,仙剑奇侠传风格的,还需要什么其他的技术吗?(麻烦各位前辈把需要的技术都列一下,万分感谢~!) 解决方案 解决方案二:理论上是可行的.....但是这方面的资料估计少的可怜解决方案三:1.多线程知识2.绘图知识3.少量的数学知识解决方案四:直接学Cocos2d-x引擎吧.这个资源及教程要丰富得多.J2SE实在是没什么这方面的资源,而且J2SE做开发也已经过时了.JAVA现在更多的是J2EE做WEB开发.