Написать игру. Опишите классы (Мечник), (Лучник), (Маг), каждый из которых является экземпляром базового абстрактного класса - 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;
}
}
}