三个英雄角色参与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胜出
1. [代码][Java]代码     
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;
        }
    }
}
2. [代码]续

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;flash插件
        defenseFlag = false;
    }http://www.huiyi8.com/flashchajian/
 
    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;
    }
}
3. [代码]续2    
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();
        }
    }
}

模拟RPG格斗的更多相关文章

  1. 漫话Unity(二)

    三.Unity编辑器介绍 Unity是一个商业级的3d游戏引擎.一个引擎的专业程度事实上并非体如今它多么牛b 的次世代效果,说实话那些效果即便你会用也不敢用.由于没有哪个手机是次世代的. 游戏引擎的专 ...

  2. 关于RPG游戏结构撰写的相关探索下篇

    如今市面上已经有好几百种免费RPG系统,我们都能够按照自己的需求对此进行扩展与修改.通过选择现有的系统(特别是较有名的),你能够从一个稳定且经过测试的基础开始创 造. 但是之后你需要基于设置和规则对此 ...

  3. 新版蜀山剑侠传3D立体格斗全方位剖析

    国人终极格斗<蜀山剑侠传>,突破传统横版格斗"二次元"瓶颈,率先开辟3D立体横版格斗网游先河,实现"有纬度"的空间化立体式全景3D战斗体验!游戏大量 ...

  4. Beat &#39;Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源代码

    浓缩精华.专注战斗! 游戏的本质是什么?界面?养成?NoNo!    游戏来源于对实战和比赛的模拟,所以它的本源就是对抗.就是战斗! 是挥洒热血的一种方式! 一个游戏最复杂最难做的是什么?UI?商城? ...

  5. Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维

    题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...

  6. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  7. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  8. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  9. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

随机推荐

  1. 千万级的大表!MySQL这样优化更好

    对于一个千万级的大表,现在可能更多的是亿级数据量,很多人第一反应是各种切分,可结果总是事半功倍,或许正是我们优化顺序的不正确.下面我们来谈谈怎样的优化顺序可以让效果更好. MySQL数据库一般都是按照 ...

  2. CSRF--花式绕过Referer技巧

    CSRF遇到Referer绕过的情况,有条件限制,不一定所有的Refere验证就可以绕过 1.Refere为空条件下 解决方案: 利用ftp://,http://,https://,file://,j ...

  3. Google Code Jam 2014 资格赛:Problem B. Cookie Clicker Alpha

    Introduction Cookie Clicker is a Javascript game by Orteil, where players click on a picture of a gi ...

  4. MIC中offload语法总结

    MIC中offload的用法如下: #pragma offload specifier [,specifier...]specifier可以填入的选项为:target 例:taget(mic:0)if ...

  5. 录音整理文字工具otranscribe简介

    网址: http://otranscribe.com/ 首先载入音频文件,支持 mp3, ogg, webm, wav (HTML5 无需将文件上传至服务器,可保护隐私),然后就可以边听边整理了. 通 ...

  6. 使用3DES+Base64来加密传输iOS应用数据

    本文转载至 http://www.erblah.com/post/objective-c/shi-yong-3des-base64lai-jia-mi-chuan-shu-iosying-yong-s ...

  7. 阿里巴巴fastjson 包的使用解析json数据

    Fastjson是一个Java语言编写的高性能功能完善的JSON库.由阿里巴巴公司团队开发的. 主要特性主要体现在以下几个方面: 1.高性能 fastjson采用独创的算法,将parse的速度提升到极 ...

  8. 智能家居DIY-空气质量检测篇-获取温度和湿度篇

    目录 智能家居DIY-空气质量检测篇-获取空气污染指数 前言 话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一 ...

  9. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之游戏效果预览(一)

    今天看完了李刚老师的<疯狂Android讲义>一书中的第18章<疯狂连连看>,从而学会了如何编写一个简单的Android疯狂连连看游戏. 开发这个流行的小游戏,难度适中,而且能 ...

  10. Java & 混型

    1.C++ & 混型 C++能够记住其模板参数的类型,对于混型来说,使用参数化类型更加优雅. #include <string> #include <ctime> #i ...