Написать игру. Опишите классы (Мечник), (Лучник), (Маг), каждый из которых является экземпляром базового абстрактного класса - C#
Формулировка задачи:
Добрый день, привет всем! Помогите пожалуйста решить задание:
Опишите классы "Swordsman" (Мечник), "Archer" (Лучник) и "Mage" (Маг), каждый из которых является экземпляром базового абстрактного класса "Unit" (штука, элемент) в компьютерной игре, и может атаковать, уклоняться от атак и умирать. Эти методы должны быть чистыми виртуальным функциями.
В мечника 15 хит-поинтов (жизней), повреждения при атаке 5, шанс уклоняться 60%.
Лучник: 12 hp, 4 dmg, 40% dodge
Маг: 8 hp, 10 dmg, 30% dodge
В main () создайте два массива (враждующие стороны) по три юнита в каждом, причем тип юнита (мечник, лучник или маг) имеет задаваться случайно, при заполнении этих массивов. То есть один раз запустив вашу программу, может создаться три лучники против мечника и двух магов, другой - лучник, мечник и маг против двух мечников и лучника и т.д.
Далее в цикле земулюйте бой между ними, пока бойцы одной из сторон все не погибнут. В консоль при этом выводите сообщение кто кого атаковал, или удалась атака, сколько жизни осталось у жертвы или она погибла. Пусть бой происходит постепенно, по нажатии клавиши spacebar (пробела), чтобы мы могли наблюдать его атака за атакой.
В конце боя объявите, какая команда победила (первая / вторая, синяя / красная, альянс / орки - как уже ваша фанатзия вам подскажет).
Внимание! Реализуйте также возможность, чтобы каждый боец (Воин, Лучник или Маг) выискивал среди врагов соперника своего типа и атаковал его. Скажем, если есть команды:
A11 - M21
A12 - S22
S13 - A23
... То А11 должен выбрать своей целью А23.
Если врагов своего типа не найдено, пусть генерируется сообщение об ошибке и бойцы атакуют по старым правилам.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Game { class Program { static void Main(string[] args) { Unit arrUnit = new Swordsman(); arrUnit = new Archer(arrUnit); Console.WriteLine(arrUnit.getDescription() + "\nAttack = " + arrUnit.setAttack() + ". Defence = " + arrUnit.setDefence() + ". Hitpoints = " + arrUnit.setHitpoints()); Console.WriteLine("\n..::VS::..\n"); Unit merlin = new Mage(); Console.WriteLine(merlin.getDescription() + "\nAttack = " + merlin.setAttack() + ". Defence = " + merlin.setDefence() + ". Hitpoints = " + merlin.setHitpoints()); } } public abstract class Unit { public Swordsman[] SwordsmanArray; public string hero = ""; public abstract int setAttack(); public abstract int setDefence(); public abstract int setHitpoints(); internal string getDescription() { return hero; } } public class Swordsman : Unit { public Swordsman() { hero = "Ranger - critical hit range unit"; } override public int setAttack() { return 5; } override public int setDefence() { return 60; } override public int setHitpoints() { return 15; } } public class Archer : Unit { Unit charaster; public Archer(Unit charaster) { this.charaster = charaster; hero = "Archer - powerful then the bang"; } public string getDescription() { return charaster.getDescription() + ", BowOfGod"; } override public int setAttack() { return 14 + charaster.setAttack(); } override public int setDefence() { return 40 + charaster.setDefence(); } override public int setHitpoints() { return 12 + charaster.setHitpoints(); } } public class Mage : Unit { public Mage() { hero = "Mage - powerfull spelcaster"; } override public int setAttack() { return 8; } override public int setDefence() { return 30; } override public int setHitpoints() { return 10; } } }
Решение задачи: «Написать игру. Опишите классы (Мечник), (Лучник), (Маг), каждый из которых является экземпляром базового абстрактного класса»
textual
Листинг программы
using System; namespace ConsoleWars { internal abstract class Unit { public int HitPoints { get; protected set; } public int Damage { get; protected set; } public double Evasion { get; protected set; } public bool Dead { get; protected set; } protected static readonly Random TeamRandom = new Random(); //Статический для того, чтобы на всю команду был один рандом protected abstract bool Evade(); protected abstract void Die(); public abstract bool Attacked(int damage); public abstract bool Attack(Unit[] enemies, out int i); } internal class Mage : Unit { private const int HP = 8; private const int DMG = 10; private const double EVA = 0.3; public Mage() { HitPoints = HP; Damage = DMG; Evasion = EVA; } public override bool Attack(Unit[] enemies, out int i) { i = 0; if (Dead) return false; //Если умерли, ничего не делаем foreach (var other in enemies) //Если есть враг нашего типа, то бьем его { i++; if (other is Mage && !other.Dead) return other.Attacked(Damage); } do { i = TeamRandom.Next(enemies.Length); } while (!enemies[i].Dead); return enemies[i].Attacked(Damage); //Иначе бьем случайного врага } public override bool Attacked(int damage) { if (Dead || Evade()) return false; //Если увернулись, то не деремся. Умерший считается всегда уворачивающимся HitPoints -= damage; if (HitPoints <= 0) Die(); return true; } protected override bool Evade() { var x = TeamRandom.NextDouble(); return x < Evasion; } protected override void Die() { Dead = true; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д