類比RPG格鬥

來源:互聯網
上載者:User

標籤:http   io   java   ar   for   sp   代碼   on   c   

三個英雄角色參與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格鬥

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.