java实现模拟RPG格斗

三个英雄角色参与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();
    }
  }
}

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

(0)

相关推荐

  • 微信游戏打飞机游戏制作(java模拟微信打飞机游戏)

    复制代码 代码如下: package com.beancore.ui; import java.awt.BorderLayout;import java.awt.Container;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.IOException;import java

  • Java基于Swing实现的打猎射击游戏代码

    本文实例讲述了Java基于Swing实现的打猎射击游戏代码.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: package Game; import java.awt.Graphics; import java.awt.Image; import javax.swing.JPanel; public class BackgroundPanel extends JPanel {         private static final long serialVersionUID

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • 跟我学Java Swing之游戏设计(2)

    文章来源:电脑爱好者 作者:张剑 还记得<偷天换日>中精灵般穿梭在好莱坞车流中的Minicooper吗?马克·沃尔伯格和莎莉·赛隆就是驾驶着它在仇人的鼻子底下运走了价值千万的黄金.可是,如果现在将一辆无法奔驰的Minicooper躯壳放在你的面前,你会如何看待它?它还是那个游走自如的精灵吗?今天,就让我们一点一点地为这辆Minicooper组装上零件,让它跑起来. 前言 从本期开始,我们为大家提供完整的游戏源代码(点击下载).Java咖啡馆倡导大家理论与实践并重,我们在连载中将给大家介绍关键技

  • 跟我学Java Swing之游戏设计(1)

    文章来源:电脑爱好者 作者:张剑 谁知道通天的巴比伦塔耗费了多少沙石?又有谁知道罗马的建成经历了多少个日夜?我们惟一知道的是,没有一块块砖石的垒砌,就没有蜿蜒万里的长城;没有巨石和黏土的堆集,就没有亘古不变的金字塔.由此可见,基础知识的准备对于我们学习任何事物都至关重要,那么,就让我们从认识Swing的一些基础功能开始,启动我们建造罗马的伟大工程吧! 前言 Java咖啡馆已经开张不少时日了,如果你已经喜欢上了Java这杯咖啡的味道,那么记得常来哦.这一次,我们为大家准备了一大杯香浓的咖啡--将以

  • Java基于swing实现的弹球游戏代码

    本文实例讲述了Java基于swing实现的弹球游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package Game; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Random;

  • java实现模拟RPG格斗

    三个英雄角色参与PK 每个英雄具有以下几个属性:生命值(为0时英雄倒下).攻击力(每次攻击时扣除对方的生命值点数).攻击间隔(每次攻击过后都要等待间隔时间才能进行下次攻击,首次攻击之前也要先等待间隔时间) 另外,每个英雄都拥有两个技能:攻击技能和防御技能,攻击技能在攻击对方时有一定概率发动,防御技能在被对方攻击时有一定概率发动,具体参数如下 BM: 生命650 攻击力40 攻击间隔1.5s 攻击技能(跳劈):每次攻击时有30%几率造成双倍伤害 防御技能(反弹):每次被攻击时有30%几率把我方受到

  • java通过模拟post方式提交表单实现图片上传功能实例

    本文实例讲述了java通过模拟post方式提交表单实现图片上传功能.分享给大家供大家参考,具体如下: 模拟表单html如下: <form action="up_result.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1"> <label> <input type="tex

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

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

  • java 中模拟UDP传输的发送端和接收端实例详解

    java 中模拟UDP传输的发送端和接收端实例详解 一.创建UDP传输的发送端 1.建立UDP的Socket服务: 2.将要发送的数据封装到数据包中: 3.通过UDP的Socket服务将数据包发送出去: 4.关闭Socket服务. import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class

  • 使用Java程序模拟实现新冠病毒传染效果

    简单介绍 2020年注定是不平凡的一年,新冠肺炎肆虐全球,传染性特别强,目前全球感人人数还在逐渐攀升,作为中华儿女特别感谢政府作出的努力,非常感谢并致敬医护人员,是他们的努力为我们创造安全的环境,向你们致敬! 模拟方案 以下是程序粗略的模拟病毒传染过程,具体方案如下: 首先需要构造一个200 * 200的格子界面有四种不同的颜色状态标记着程序执行的过程程序执行10次,初始化格子也就是0的时候,需要在整个格子最中心的100个格子标记为红色,剩余数据随机抽取四千(且不能重复)标记为黑色,其余没有标记

  • Java 实现模拟用户登录的示例代码

    创建一个用户类类型的集合,手动输入用户库 主要是判定输入的用户名和密码是否与库中的匹配 做好区别是用户名输入错误还是密码输入错误的提示. 定义用户类 public class User{ String username; String keyword; public User(String username, String keyword) { this.username = username; this.keyword = keyword; } } 主程序 import java.util.A

  • java爬虫模拟登陆的实例详解

    使用jsoup工具可以解析某个URL地址.HTML文本内容,是java爬虫很好的优势,也是我们在网络爬虫不可缺少的工具.本文小编带领大家使用jsoup 实现java爬虫模拟登陆,通过省力的API,很好的实现java爬虫模拟登陆. 一.使用工具:Jsoup jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. 二.实现java爬虫模拟登陆 1.确定想要爬取的ur

  • Java Socket模拟实现聊天室

    使用Java Socket模拟实现了一个聊天室,实现了基本的私聊以及群聊.分为服务器端和客户端,下面我来介绍一下实现的步骤. 服务器端 服务器端是聊天室的核心所在,主要用来处理客户端的请求,先来看一下服务器端的主方法: public static void main(String[] args) { try { ExecutorService executorService = Executors.newFixedThreadPool(100);//最多容纳100个客户端聊天 ServerSoc

  • java多线程模拟交通灯管理系统

    本文实例为大家分享了java多线程模拟交通灯管理系统的具体代码,供大家参考,具体内容如下 一.项目业务逻辑分析 项目需求:模拟实现十字路口的交通灯管理系统逻辑,要求如下: 异步随机生成按照各个路线行驶的车辆,例如由北向南行驶的车辆.由东向南行驶的车辆. 信号灯忽略黄灯,只考虑红灯和绿灯的情况. 左转受信号灯控制,右转车辆不受信号灯控制,其他情况与现实生活的逻辑相同. 注:南北向车辆和东西向方向车辆交替放行,同方向等待车辆应先放行直行车辆,而后再放行左转车辆. 每辆车通过路口所需时间为1秒(提示:

  • Java 动态模拟操作系统进程调度算法

    目录 实验目的 设备与环境 实验内容 实验结果及分析 部分代码展示  实验目的 通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程.调度算法的理解. 设备与环境 硬件设备:PC机一台 软件环境:安装Windows操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境. 实验内容 实验采用了java语言编程模拟N个进程采用动态高优先权优先进程调度算法.该算法就是按照优先权的大小运行进程,如果一个时间片内未运行完,则将优先权数减3后再插入到链表

随机推荐