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

Class c2;

try {

String temp = br.readLine();

String[] str = temp.split(",");

if (str.length != 2) {

throw new Exception("输入格式有误,按默认PK");

}

c1 = (Class) Class.forName("com.lxi."

+ str[0].toUpperCase());

c2 = (Class) Class.forName("com.lxi."

+ str[1].toUpperCase());

} catch (Exception e) {

// TODO Auto-generated catch block

c1 = (Class) Class.forName("com.lxi.BM");

c2 = (Class) 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实现模拟RPG格斗相关推荐

  1. java web atm机_java笔记——模拟ATM机例子

    模拟ATM机,实现用户登录.查询.取款.存款和退出. 假定一个银行卡账户,程序执行的时候提示用户输入账号,然后输入密码,如果输入内容不符合规范,则程序会给出相应提示,连续3次输入有误,则退出系统.登录 ...

  2. java制作电子钢琴_java 设计 模拟钢琴 完整源码

    //Piano.java import java.applet.*; import java.awt.*; import java.awt.event.*; public Piano extends ...

  3. java调用公安接口_Java程序模拟公安局人员管理系统-----来自狼腾测试员

    Java 编程题:公安人员的管理系统 1) 学生类: a) 属性: i. 身份号-默认没有,需要手动进行输入 ii. 姓名 iii. 性别 iv. 年龄 v. 密码 vi. 居住地址 vii. 注册日 ...

  4. java调用 restapi 乱码_Java HttpURLConnection模拟请求Rest接口解决中文乱码问题

    public staticString PostRequest(String URL,String obj) { String jsonString="";try{//创建连接 U ...

  5. java基础多线程抢红包_java多线程模拟抢红包功能

    今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性. /** * Created by zhanglinqiang on ...

  6. c++rpg黑框游戏_c++实现简单RPG对战游戏的代码.doc

    c实现简单RPG对战游戏的代码 c++实现简单RPG对战游戏的代码 #include#include#includeenum propte {sw,ar,mg};class container//人物 ...

  7. 【经典】C++RPG对战游戏

    博文背景: 还记大二上学期的时候看的这个C++&RPG游戏(博主大一下学期自学的php,涵盖oop内容),一个外校的同学他们大一学的C++,大二初期C++实训要求做一个程序填空,就是这个 RP ...

  8. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  9. 赠书:Java面试一战到底!

    点击上方蓝色"程序猿DD",关注我 每周福利送不停! 作者:Java面试一战到底(基础卷) ISBN:9787302564362 Java面试一战到底助你收货大厂offer 子曰: ...

  10. java程序设计试题_《Java语言程序设计》期末考试模拟试题——填空题和编程题...

    一.根据题意,填写出空格中的内容 Java平台包括三个技术方向,其中J2ME代表____________.J2SE代表___________.J2EE代表____________.2.面向对象的四大概 ...

最新文章

  1. 算法----------同构字符串(Java版本)
  2. [CODEVS 1087] 麦森数
  3. sharepoint2010 SP1 chrome 时常无滚动条
  4. python开发Day05(计算器代码)
  5. 自定义镜像-镜像结构
  6. 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
  7. ubuntu16.04下面安装mongodb
  8. ContentProvider与ContentResolver使用
  9. 【操作系统】哲学家就餐问题
  10. 可变参数模板(参考《C++ Templates 英文版第二版》)
  11. 正则表达式符号解释1
  12. Python基础__函数
  13. Python-split()函数的使用
  14. 机器学习实战 | 综合项目-电商销量预估
  15. 板材品牌之生态板吊顶好还是桑拿板好
  16. 计算机重装后不能启动怎么办,重装系统后无法进入系统怎么办 修复进不去系统方法教程...
  17. ConcurrentHashMap的put方法
  18. VMware安装win10 win2012(最详细最全操作)
  19. Python中的数学函数
  20. react二级路由配置正确不显示页面的问题解决

热门文章

  1. Pytorch中view, transpose, permute等方法的区别
  2. LapStyle - 基于拉普拉斯金字塔的高质量风格化方法 | CVPR2021
  3. 阿里云 DTS 实践
  4. Oracle DBHelper 第二版
  5. JQuery插件iScroll实现下拉刷新,滚动翻页特效
  6. K-th largest element in an array
  7. Maven学习(四)Maven 命令行选项
  8. 第四十讲 ASP.NET消息处理(一)
  9. 适配器模式C++实现
  10. 图像处理中的空间域处理方法