java實(shí)現(xiàn)模擬RPG格斗
三個(gè)英雄角色參與PK
每個(gè)英雄具有以下幾個(gè)屬性:生命值(為0時(shí)英雄倒下)、攻擊力(每次攻擊時(shí)扣除對方的生命值點(diǎn)數(shù))、攻擊間隔(每次攻擊過后都要等待間隔時(shí)間才能進(jìn)行下次攻擊,首次攻擊之前也要先等待間隔時(shí)間)
另外,每個(gè)英雄都擁有兩個(gè)技能:攻擊技能和防御技能,攻擊技能在攻擊對方時(shí)有一定概率發(fā)動(dòng),防御技能在被對方攻擊時(shí)有一定概率發(fā)動(dòng),具體參數(shù)如下
BM:
生命650 攻擊力40 攻擊間隔1.5s
攻擊技能(跳劈):每次攻擊時(shí)有30%幾率造成雙倍傷害
防御技能(反彈):每次被攻擊時(shí)有30%幾率把我方受到的傷害反彈給對方,例如我方被攻擊,對方攻擊力30,扣除我方30點(diǎn)生命值,如果技能發(fā)動(dòng),則對方也要扣除30點(diǎn)生命值,傷害只能反彈一次(兩個(gè)BM相互PK的時(shí)候不出現(xiàn)連續(xù)反彈)
DH:生命600 攻擊力30 攻擊間隔1s
攻擊技能(吸血):每次攻擊時(shí)有30%幾率把造成的傷害轉(zhuǎn)變?yōu)樽约旱纳担▽Ρ还粽咴斐蓚Γ⑶覍⒐魝D(zhuǎn)變成自己的生命值),但不能超過上限,例如我方攻擊,扣除對方30的生命值,同時(shí)給自己增加30點(diǎn)生命值
防御技能(閃避):每次被攻擊時(shí)有30%幾率閃避不受傷害
MK:
生命700 攻擊力50 攻擊間隔2.5s
攻擊技能(重?fù)簦好看喂魰r(shí)有30%幾率造成對方眩暈3s的效果(對方受到傷害后附加眩暈),對方英雄眩暈期間不能發(fā)起攻擊,只能挨打,被攻擊時(shí)也不能發(fā)起防御技能,且眩暈結(jié)束后對方英雄要重新等待攻擊間隔,眩暈時(shí)間不能疊加,如果對方已經(jīng)處于眩暈,我方又發(fā)動(dòng)攻擊技能,那么對方眩暈時(shí)間重新開始計(jì)算
防御技能(天神):每次被攻擊時(shí)有60%的幾率防御一半傷害,例如我方被攻擊,對方攻擊力為40,如果技能發(fā)動(dòng),則只扣除我方20點(diǎn)生命值
1.程序啟動(dòng)后,監(jiān)聽控制臺(tái)輸入
2.輸入任意兩個(gè)英雄名稱(逗號分隔)發(fā)起PK,格式:BM,DH
3.系統(tǒng)輸出PK詳細(xì)過程,直到有一方勝出,格式如下:
BM攻擊DH,BM發(fā)動(dòng)攻擊技能,DH未發(fā)動(dòng)防御技能,BM:350->350,DH:280->200
....
BM勝出
package com.lxi;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;
//三個(gè)人物的基類
abstract class Person {
int val; //生命值
double coldTime; //冷卻時(shí)間
int waitTime; //暈眩時(shí)間
int fight; //攻擊力
int chanceHit; //發(fā)起主動(dòng)技能的概率
int chanceDefense; //發(fā)起防御技能的概率
abstract void hit(Person p); //攻擊技能
abstract int defense(Person p); //防御技能,返回被傷害點(diǎn)數(shù)
}
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; //主動(dòng)技能發(fā)動(dòng)的標(biāo)識
boolean defenseFlag = false; //防御技能發(fā)動(dòng)的標(biāo)識
public void hit(Person p) {
if (rand.nextInt(10) < chanceHit) { //發(fā)動(dòng)主動(dòng)技能
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; //標(biāo)記主動(dòng)技能已經(jīng)發(fā)動(dòng)
} else { //進(jìn)行普通攻擊
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 ? "發(fā)動(dòng)攻擊技能 " : "未發(fā)動(dòng)攻擊技能 ")
+ p.getClass().getSimpleName()
+ (this.defenseFlag ? "發(fā)動(dòng)防御技能 " : "未發(fā)動(dòng)防御技能 ")
+ this.getClass().getSimpleName() + ":" + this.val + ","
+ p.getClass().getSimpleName() + ":" + p.val);
hitFlag = false; //
defenseFlag = false; //重置標(biāo)記,下次重用
}
public int defense(Person p) {
if (rand.nextInt(10) < chanceDefense) {
defenseFlag = true; //標(biāo)記防御技能已經(jīng)發(fā)動(dòng)
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; //防御技能發(fā)動(dòng)的次數(shù)
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; //發(fā)動(dòng)雙倍攻擊
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 ? "發(fā)動(dòng)攻擊技能 " : "未發(fā)動(dòng)攻擊技能 ")
+ p.getClass().getSimpleName()
+ (this.defenseFlag ? "發(fā)動(dòng)防御技能 " : "未發(fā)動(dòng)防御技能 ")
+ 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 ? "發(fā)動(dòng)攻擊技能 " : "未發(fā)動(dòng)攻擊技能 ")
+ p.getClass().getSimpleName()
+ (this.defenseFlag ? "發(fā)動(dòng)防御技能 " : "未發(fā)動(dòng)防御技能 ")
+ 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; //防御技能發(fā)動(dòng),傷害減半
}
return p.fight;
}
}
public class Rpg {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
System.out.println("在這里輸入兩個(gè)人物進(jìn)行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("輸入格式有誤,按默認(rèn)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); //發(fā)動(dòng)攻擊的時(shí)間
System.out.println("---游戲開始---");
while (true) {
long currenTime = System.currentTimeMillis();
if (nextTime1 < currenTime) { //時(shí)間到則發(fā)動(dòng)攻擊
p1.hit(p2);
nextTime1 += p1.coldTime*1000 + p1.waitTime*1000; //下次攻擊時(shí)間=冷卻時(shí)間+被暈眩時(shí)間
p1.waitTime = 0; //回合結(jié)束,重置被暈眩時(shí)間為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();
}
}
}
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Java實(shí)現(xiàn)的zip壓縮及解壓縮工具類示例
這篇文章主要介紹了Java實(shí)現(xiàn)的zip壓縮及解壓縮工具類,結(jié)合實(shí)例形式分析了java對文件的進(jìn)行zip壓縮及解壓縮的具體操作技巧,需要的朋友可以參考下2018-01-01
spring-gateway網(wǎng)關(guān)聚合swagger實(shí)現(xiàn)多個(gè)服務(wù)接口切換的示例代碼
這篇文章主要介紹了spring-gateway網(wǎng)關(guān)聚合swagger實(shí)現(xiàn)多個(gè)服務(wù)接口切換的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
MyBatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充功能詳解
在開發(fā)中經(jīng)常遇到多個(gè)實(shí)體類有共同的屬性字段,這些字段屬于公共字段,也就是很多表中都有這些字段,能不能對于這些公共字段在某個(gè)地方統(tǒng)一處理,來簡化開發(fā)呢?MyBatis-Plus就提供了這一功能,本文就來為大家詳細(xì)講講2022-08-08
Java實(shí)現(xiàn)發(fā)送手機(jī)短信語音驗(yàn)證功能代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送手機(jī)短信語音驗(yàn)證功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
JAVA 集成 PF4J 插件框架的應(yīng)用場景分析
PF4J是一個(gè)強(qiáng)大的Java插件框架,允許開發(fā)者將應(yīng)用程序分解為可擴(kuò)展的模塊,本文介紹了PF4J的基本概念和如何在Java項(xiàng)目中集成,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-03-03

