模拟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胜出
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格斗的更多相关文章
- 漫话Unity(二)
三.Unity编辑器介绍 Unity是一个商业级的3d游戏引擎.一个引擎的专业程度事实上并非体如今它多么牛b 的次世代效果,说实话那些效果即便你会用也不敢用.由于没有哪个手机是次世代的. 游戏引擎的专 ...
- 关于RPG游戏结构撰写的相关探索下篇
如今市面上已经有好几百种免费RPG系统,我们都能够按照自己的需求对此进行扩展与修改.通过选择现有的系统(特别是较有名的),你能够从一个稳定且经过测试的基础开始创 造. 但是之后你需要基于设置和规则对此 ...
- 新版蜀山剑侠传3D立体格斗全方位剖析
国人终极格斗<蜀山剑侠传>,突破传统横版格斗"二次元"瓶颈,率先开辟3D立体横版格斗网游先河,实现"有纬度"的空间化立体式全景3D战斗体验!游戏大量 ...
- Beat 'Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源代码
浓缩精华.专注战斗! 游戏的本质是什么?界面?养成?NoNo! 游戏来源于对实战和比赛的模拟,所以它的本源就是对抗.就是战斗! 是挥洒热血的一种方式! 一个游戏最复杂最难做的是什么?UI?商城? ...
- Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维
题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- HTML 事件(四) 模拟事件操作
本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4. ...
随机推荐
- Android内容提供者
一个应用中的数据库对别人是不会提供直接的访问的,而是提供接口给别人访问,但是一般应用开发的时候都是去获取别人的数据,而不是自己提供数据. 继承ContentProvider: 在Menifest中注册 ...
- EJB是什么?(节选)
近期的项目中使用了EJB.当时就仅仅知道怎么用,没有深入的去理解.当完毕这个项目之后.再回想项目中使用的技术.框架以及工具的时候,突然感觉对EJB这个概念非常是模糊,于是上网搜一些资料.可是,非常多的 ...
- Xcode 5、Xcode 6 免证书真机调试
我们都知道,在iOS开发中,假设要进行真机调试的话是须要苹果开发人员账号的.否则Xcode就不可以进行真机调试.仅仅可以在模拟器上执行:这就带来了非常多问题,比方iCloud编程的话你不可以用模拟器. ...
- ASP.NET动态网站制作(16)-- SQL数据库(2)
前言:SQL数据库的第二节课,继续讲解基本的语句及用法. 内容: 1.insert插入语句 insert into Book(bookName,bookPrice,bookAuthor) value ...
- ios cocoapods获取不到最新库的原因主要有两个:
获取不到最新库的原因主要有两个: 1.cocoapods的版本过低 2.还没有更新本地仓库 解决方法: 1.更新pods 在终端执行命令行 sudo gem install cocoapods 执行完 ...
- Spring Ioc (this is my first example)
一.首先看下源码结构 二.HelloWord 类 package com.northeasttycoon.bean; /** * 打印出 helloword 参数值 * * @author tycoo ...
- Q: Why can't I access the Site Settings of my SharePoint site? 'File Not Found'
Q: I am trying to access the Site Settings of my SharePoint site, but I get a File Not Found error, ...
- linux字符集查看与设置
linux字符集查看与设置 命令:locale -a 查看本地的字符集 locale -m 查看所有支持的字符集 查看当前默认设置 echo $LANG 记录系统默认使用 ...
- 【python】-- 多进程的基本语法 、进程间数据交互与共享、进程锁和进程池的使用
多进程 进程之间是相互独立的,python是启动进程的时候,是启动的是原生进程.进程是没有GIL锁的,而且不存在锁的概念,进程之间的数据式不能共享的,而线程是可以的. 1.进程的定义 用mulipro ...
- spring struts2整合
把struts2的action交给spring管理 一.导入相应jar包 导入与spring有关的基本jar包,和与struts2有关的基本jar包 还需要导入 struts2-spring整合jar ...