C#面向對象總結小項目之實現英雄聯盟回合制小遊戲(文字版)

完成模擬英雄聯盟1V1對戰的回合制文字遊戲

具體要求如下:

  • 英雄初始沒有學習技能,也沒有裝備

  • 英雄每回合可以
    1 選擇學習⼀個技能【每個英雄最多學習4個技能】
    或給學過的技能升⼀級【每個技能最⾼3級,默認1級】

  • 升級後的技能傷害有所提⾼
    特殊效果可以酌情設計【眩暈、沉默等】(選做)

  • 英雄每回合可以選擇行動⼀次(三種行動可選,但會因爲所處狀態有所限制)
    1、【普通攻擊】(若被眩暈,則不可做此操作)
    普通攻擊造成傷害
    造成傷害之後,還會獲得相應的⾦錢

    2、或【技能攻擊】(若被眩暈或者沉默,則不可做此操作)
    技能攻擊造成傷害
    造成傷害之後,還會獲得相應的⾦錢
    技能攻擊還可以使對⽅【(選做)】
    【眩暈(每三回合能使⽤⼀次)】下回合對⽅不能攻擊
    【沉默(每兩回合能使⽤⼀次)】下回合對⽅不能釋放技能
    【其他技能攻擊模式可⾃⾏設計】

    3、 或購買⼀件裝備(任意狀態皆可做此操作)

  • 購買裝備需要⽀付⾦錢

  • 每個英雄最多購買6件裝備

  • 兩個英雄回合交替,直⾄⼀⽅英雄死亡

需求分析:

首先,我們肯定需要一個英雄類,一個裝備類,一個技能類,一個商店類,一個裝備類型的枚舉,一個英雄狀態的枚舉,一個初始化操作的程序入口(main)。當然還可以細分裝備的種類等等,博主這裏偷懶就沒有做細分,武器裝備和消耗品都放在一起,讀者可以自行添加(通過子類繼承裝備類重寫可以實現)

下面開始上代碼:

一、裝備類

using System;

namespace textGame
{
    /// <summary>
    /// 裝備類
    /// </summary>
    class Equipment
    {
        /// <summary>
        /// 裝備名稱
        /// </summary>
        public string name;

        /// <summary>
        /// 攻擊加成
        /// </summary>
        public int adUp;

        /// <summary>
        /// 法強加成
        /// </summary>
        public int apUP;

        /// <summary>
        /// 護甲加成
        /// </summary>
        public int armorUp;

        /// <summary>
        /// 魔抗加成
        /// </summary>
        public int magicResistanceUp;

        /// <summary>
        /// 購買價格
        /// </summary>
        public int buyPrice;

        /// <summary>
        /// 出售價格
        /// </summary>
        public int sellPrice;

        /// <summary>
        /// 裝備類型
        /// </summary>
        public EquipmentType type;

        /// <summary>
        /// 回覆血量
        /// </summary>
        public int hp;

        public Equipment(string name, int adUp, int apUP, int armorUp, int magicResistanceUp, int buyPrice, int sellPrice, EquipmentType type, int hp)
        {
            this.name = name;
            this.adUp = adUp;
            this.apUP = apUP;
            this.armorUp = armorUp;
            this.magicResistanceUp = magicResistanceUp;
            this.buyPrice = buyPrice;
            this.sellPrice = sellPrice;
            this.type = type;
            this.hp = hp;
        }

        /// <summary>
        /// 裝備詳情介紹方法
        /// </summary>
        public void Introduce()
        {
            if (type == EquipmentType.Normal)
            {
                Console.WriteLine($"-------【裝備名稱】:{name}-------");
                Console.WriteLine($"【裝備花費:{buyPrice}】");
                Console.WriteLine($"【裝備類型:普通類型】");
                Console.WriteLine($"【攻擊加成:{adUp}】");
                Console.WriteLine($"【法術加成:{apUP}】");
                Console.WriteLine($"【護甲加成:{armorUp}】");
                Console.WriteLine($"【魔抗加成:{magicResistanceUp}】");
                Console.WriteLine("---------------------------------------------");
            }
            else
            {
                Console.WriteLine($"-------【裝備名稱】:{name}-------");
                Console.WriteLine($"【裝備花費:{buyPrice}】");
                Console.WriteLine($"【裝備類型:消耗品】");
                Console.WriteLine($"【裝備回覆生命值:{hp}】");
                Console.WriteLine("---------------------------------------------");
            }
            
        }

    }
}

二、裝備類型枚舉


namespace textGame
{
    /// <summary>
    /// 裝備類型的枚舉
    /// </summary>
    enum EquipmentType
    {
        /// <summary>
        /// 普通類型
        /// </summary>
        Normal,

        /// <summary>
        /// 消耗品
        /// </summary>
        Consumables
    }
}

三、技能類

using System;

namespace textGame
{
    /// <summary>
    /// 技能類
    /// </summary>
    class Skill
    {
        /// <summary>
        /// 技能名稱
        /// </summary>
        public string name;

        /// <summary>
        /// 技能等級
        /// </summary>
        public int level;

        /// <summary>
        /// 技能附加狀態
        /// </summary>
        public State state;

        /// <summary>
        /// 是否學習了該技能
        /// </summary>
        public bool isStudy;

        /// <summary>
        /// 技能傷害
        /// </summary>
        public int dmg;

        /// <summary>
        /// 技能CD
        /// </summary>
        public int cd;

        /// <summary>
        /// 記錄技能cd情況
        /// </summary>
        public int cdCount;

        /// <summary>
        /// 技能升級
        /// </summary>
        public bool LevelUp()
        {
            if (isStudy == true)
            {
                if (level < 3)
                {
                    level++;
                    Console.WriteLine($"技能{name}升級成功!");
                    return true;
                }
                else
                {
                    Console.WriteLine("技能已滿級!");
                    return false;
                }
                
            }
            else
            {
                Console.WriteLine("該技能尚未學習,無法升級!");
                return false;
            }
        }

        /// <summary>
        /// 學習技能
        /// </summary>
        public bool StudySkill()
        {
            //判斷是否學習過
            if (isStudy == false)
            {
                isStudy = true;
                Console.WriteLine($"技能{name}學習成功!");
                return true;
            }
            else
            {
                Console.WriteLine("你已經學習過這個技能了,請選擇升級技能");
                return false;
            }
        }

        public Skill(string name, State state, bool isStudy, int dmg, int cd)
        {
            this.name = name;
            level = 1;
            this.state = state;
            this.isStudy = isStudy;
            this.dmg = dmg;
            this.cd = cd;
            cdCount = cd;

        }

        /// <summary>
        /// 技能介紹方法
        /// </summary>
        public void Introduce()
        {
            Console.WriteLine($"-------【技能名稱】:{name}-------");
            Console.WriteLine($"【技能等級】:{level}");
            Console.WriteLine($"【技能類型】:讓敵方{state}");
            Console.WriteLine($"【技能基礎傷害】:{dmg}");
            Console.WriteLine($"【技能等級傷害加成】:{(level - 1) * 100}");
            Console.WriteLine($"【技能冷卻時間】:每{cd}回合使用一次");
            Console.WriteLine("---------------------------------------------");
        }
    }
}

四、英雄狀態的枚舉


namespace textGame
{
    /// <summary>
    /// 英雄狀態的枚舉
    /// </summary>
    enum State
    {
        /// <summary>
        /// 普通
        /// </summary>
        Normal,

        /// <summary>
        /// 眩暈
        /// </summary>
        Dizziness,

        /// <summary>
        /// 沉默
        /// </summary>
        Silence
    }
}

五、商店類


using System.Collections.Generic;

namespace textGame
{
    /// <summary>
    /// 商店類
    /// </summary>
    class Store
    {
        /// <summary>
        /// 裝備倉庫
        /// </summary>
        public static List<Equipment> store = new List<Equipment>();

        /// <summary>
        /// 介紹商店所有裝備信息
        /// </summary>
        public static void Introduce()
        {
            foreach (var item in store)
            {
                item.Introduce();
            }
        }

    }
}

六、英雄類

using System;
using System.Collections.Generic;

namespace textGame
{
    /// <summary>
    /// 英雄類
    /// </summary>
    class Hero
    {
        /// <summary>
        /// 英雄名稱
        /// </summary>
        public string name;

        /// <summary>
        /// 英雄血量
        /// </summary>
        public int hp;

        /// <summary>
        /// 英雄擁有金錢
        /// </summary>
        public int money;

        /// <summary>
        /// 英雄基礎攻擊力
        /// </summary>
        public int ad;

        /// <summary>
        /// 英雄基礎法強
        /// </summary>
        public int ap;

        /// <summary>
        /// 英雄基礎護甲
        /// </summary>
        public int armor;

        /// <summary>
        /// 英雄基礎魔抗
        /// </summary>
        public int magicResistance;

        /// <summary>
        /// 裝備加成魔抗
        /// </summary>
        public int magicResistanceUp;

        /// <summary>
        /// 裝備護甲加成
        /// </summary>
        public int armorUp;

        /// <summary>
        /// 裝備加成法強
        /// </summary>
        public int apUp;

        /// <summary>
        /// 裝備加成攻擊力
        /// </summary>
        public int adUp;

        /// <summary>
        /// 英雄所有技能
        /// </summary>
        public List<Skill> skills;

        /// <summary>
        /// 英雄裝備欄
        /// </summary>
        public List<Equipment> equipments;

        /// <summary>
        /// 英雄狀態
        /// </summary>
        public State state;

        /// <summary>
        /// 學習技能
        /// </summary>
        /// <param name="num"></param>
        public bool StudySkill(int num)
        {
            //調用技能學習方法
            return skills[num].StudySkill();
        }

        /// <summary>
        /// 升級技能
        /// </summary>
        /// <param name="num"></param>
        public bool UpgradeSkill(int num)
        {
            //調用技能升級方法
            return skills[num].LevelUp();
        }

        /// <summary>
        /// 英雄普通攻擊方法
        /// </summary>
        public bool Attack(Hero hero)
        {
            //被攻擊的英雄掉血
            hero.hp -= (ad + adUp);

            Console.WriteLine($"{name}對{hero.name}使用了普通攻擊");
            Console.WriteLine($"對{hero.name}造成了{ad + adUp}點傷害");
            Console.WriteLine($"{hero.name}剩餘血量:{hero.hp}");
            Console.WriteLine($"{name}獲得了{(ad + adUp) * 10}的金錢");

            //攻擊獲得金錢
            money += (ad + adUp) * 10;

            Console.WriteLine($"{name}當前擁有的金錢數量是{money}");

            //判斷被攻擊者是否死亡
            if (hero.hp <= 0)
            {
                Console.WriteLine($"{hero.name}已經死亡!");
                return true;
            }

            return false;
        }

        /// <summary>
        /// 英雄技能攻擊方法
        /// </summary>
        /// <param name="hero">被攻擊的英雄</param>
        /// <param name="num"></param>
        /// <returns></returns>
        public bool AttackBySkill(Hero hero, Skill skill)
        {
            skill.cdCount = 0;

            //被攻擊的英雄掉血
            hero.hp -= skill.dmg * skill.level;

            hero.state = skill.state;

            Console.WriteLine($"{name}對{hero.name}使用了{skill.name}");
            Console.WriteLine($"對{hero.name}造成了{skill.dmg * skill.level}點傷害");
            Console.WriteLine($"{hero.name}被{name}{skill.state}了");
            Console.WriteLine($"{hero.name}剩餘血量:{hero.hp}");
            Console.WriteLine($"{name}獲得了{skill.dmg * skill.level * 10}的金錢");

            //攻擊所得金錢
            money += skill.dmg * skill.level * 10;

            Console.WriteLine($"{name}當前擁有的金錢數量是{money}");

            //判斷被攻擊者是否死亡
            if (hero.hp <= 0)
            {
                Console.WriteLine($"{hero.name}被擊殺了");
                return true;
            }

            return false;
        }

        /// <summary>
        /// 購買裝備方法
        /// </summary>
        public bool BuyEquipment(Equipment equipment)
        {
       		//限制購買數量
            if (equipments.Count > 6)
            {
                Console.WriteLine($"{name}不能再購買更多的裝備了!");
                return true;
            }

            if (equipment == null)
            {
                Console.WriteLine("請輸入正確的指令!");
                return false;
            }

            //判斷所有金錢是否足夠購買
            if (money < equipment.buyPrice)
            {
                Console.WriteLine($"【{name}當前沒有足夠的金錢】");
                return false;
            }
            else if (equipment.type == EquipmentType.Consumables)
            {
                hp += equipment.hp;

                money -= equipment.buyPrice;

                Console.WriteLine($"【購買{equipment.name}成功!】");
                Console.WriteLine($"【{name}恢復了{equipment.hp}點生命】");
                Console.WriteLine($"【{name}當前的血量是{hp}】");

                return true;

            }
            else
            {
                equipments.Add(equipment);
                Console.WriteLine($"{name}購買了{equipment.name},{name}變強了!");

                //扣除金錢
                money -= equipment.buyPrice;

                //計算裝備加成
                adUp += equipment.adUp;
                apUp += equipment.apUP;
                armorUp += equipment.armorUp;
                magicResistanceUp += equipment.magicResistanceUp;

                return true;
            }
        }

        public Hero(string name, int hp, int ad, int ap, int armor, int magicResistance, List<Skill> skills)
        {
            this.name = name;
            this.hp = hp;
            money = 0;
            this.ad = ad;
            this.ap = ap;
            this.armor = armor;
            this.magicResistance = magicResistance;
            magicResistanceUp = 0;
            armorUp = 0;
            apUp = 0;
            adUp = 0;
            this.skills = skills;
            equipments = new List<Equipment>();
            state = State.Normal;
        }

        /// <summary>
        /// 介紹英雄技能方法
        /// </summary>
        public void IntroduceSkill()
        {
            foreach (var item in skills)
            {
                item.Introduce();
            }
        }

        /// <summary>
        /// 開始PK
        /// </summary>
        public Hero PKWith(Hero hero)
        {
            Console.WriteLine("------------------------------");
            Console.WriteLine($"【{name}的回合】");
            IntroduceSkill();

            //控制學習技能的循環的標記
            bool studyFlag = true;

            //控制購買或攻擊的循環的標記
            bool flag = true;

            //如果所有技能都已經滿級,不再進入技能相關的循環
            if (skills[0].level == 3 && skills[1].level == 3 && skills[2].level == 3 && skills[3].level == 3)
            {
                Console.WriteLine("您的所有技能都已滿級!");
                studyFlag = false;
            }

            //控制技能學習與升級的循環
            while (studyFlag)
            {
                Console.WriteLine("請選擇學習技能還是升級技能:0-學習,1-升級");

                switch (Console.ReadLine())
                {
                    case "0":
                        Console.WriteLine("請輸入技能編號:");
                        int num01 = Int32.Parse(Console.ReadLine());

                        //如果學習成功,標記改爲false結束循環
                        if (StudySkill(num01))
                        {
                            studyFlag = false;
                        }
                        break;

                    case "1":
                        Console.WriteLine("請輸入技能編號:");
                        int num02 = Int32.Parse(Console.ReadLine());

                        //如果升級成功,標記改爲false結束循環
                        if (UpgradeSkill(num02))
                        {
                            studyFlag = false; 
                        }
                        break;

                    default:
                        Console.WriteLine("您輸入的指令不正確!");
                        break;
                }
            }

            //控制每回合行動的循環
            while (flag)
            {
                //首先判斷英雄當前所處的狀態
                if (state == State.Normal)
                {
                    Console.WriteLine($"{name}當前的狀態是:{state}");

                    Console.WriteLine("********************************");

                    Console.WriteLine("請輸入指令:0-購買裝備,1-普通攻擊,2-技能攻擊");

                }
                else if (state == State.Silence)
                {
                    Console.WriteLine($"{name}當前的狀態是:{state}");

                    Console.WriteLine("********************************");

                    Console.WriteLine("請輸入指令:0-購買裝備,1-普通攻擊");

                }
                else
                {
                    Console.WriteLine($"{name}當前的狀態是:{state}");

                    Console.WriteLine("********************************");

                    Console.WriteLine("請輸入指令:0-購買裝備");
                }

                switch (Console.ReadLine())
                {
                    case "0":

                        Console.WriteLine($"{name}正在購買裝備。。。");
                        Store.Introduce();

                        Console.WriteLine("請輸入你要購買的裝備的編號:(輸入666退出)");

                        int num03 = Int32.Parse(Console.ReadLine());

                        //判斷指令決定是否退出行動並結束本回合
                        if (num03 == 666)
                        {
                            flag = false;
                            break;
                        }
                        else if (BuyEquipment(Store.store[num03]))
                        {
                            flag = false;
                        }
                        break;

                    case "1":
                        //根據英雄狀態決定是否可以執行此操作
                        if (state == State.Dizziness)
                        {
                            Console.WriteLine($"{name}在當前狀態下不能執行此操作!");
                            break;
                        }

                        //判斷英雄是否死亡已決定是否結束遊戲
                        if (Attack(hero))
                        {
                            return this;
                        }
                        flag = false;
                        break;

                    case "2":
                        //根據英雄狀態決定是否可以執行此操作
                        if (state != State.Normal)
                        {
                            Console.WriteLine($"{name}在當前狀態下不能執行此操作!");
                            break;
                        }

                        Console.WriteLine($"{name}當前可以釋放以下技能。。。");

                        //用來保存所有可用的技能
                        List<Skill> usableSkill = new List<Skill>();

                        //查出所有已學且cd好的技能
                        foreach (var item in skills)
                        {
                            if (item.isStudy && item.cd == item.cdCount)
                            {
                                //將符合條件的技能放入可用技能的集合
                                usableSkill.Add(item);
                                item.Introduce();
                            }
                        }

                        Console.WriteLine("請輸入技能編號:");

                        int num04 = Int32.Parse(Console.ReadLine());

                        //判斷英雄是否死亡已決定是否結束遊戲
                        if (AttackBySkill(hero, usableSkill[num04]))
                        {
                            return this;
                        }
                        flag = false;
                        break;

                    default:
                        Console.WriteLine("請輸入正確的指令!");
                        break;
                }
            }
            //英雄所有技能刷新cd時間一回合
            foreach (var item in skills)
            {
                if (item.cdCount != item.cd)
                {
                    item.cdCount++;
                }
            }

            state = State.Normal;

            //(這裏是用兩個英雄來回調用各自的PKWith()函數實現回合制,直到一方死亡)返回獲勝英雄
            return hero.PKWith(this);
            
        }


    }
}

七、主函數

using System;
using System.Collections.Generic;

namespace textGame
{
    class Program
    {
        static void Main(string[] args)
        {
            //新建亞索技能
            Skill zhangangshan = new Skill("斬鋼閃", State.Dizziness, false, 100, 3);
            Skill taqianzhan = new Skill("踏前斬", State.Normal, false, 100, 1);
            Skill beishang = new Skill("悲傷的失戀", State.Silence, false, 100, 2);
            Skill touqian = new Skill("偷錢", State.Normal, false, 100, 1);

            //新建風行者技能
            Skill shufuji = new Skill("束縛擊", State.Dizziness, false, 100, 3);
            Skill qiangliji = new Skill("強力擊", State.Normal, false, 100, 1);
            Skill jifengbu = new Skill("詛咒遺言", State.Silence, false, 100, 2);
            Skill jizhonghuli = new Skill("集中火力", State.Normal, false, 100, 1);

            //將亞索的技能放入一個集合
            List<Skill> yasuoskills = new List<Skill>();
            yasuoskills.Add(zhangangshan);
            yasuoskills.Add(taqianzhan);
            yasuoskills.Add(beishang);
            yasuoskills.Add(touqian);

            //將風行者的技能放入一個集合
            List<Skill> fengxingskills = new List<Skill>();
            fengxingskills.Add(shufuji);
            fengxingskills.Add(qiangliji);
            fengxingskills.Add(jifengbu);
            fengxingskills.Add(jizhonghuli);

            //新建裝備
            Equipment sanxiangzhili = new Equipment("三相之力", 40, 10, 20, 10, 3000, 1750, EquipmentType.Normal, 0);
            Equipment wujinzhiren = new Equipment("無盡之刃", 100, 0, 0, 0, 3500, 1750, EquipmentType.Normal, 0);
            Equipment feizhaikuaileshui = new Equipment("肥宅快樂水", 40, 10, 20, 10, 3500, 1750, EquipmentType.Consumables, 500);

            //將新建的裝備放入商店
            Store.store.Add(sanxiangzhili);
            Store.store.Add(wujinzhiren);
            Store.store.Add(feizhaikuaileshui);

            //新建英雄亞索
            Hero yasuo = new Hero("疾風劍豪 亞索", 1500, 50, 0, 10, 10, yasuoskills);

            //新建英雄風行者
            Hero fengxing = new Hero("風行者", 1500, 50, 0, 10, 10, fengxingskills);


            Console.WriteLine("遊戲開始!");

            //定義一個英雄變量保存贏家
            Hero winner = yasuo.PKWith(fengxing);

            Console.WriteLine("---------------------------------------------");

            Console.WriteLine($"經過一番鏖戰!{winner.name}獲得了勝利!");



        }
    }
}

純手打!累死了!點個關注,給個讚唄!

有疑問的可以私信博主或在下方評論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章