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}获得了胜利!");



        }
    }
}

纯手打!累死了!点个关注,给个赞呗!

有疑问的可以私信博主或在下方评论。

发布了33 篇原创文章 · 获赞 20 · 访问量 5734

猜你喜欢

转载自blog.csdn.net/maybe_ice/article/details/104574400