完成模拟英雄联盟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}获得了胜利!");
}
}
}