三個英雄角色參與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(); } }}
以上所述就是本文的全部內容了,希望大家能夠喜歡。
新聞熱點
疑難解答