C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Виртуальные методы в Си-шарп. Переопределение методов
В этом уроке мы рассмотрим с вами некоторые инструменты, с помощью которых в Си-шарп реализуется полиморфизм - виртуальные методы, переопределение методов.

Виртуальный метод – это метод, который может быть переопределен в классе наследнике.

Переопределение метода – это изменение его реализации в классе наследнике. Переопределив метод, он будет работать по-разному в базовом классе и классе наследнике, имея при этом одно и то же имя и аргументы и тип возврата.

Виртуальный метод объявляется при помощи ключевого слова virtual:

[модификатор доступа] virtual [тип] [имя метода] ([аргументы])
{
   // тело метода
}

*Статический метод не может быть виртуальным.

Объявив виртуальный метод, мы теперь можем переопределить его в классе наследнике. Для этого используется ключевое слово override:

[модификатор доступа] override [тип] [имя метода] ([аргументы])
{
   // новое тело метода
}

Рассмотрим это на примере. У нас есть класс Человек, и от него наследуются еще два – Студент и Ученик. В базовом классе есть виртуальный метод ShowInfo, который выводит информацию об объекте. В классах Студент и Ученик этот метод переопределяется для того, чтобы к выводу базовой информации добавить еще специфическую, относящуюся к соответствующему классу:

class Person
{
   public string Name { get; set; }
   public int Age { get; set; }

   public Person(string name, int age)
   {
     Name = name;
     Age = age;
   }
   public virtual void ShowInfo() //объявление виртуального метода
   {
     Console.WriteLine("Человек\nИмя: " + Name + "\n" + "Возраст: " + Age + "\n");
   }
}
class Student : Person
{
   public string HighSchoolName { get; set; }

   public Student(string name, int age, string hsName)
: base(name, age)
   {
     HighSchoolName = hsName;
   }
   public override void ShowInfo() // переопределение метода
   {
     Console.WriteLine("Студент\nИмя: " + Name + "\n" + "Возраст: " + Age +"\n"+ "Название ВУЗа: " + HighSchoolName + "\n");
   }
}
class Pupil : Person
{
   public string Form { get; set; }

   public Pupil(string name, int age, string form)
: base(name, age)
   {
     Form = form;
   }
   public override void ShowInfo() // переопределение метода
   {
     Console.WriteLine("Ученик(ца)\nИмя: " + Name + "\n" + "Возраст: " + Age + "\n" + "Класс: " + Form + "\n");
   }
}

class Program
{

   static void Main(string[] args)
   {
     List<Person> persons = new List<Person>();
     persons.Add(new Person("Василий", 32));
     persons.Add(new Student("Андрей", 21, "МГУ"));
     persons.Add(new Pupil("Елена", 12, "7-Б"));

     foreach (Person p in persons)
       p.ShowInfo();

     Console.ReadKey();
   }
}

В методе main мы создаем список людей, в который добавляем просто человека, студента и ученика, и дальше выводим информацию о каждом из них вызовом метода ShowInfo(). Результат работы – вывод информации соответственно типу объекта.

А теперь может возникнуть вопрос – а что будет, если убрать переопределение, откинув ключевые слова virtual и override? В таком случае, в базовом классе и в классе наследнике будут методы с одинаковым именем ShowInfo. Программа работать будет, но о каждом объекте, независимо это просто человек или студент/ученик, будет выводиться информация только как о простом человеке (будет вызываться метод ShowInfo из базового класса).

Это можно исправить, добавив проверки на тип объекта, и при помощи приведения типов, вызывать нужный метод ShowInfo:

foreach (Person p in persons)
{
   if (p is Student)
     ((Student)p).ShowInfo();
   else if (p is Pupil)
     ((Pupil)p).ShowInfo();
   else p.ShowInfo();
}

Только вот, сколько лишнего кода от этого появляется. Думаю, становится понятно, что нам дают виртуальные методы и переопределение.

Вызов базового метода

Бывает так, что функционал метода, который переопределяется, в базовом классе мало отличается от функционала, который должен быть определен в классе наследнике. В таком случае, при переопределении, мы можем вызвать сначала этот метод из базового класса, а дальше дописать необходимый функционал. Это делается при помощи ключевого слова base:

public virtual void ShowInfo() // ShowInfo в классе Person
{
   Console.WriteLine("Имя: " + Name);
   Console.WriteLine("Возраст: " + Age);
}

public override void ShowInfo() // ShowInfo в классе Student
{
   base.ShowInfo(); // вызывает базовый метод ShowInfo()
   Console.WriteLine("Название ВУЗа: " + HighSchoolName);
}


Домашнее задание

Создайте три класса: Воин, Воин_в_легких_доспехах и Воин_в_тяжелых_доспехах. У всех них есть свойство – Количество_жизней, а также метод Получить_урон, который принимает в качестве аргумента значение получаемого урона. Реализуйте этот метод по-разному для всех типов, установив различные коэффициенты в зависимости от типа доспехов в формуле вычета здоровья.

PS. Не забудьте поделиться с друзьями этой статьей с помощью кнопок социальных сетей.
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
19 окт 2013 00:29
Avito321vom 29 сен 2017 15:49
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a1garant</b>

<b>Здравствуйте, дорогие друзья!</b>

Рады предоставить Всем вам услуги по пополнению баланса на действующие активные аккаунты Avito (а также, абсолютно новые). Если Вам необходимы определенные балансы - пишите, будем решать. Потратить можно на турбо продажи, любые платные услуги Авито (Avito).

<b>Аккаунты не Брут. Живут долго.</b>

Процент пополнения в нашу сторону и стоимость готовых аккаунтов: <b>50% от баланса на аккаунте.</b>
Если требуется залив на ваш аккаунт, в этом случае требуются логин и пароль Вашего акка для доступа к форме оплаты, пополнения баланса.
Для постоянных заказчиков гибкая система бонусов и скидок!

<b>Гарантия: </b>

<b>И, конечно же ничто не укрепляет доверие, как - Постоплата!!!</b> Вперед денег не просим...

Рады сотрудничеству!

<b>Заливы на балансы Авито</b>
________

удалить аккаунт avito
как взломать аккаунт на авито
авито как заработать на нем деньги
продажа аккаунтов на авито с балансом
авито мой номер в чужом аккаунте в

qnikacag 27 сен 2017 14:23
Пройдите 1 регистрацию, сделайте 2 действия
и получайте от 8950 рублей каждые сутки в автоматическом режиме.

Мы гарантируем:
- Первый заработок в течении 60 минут.
- Стабильный доход 24 часа в сутки.
- Поступление денег без задержек.
- Для России, стран СНГ и Европы.
- Без вложений и установки ПО.
- Специально для новичков и людей без опыта.

Более подробная информация на нашем сайте. ( prosto-dengi.tk )

Nataliehic 24 сен 2017 21:43
Данное сообщение размещено здесь с помощью XRumer + XEvil 3.0
XEvil 3.0 - революционное приложение, способное обходить практически любую антибот-защиту.
Распознавание капчи Google, Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!
Вы читаете это - значит, это работает! ;)
Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

Geron 23 сен 2017 04:14
Сделал так, что юнит бьет морду юнита, как то даже в голову не пришло, что можно просто вбить опр.кол-во урона, хотя это бы все разнообразило да=)

class Warrior
{
public int Health { get; set; }
public int Avdmg { get; set; }
public int Armor { get; set; }
public Warrior(int health,int avdmg,int armor)
{
Health = health;
Avdmg = avdmg;
Armor = armor;
}
public virtual int GetDmg(int Health,int Armor,int Avdmg,int Special)
{
Special = 0;
int Healthnow=Health;
if (Armor - Avdmg < 0)
Healthnow = Health + Armor - Avdmg;
if (Healthnow < 0)
Healthnow = 0;
return Healthnow;
}
}
class Lightwar:Warrior
{
public int Evasion { get; set; }
public Lightwar(int health, int avdmg, int armor,int evasion) :base(health, avdmg, armor)
{
Evasion = evasion;
}
public override int GetDmg( int Health, int Armor, int Avdmg,int Evasion)
{
int Healthnow = Health;
if (Avdmg / Evasion < 2.5)
return base.GetDmg(Health, Armor, Avdmg,Evasion);
//else if (Healthnow < 0)
// Healthnow = 0;

return Healthnow;
}
}
class Heavywar:Warrior
{
public int Shield { get; set; }
public Heavywar(int health, int avdmg, int armor, int shield) :base(health, avdmg, armor)
{
Shield = shield;
}
public override int GetDmg(int Health, int Armor, int Avdmg, int Shield)
{
int Healthnow = Health;
if (Avdmg / Shield > 2.5)
return base.GetDmg(Health, Armor, Avdmg,Shield);
//else if (Healthnow < 0)
// Healthnow = 0;
return Healthnow;
}
}
class Program
{
static void Main(string[] args)
{
int e11 = 0;
int e21 = 0;
int e1 = 0;
int e2 = 0;
int e12=0, e13=0, e14=0, e22=0, e23=0, e24=0;
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior(70, 9, 5));
warriors.Add(new Lightwar(85,11,7,5));
warriors.Add(new Heavywar(100,10,10,3));
Console.WriteLine("Выберите юнита: \n1. Солдат\n2. Легкий пехотинец\n3.Тяжелый мечник");
e1 = Convert.ToInt16(Console.ReadLine())-1;
switch (e1)
{
case 0:
e11 = warriors[0].Health;
e12 = warriors[0].Avdmg;
e13 = warriors[0].Armor;
break;
case 1:
e11 = warriors[1].Health;
e12 = warriors[1].Avdmg;
e13 = warriors[1].Armor;
foreach (Warrior w in warriors)
{
if (w is Lightwar)
e14 = ((Lightwar)w).Evasion;
}
break;
case 2:
e11 = warriors[2].Health;
e12 = warriors[2].Avdmg;
e13 = warriors[2].Armor;
foreach (Warrior w in warriors)
{
if (w is Heavywar)
e14 = ((Heavywar)w).Shield;
}
break;
}

Console.WriteLine("Выберите соперника для него: \n1. Солдат\n2. Легкий пехотинец\n3.Тяжелый мечник");
e2 = Convert.ToInt16(Console.ReadLine())-1;
switch (e2)
{
case 0:
e21 = warriors[0].Health;
e22 = warriors[0].Avdmg;
e23 = warriors[0].Armor;
break;
case 1:
e21 = warriors[1].Health;
e22 = warriors[1].Avdmg;
e23 = warriors[1].Armor;
foreach (Warrior w in warriors)
{
if (w is Lightwar)
e24 = ((Lightwar)w).Evasion;
}
break;
case 2:
e21 = warriors[2].Health;
e22 = warriors[2].Avdmg;
e23 = warriors[2].Armor;
foreach (Warrior w in warriors)
{
if (w is Heavywar)
e24 = ((Heavywar)w).Shield;
}
break;
}
do
{
// foreach (Warrior w in warriors)
// {
if (e1 == 2)
{
e11 = ((Heavywar)warriors[2]).GetDmg(e11, e13, e22, e14);
Console.WriteLine("У тяжелого мечника-1 осталось" + e11 + "hp");
}
else if (e1 == 1)
{
e11 = ((Lightwar)warriors[1]).GetDmg(e11, e13, e22, e14);
Console.WriteLine("У Легкого пехотинца-1 осталось" + e11 + "hp");
}
else
{
e11 = ((Warrior)warriors[0]).GetDmg(e11, e13, e22, e14);
Console.WriteLine("У Солдата-1 осталось" + e11 + "hp");
}
if (e2 == 2)
{
e21 = ((Heavywar)warriors[2]).GetDmg(e21, e23, e12, e24);
Console.WriteLine("У тяжелого мечника-2 осталось" + e21 + "hp");
}
else if (e2 == 1)
{
e21 = ((Lightwar)warriors[1]).GetDmg(e21, e23, e12, e24);
Console.WriteLine("У Легкого пехотинца-2 осталось" + e21 + "hp");
}
else
{
e21 = ((Warrior)warriors[0]).GetDmg(e21, e23, e12, e24);
Console.WriteLine("У Солдата-2 осталось" + e21 + "hp");
}
// }
//if (e11 < 0)
// e11 = 0;
//else if (e21 < 0)
// e21 = 0;
Console.ReadKey();
}
while (e11>0&&e21!=0&&e21>0&&e11!=0);
Console.ReadKey();


}
}

Maks 31 авг 2017 17:59

namespace ConsoleApp8
{
class Warrion
{ public const int MinHP = 0;
public const int MaxHP = 100;
protected int Damag;
private int HP = 100;
public Warrion(int hp_, int damag)
{ HP = hp_;
Damag = damag;
}public int _hp
{
get
{
return HP;
}
set
{
if (value >= 100)
HP = MaxHP;
else if (value < 1)
HP = MinHP;
else HP = value;
}
}
public virtual void dameg()
{Console.WriteLine("HP : " + _hp)}}
class Warrion_cloch : Warrion
{ private const int cloch = 20;
private const int armor = 40;
private const int Naked = 0;
private int HpArmor;
private int Who;
public Warrion_cloch(string Armor,int damag, int hp_) : base (hp_ ,damag)
{ if (Armor == "ткань")
Who = cloch;
else if (Armor == "латы")
Who = armor;
else
Who = Naked; }
public override void dameg()
{
base.dameg();
HpArmor = _hp + Who;
Console.WriteLine("HP + Armor : " + HpArmor);
int result = HpArmor - Damag;
if (result <= 0)
Console.WriteLine("Killed");
else
Console.WriteLine("Осталось еще {0} hp",result);} }
class Warrion_armor : Warrion
{ private const int cloch = 20;
private const int armor = 40;
private const int Naked = 0;
private int HpArmor;
private int Who;
public Warrion_armor(string Armor, int damag, int hp_) : base (hp_ ,damag)
{ if (Armor == "ткань")
Who = cloch;
else if (Armor == "латы")
Who = armor;
else
Who = Naked; }
public override void dameg()
{ base.dameg();
HpArmor = _hp + Who;
Console.WriteLine("HP + Armor : " + HpArmor);
int result = HpArmor - Damag;
if (result <= 0)
Console.WriteLine("Killed");
else
Console.WriteLine("Осталось еще {0} hp", result);} }
class Program
{ private static string armor1;
private static string armor2;
static void Main(string[] args)
{ Console.WriteLine("Привет, выбери доспехи для воинов ( ткань/ латы/без доспехов(голенький) \nПервый воин");
armor1 = Console.ReadLine();
Console.WriteLine("Второй воин");
armor2 = Console.ReadLine();
Console.WriteLine("Напишите какой урон хотите нанести воинам");
int damag = Convert.ToInt32(Console.ReadLine());
List<Warrion> Warrion = new List<Warrion>();
Warrion.Add(new Warrion_cloch(armor1, damag, 100));
Warrion.Add(new Warrion_armor(armor2, damag, 100));
foreach (Warrion p in Warrion)
if (p is Warrion_cloch)
((Warrion_cloch)p).dameg();
else
((Warrion_armor)p).dameg();
Console.ReadKey();} }}

Artem_86 29 июл 2017 18:24
Почему не получается?Помогите пожалуйста.namespace ConsoleApplication1
{
class Voin
{
protected double helf;
public double Helf
{
get
{
return helf;
}
set
{
helf = value;
}
}
public Voin()
{
Helf = 100;
}
public virtual double Metod(int damag)
{
Helf -= damag;
return Helf;
}
public virtual void Display()
{
Console.WriteLine("Здоровье простого война: {0}", Helf);
}
public virtual void Show()
{
Console.WriteLine("Осталось здоровья : {0}", Helf);
}
}
class Light_Voin : Voin
{
public override double Metod(int damag)
{
Helf-=((damag / 100) * 60);
return Helf;
}
public override void Display()
{
Console.WriteLine("Здоровье война в легких доспехах: {0}", Helf);
}
public override void Show()
{
Console.WriteLine("Осталось здоровья : {0}", Helf);
}
}
class Hard_Voin : Voin
{
public override double Metod(int damag)
{
Helf -= ((damag / 100) * 20);
return Helf;
}
public override void Display()
{
Console.WriteLine("Здоровье война в тяжелых доспехах: {0}", Helf);
}
public override void Show()
{
Console.WriteLine("Осталось здоровья : {0}", Helf);
}
}
class Program
{
static void Main(string[] args)
{
Voin ob1 = new Voin();
Light_Voin ob2 = new Light_Voin();
Hard_Voin ob3 = new Hard_Voin();

ob1.Display();
ob2.Display();
ob3.Display();

ob1.Metod(20);
ob2.Metod(20);
ob3.Metod(20);

ob1.Show();
ob2.Show();
ob3.Show();

Console.ReadKey();
}

}
}

Serj190492 12 апр 2017 06:24
Не смог убрать повторяющийся код из свича. Пытался вывести в отдельную функцию, но остановило то, что не знаю как передать в неё объект...

- кода в том, что при нанесении большого урона броня и жизнь воина могут один раз показаться отрицательными.

class Warrior
{
public float health;
public float armor;
public float koefficientDamage;

public Warrior(float h, float arm, float k)
{
health = h;
armor = arm;
koefficientDamage = k;
}

public virtual void GetDamage(float dmg)
{
if (dmg > armor)
{
armor = 0;
health -= (dmg * koefficientDamage);
}
else
health = (health + armor) - (dmg * koefficientDamage);
}
}

class WarriorHigh : Warrior
{
public WarriorHigh(float h, float arm, float k) : base(h, arm, k)
{
}

public override void GetDamage(float dmg)
{
if (armor > 0)
{
armor -= dmg * koefficientDamage;
health -= 1;
}
else
{
koefficientDamage = 1;
base.GetDamage(dmg);
}

}
}

class WarriorLight : Warrior
{
public WarriorLight(float h, float arm, float k) : base(h, arm, k)
{
}

public override void GetDamage(float dmg)
{
if (armor > 0)
{
armor -= dmg * koefficientDamage;
health -= 1;
}
else
{
koefficientDamage = 2;
base.GetDamage(dmg);
}
}
}

class Program
{
static void Main(string[] args)
{
Warrior W = new Warrior(100f, 1f, 9f);
WarriorHigh H = new WarriorHigh(200f, 100f, 0.5f);
WarriorLight L = new WarriorLight(50f, 30f, 0.7f);



while (true)
{
Console.WriteLine("Введите силу удара по воину (целое)");

int dmg = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Введите класс воина для нанесения ему урона (W, H, L)");

string key = Console.ReadLine();

switch (key)
{
case "W":
if (W.health > 0)
{
Console.WriteLine("W имел " + W.health + " здоровья и " + W.armor + " брони");
Console.WriteLine("Мы наносим " + dmg + " урона");
W.GetDamage((float)dmg);
Console.WriteLine("Теперь W имеет " + W.health + " здоровья и " + W.armor + " брони");
}
else
Console.WriteLine("Воин W погиб :(");
break;
case "H":
if (H.health > 0)
{
Console.WriteLine("H имел " + H.health + " здоровья и " + H.armor + " брони");
Console.WriteLine("Мы наносим " + dmg + " урона");
H.GetDamage((float)dmg);
Console.WriteLine("Теперь H имеет " + H.health + " здоровья и " + H.armor + " брони");
}
else
Console.WriteLine("Воин H погиб :(");
break;
case "L":
if (L.health > 0)
{
Console.WriteLine("L имел " + L.health + " здоровья и " + L.armor + " брони");
Console.WriteLine("Мы наносим " + dmg + " урона");
L.GetDamage((float)dmg);
Console.WriteLine("Теперь L имеет " + L.health + " здоровья и " + L.armor + " брони");
}
else
Console.WriteLine("Воин L погиб :(");
break;
default:
Console.WriteLine("Вы ввели неверное значение!");
break;
}
}
}
}

Santiaga 21 мар 2017 10:42
namespace Enemy
{ class Warrior
{ public int health = 100;
public int armor = 0;

public virtual int GetDamage(int damage) { health = (health + armor) - damage; Console.WriteLine("You have"+ health );Console.ReadKey(); return health; }
}

class WarriorLight : Warrior { public override int GetDamage(int damage) { armor = 10; base.GetDamage(damage);return health; } }

class WarriorHeavy : Warrior { public override int GetDamage(int damage) { armor = 50; base.GetDamage(damage); return health; } }
class Program
{
static void Main(string[] args)
{

Warrior W = new Warrior();
Warrior L = new WarriorLight();
Warrior H = new WarriorHeavy();
Console.WriteLine("Choose your enemy W=Warrio,L=Light Warrior,H=Heavy Warrior");
switch (Console.ReadLine())
{ case "W":
Console.WriteLine("Hit your enemy");
int damageHit = Convert.ToInt32(Console.ReadLine());
W.GetDamage(damageHit);

break;
case "L":
Console.WriteLine("Hit your enemy");
damageHit = Convert.ToInt32(Console.ReadLine());
L.GetDamage(damageHit);

break;

case "H":
Console.WriteLine("Hit your enemy");
damageHit = Convert.ToInt32(Console.ReadLine());
H.GetDamage(damageHit);

break;
}









}
}
}

Илья 13 мар 2017 22:17
using System;

namespace warriors
{
class Warrior{
public int health =100;
public int armor; //количество едениц брони

public int HealthNumber{
get{
return health;}
set{
health = value;} // задать свойству значение
}

public virtual int GetDamge(int damage){ //виртуальный метод
HealthNumber = HealthNumber+armor - damage;
Console.WriteLine ("Колличество жизней после нанесенного урона "+HealthNumber);
return HealthNumber;
}
}
class WarriorLight:Warrior{
public override int GetDamge (int damage) //переопределение 1
{ armor = 10;
base.GetDamge (damage);
return HealthNumber;
}
}
class WarriorHight:Warrior{
public override int GetDamge (int damage) //переопределение 2
{
armor = 50;
base.GetDamge (damage);
return HealthNumber;;
}

}
class MainClass
{
public static void Main (string[] args)
{
int damageHit = 35; //Сколько урона будет нанесено
Warrior warrior = new Warrior ();
WarriorLight warriorLight = new WarriorLight ();
WarriorHight warriorHight = new WarriorHight ();

Console.WriteLine("Воин в обычной броне ");
warrior.GetDamge (damageHit);
Console.WriteLine ("Воин в легкой броне");
warriorLight.GetDamge (damageHit);
Console.WriteLine ("Воин в тяжелой броне");
warriorHight.GetDamge (damageHit);
}
}
}



vegorcag 08 фев 2017 16:02
Увлекательная подработка не выходя из дома.
Мы предлагаем: Достойная зарплата без задержек, справка 2-НДФЛ, карьерный рост, бесплатное обучение,
свободный график, страховые взносы в Пенсионный фонд, официальный договор (по желанию).
График работы, Вы определяете самостоятельно, в пределах Ваших возможностей.
Ваш возраст и образование значения не имеют.
Обязательные условия: наличие компьютера и интернета.
Ваши действия:
1. На сайте ( off-rabota.tk ) скачайте и установите приложение.
2. Ознакомьтесь с содержимым.
3. Пройдите несложную регистрацию.
4. Обязательно, пройдите курсы обучения. (Бесплатно)
5. Начинайте зарабатывать!
Зарплату мы перечисляем только на банковскую карту любой платёжной системы.
(Для работы советуем оформить отдельную карту)
ВНИМАНИЕ! Весь процесс регистрации, обучения совершенно бесплатны. Не попадитесь в руки мошенников!

-----JGHHJ16FU16G1U6F51J6F1J6R1UY6F5Y-----

Максим 30 янв 2017 19:01

using System;


class Warrior
{
protected int health;

public virtual void GetDamage(int damage)
{

}
}

class LightArmoryWarrior : Warrior
{
public LightArmoryWarrior(int HP)
{
health = HP;
}

public override void GetDamage(int damage)
{
health = health - (damage/100) * 80;
Console.WriteLine("Легкий воин получил урона: " + (damage/100)*80);
Console.WriteLine("Поглощено урона: " + (damage - ((damage/100) *80)) );
Console.WriteLine("Остаток жизней: " + health);
}
}

class HeavyArmoryWarrior : Warrior
{
public HeavyArmoryWarrior(int HP)
{
health = HP;
}

public override void GetDamage(int damage)
{
health = health - (damage/100) * 50;
Console.WriteLine("Тяжелый воин получил урона: " + (damage/100)*50);
Console.WriteLine("Поглощено урона: " + (damage - ((damage / 100) * 50)));
Console.WriteLine("Остаток жизней: " + health);
}
}

class Program
{
static void Main()
{
LightArmoryWarrior LightUnit = new LightArmoryWarrior(250);
LightUnit.GetDamage(100);

Console.WriteLine();

HeavyArmoryWarrior HeavyUnit = new HeavyArmoryWarrior(250);
HeavyUnit.GetDamage(100);


Console.Read();
}
}

Юрец 12 ноя 2016 19:35

namespace WarriorClass
{
class Program
{
class Warrior
{
int health;

public int Health
{
get { return health; }
set { health = value; }
}

public Warrior ()
{
Health = 100;
}

public virtual void getDamage(int d)
{
Console.WriteLine("Воин получил {0} урона, осталось {1} жизней", d, Health - d);
}
}

class LightWarrior : Warrior
{
public override void getDamage(int d)
{
Console.WriteLine("Легкий воин получает на 10% больше урона и полученный урон {0}, осталось {1} жизней", (d*0.1)+d, Health - ((d * 0.1) + d));
}
}

class HeavyWarrior : Warrior
{
public override void getDamage(int d)
{
Console.WriteLine("Тяжелый воин получает на 10% меньше урона и полученный урон {0}, осталось {1} жизней", d -(d * 0.1), Health - (d - (d * 0.1)));
}
}
static void Main(string[] args)
{
Warrior Konan = new Warrior();
LightWarrior Sting = new LightWarrior();
HeavyWarrior Rotgar = new HeavyWarrior();

Konan.getDamage(20);
Sting.getDamage(20);
Rotgar.getDamage(20);

Console.ReadKey();
}
}
}

Flamingo 12 сен 2016 22:44

class War
{
internal int Health;
internal int Armor;

public War()
{
this.Health = 100;
this.Armor = 0;
}

internal virtual int GetDamage(int Damage)
{
Console.Write("Слабый воин получит урона:");
return this.Health - Damage;
}
}

class StrongWar : War
{
public StrongWar()
{
this.Health = 100;
this.Armor = 50;
}

internal override int GetDamage(int Damage)
{
Console.Write("Сильный воин получит урона:");
return base.GetDamage(Damage) + this.Armor;
}
}

class PowerfulWar : War
{
public PowerfulWar()
{
this.Health = 100;
this.Armor = 80;
}

internal override int GetDamage(int Damage)
{
Console.Write("Мощный воин получит урона:");
return base.GetDamage(Damage) + this.Armor;
}
}

class Program
{
static void Main(string[] args)
{
List<War> wars = new List<War>();
wars.Add(new War());
wars.Add(new StrongWar());
wars.Add(new PowerfulWar());

foreach (War war in wars)
Console.Write(war.GetDamage(100) + "\n");
}
}

ALexX 29 авг 2016 16:42

{
// Воин - класс родитель. Изначально жизнь 100. Имя необходимо задать при инициализации. Имеет метод получения ранений.
class Warrior
{
public string Name { set; get; }
public double Life { set; get; }
public int Armor { set; get; }
public Warrior(string aName)
{
Name = aName;
Life = 100;
Armor = 0;
}
public virtual void Wound(byte damage)
{
if (Armor == 0)
{ Life = Life - damage; }
else if (Armor >= 0)
{ Armor = Armor - damage; }
if (Armor <= 0)
{ Life = Life + Armor; Armor = 0; }
}
}

// Воин в лёгких доспехах. Наследник класса Warrior. Дополнительно имеет защиту 40. Имеет метод получения ранений. При инициализации задаём имя.
class WarriorLightArm : Warrior
{
public WarriorLightArm(string aName) : base(aName)
{
Name = aName;
Armor = 40;
}
public override void Wound(byte damage)
{
if (Armor == 0)
{ Life = Life - damage; }
else if (Armor >= 0)
{ Armor = Armor - damage; }
if (Armor <= 0)
{ Life = Life + Armor; Armor = 0; }
}
}

// Воин в тяжёлых доспехах. Наследник класса Warrior. Дополнительно имеет защиту 70. Имеет метод получения ранений. При инициализации задаём имя.
class WarriorHeavyArm : Warrior
{
public WarriorHeavyArm(string aName) : base(aName)
{
Name = aName;
Armor = 70;
}
public override void Wound(byte damage)
{
if (Armor == 0)
{ Life = Life - damage; }
else if (Armor >= 0)
{ Armor = Armor - damage / 2; } // Ущерб делим на 2
if (Armor <= 0)
{ Life = Life + Armor; Armor = 0; }
}
}

// Создадим по одному воину каждого класса, нанесём потери и посмотрим оставшуюся жизненную силу
class Program
{
static void Main(string[] args)
{
ConsoleKeyInfo cki;

List<Warrior> warrior = new List<Warrior>();
warrior.Add(new Warrior("Воин_без_доспехов"));
warrior.Add(new WarriorLightArm("Воин_в_легких_доспехах"));
warrior.Add(new WarriorHeavyArm("Воин_в_тяжелых_доспехах"));
cki = Console.ReadKey(true);

do
{
Console.Write("Введите наносимый урон(0-255): ");
byte damage = Convert.ToByte(Console.ReadLine());

foreach (Warrior element in warrior)
{
Console.WriteLine("***********************");
element.Wound(damage);
Console.WriteLine(element.Name);
if (element.Life <= 0)
{
element.Life = 0;
Console.WriteLine("Персонаж убит");
}
else
{
Console.WriteLine("Жизнь: " + element.Life);
Console.WriteLine("Броня: " + element.Armor);
}
}
Console.ReadKey();
Console.Clear();
}
while (cki.Key != ConsoleKey.Escape);
}
}
}

Дмитро 19 авг 2016 21:16
namespace ConsoleApplication4
{
class Warrior
{
public int Health { get; set; }

public Warrior(int health)
{

Health = health;
}
public virtual void Damage(int Damage)
{
Health = Health - Damage;
}
}
class WarriorLightArmor : Warrior
{
public override void Damage(int Damage)
{
Health = Health + 10 - Damage;
}
public WarriorLightArmor(int health)
: base(health)
{ }
}
class WarriorPlateArmor : Warrior
{
public override void Damage(int Damage)
{
Health = Health + 50 - Damage;
}
public WarriorPlateArmor(int health)
: base(health)
{ }
}
class Prog
{
static void Main(string[] args)
{
Warrior war1 = new Warrior(100);
WarriorLightArmor war2 = new WarriorLightArmor(100);
WarriorPlateArmor war3 = new WarriorPlateArmor(100);
Console.WriteLine("Воїн1 без брон1 має здоровя - " +war1.Health);
Console.WriteLine("Воїн2 в легк1й брон1 має здоровя - " +war2.Health);
Console.WriteLine("Воїн3 в важк1й брон1 має здоровя - " +war3.Health+ "\n");
war1.Damage(40);
war2.Damage(50);
war3.Damage(100);
Console.WriteLine("П1сля нанесеня пошкодження Воїн1 має - " +war1.Health);
Console.WriteLine("П1сля нанесення пошкодження Воїн2 має - " +war2.Health);
Console.WriteLine("П1сля нанесення пошкодження Воїн3 має - " +war3.Health);
Console.ReadKey();
}
}
}

Kirill 15 авг 2016 09:54

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Virtual_and_override
{
class Warrior
{
public int Health
{ get; set; }
public virtual void Damage(int _Damage)
{
Health -= _Damage;
}
public Warrior(int health)
{
Health = health;
}
}
class WarraiorLightArmor : Warrior
{
public override void Damage(int _Damage)
{
Health = Health + 35 - _Damage;
}
public WarraiorLightArmor(int health):base(health)
{}
}
class WarriorHeavyArmor : Warrior
{
public override void Damage(int _Damage)
{
base.Damage(_Damage);
}
public WarriorHeavyArmor(int health):base(health)
{ }
}
class Program
{
static void Main(string[] args)
{
Warrior warrior1 = new Warrior(100);
WarraiorLightArmor warrior2 = new WarraiorLightArmor(100);
WarriorHeavyArmor warrior3 = new WarriorHeavyArmor(100);
Console.WriteLine(warrior1.Health);
Console.WriteLine(warrior2.Health);
Console.WriteLine(warrior2.Health);
warrior1.Damage(30);
warrior2.Damage(40);
warrior3.Damage(90);
Console.WriteLine(warrior1.Health);
Console.WriteLine(warrior2.Health);
Console.WriteLine(warrior3.Health);
Console.ReadKey();
}
}
}


Игорь 26 июл 2016 12:21
Возможна реализация иным образом:



namespace Воины
{
class Warrior
{
public string Name { get; set; }
public int Armor { get; set; }
public int Number_of_Live { get; set; }
public int Damage { get; set; }


public Warrior(string name,int number_of_live,int damage)
{
Name = name;
Damage = damage;
Number_of_Live = number_of_live - damage;
}

public virtual void Info()
{
Console.WriteLine("Имя: " + Name + "\nКоличество жизней: " + Number_of_Live + "\nПолучаемый урон: " + Damage);
}
}

class Warrior_light_armor : Warrior
{
public Warrior_light_armor(string name, int number_of_live, int damage, int armor):base(name,number_of_live,damage)
{
Armor = armor;
Number_of_Live = (Number_of_Live + Armor - (damage / 2));

}

public override void Info()
{
Console.WriteLine("Имя: " + Name + "\nКоличество жизней: " + Number_of_Live + "\nПолучаемый урон: " + Damage+"\nКоличество брони: "+Armor);
}
}

class Warrior_heavy_armor : Warrior
{
public Warrior_heavy_armor(string name, int number_of_live, int damage, int armor) : base(name, number_of_live, damage)
{
Armor = armor;
Number_of_Live = (Number_of_Live + Armor - (damage / 4));
}
public override void Info()
{
Console.WriteLine("Имя: " + Name + "\nКоличество жизней: " + Number_of_Live + "\nПолучаемый урон: " + Damage + "\nКоличество брони: " + Armor);
}
}


class Program
{
static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior("Виктор",100,60));
warriors.Add(new Warrior_heavy_armor("Алекс",100,60,80));
warriors.Add(new Warrior_light_armor("Саурон",100,60,40));

foreach(Warrior warrior in warriors)
{
warrior.Info();
}

Console.ReadLine();

}
}
}

Игорь 26 июл 2016 11:57
namespace Воины
{
class Warrior
{
public string Name { get; set; }
public int Armor { get; set; }
public int Number_of_Live { get; set; }


public Warrior(string name)
{
Name = name;
Number_of_Live = 100;
}

public virtual void Damage(int damage)
{
Number_of_Live = Number_of_Live - damage;
}
}

class Warrior_light_armor : Warrior
{
public Warrior_light_armor(string name, int armor):base(name)
{
Name = name;
Armor = armor;
}

public override void Damage(int damage)
{
Number_of_Live = (Number_of_Live + Armor - (damage / 2));
}
}

class Warrior_heavy_armor : Warrior
{
public Warrior_heavy_armor(string name, int armor) : base (name)
{
Name = name;
Armor = armor;
}
public override void Damage(int damage)
{
Number_of_Live = (Number_of_Live + Armor - (damage / 4));
}
}


class Program
{
static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior("Виктор"));
List<Warrior> warriors2 = new List<Warrior>();
warriors2.Add(new Warrior_heavy_armor("Алекс", 80));
warriors2.Add(new Warrior_light_armor("Саурон", 40));

foreach(Warrior warrior in warriors)
{
warrior.Damage(50);
Console.WriteLine(warrior.Name+" "+warrior.Number_of_Live+"\n");
}

foreach(Warrior warrior in warriors2)
{
warrior.Damage(70);
Console.WriteLine(warrior.Name+" "+warrior.Number_of_Live+" "+warrior.Armor);

}
Console.ReadLine();
}
}
}

bas-tion.ru 01 май 2016 22:13
Воин - класс родитель. Изначально жизнь 100. Имя необходимо задать при инициализации. Имеет метод получения ранений.

// Воин - класс родитель. Изначально жизнь 100. Имя необходимо задать при инициализации. Имеет метод получения ранений.
class Warrior
{
public string Name { set; get; }
public double TimeOfLife { set; get; }

public Warrior(string aName)
{
Name = aName;
TimeOfLife = 100;
}
public virtual void GetLoss(int wound)
{
TimeOfLife = TimeOfLife - wound;
}
}

Воин в тяжёлых доспехах. Наследник класса Warrior. Дополнительно имеет защиту 70. Имеет метод получения ранений. При инициализации задаём имя.

// Воин в тяжёлых доспехах. Наследник класса Warrior. Дополнительно имеет защиту 70. Имеет метод получения ранений. При инициализации задаём имя.
class WarriorHeavyArm : Warrior
{
public int Armor { set; get; }
public WarriorHeavyArm(string aName): base(aName)
{
Name = aName;
Armor = 70;
}
public override void GetLoss (int wound)
{
TimeOfLife = (TimeOfLife + Armor - (wound/2)); // Ущерб делим на 2
}
}

Воин в лёгких доспехах. Наследник класса Warrior. Дополнительно имеет защиту 40. Имеет метод получения ранений. При инициализации задаём имя.

// Воин в лёгких доспехах. Наследник класса Warrior. Дополнительно имеет защиту 40. Имеет метод получения ранений. При инициализации задаём имя.
class WarriorLightArm : Warrior
{
public int Armor { set; get; }
public WarriorLightArm(string aName) : base(aName)
{
Name = aName;
Armor = 40;
}
public override void GetLoss(int wound)
{
TimeOfLife = TimeOfLife + Armor - wound;
}
}

Создадим по одному воину каждого класса, нанесём одинаковые потери и посмотрим оставшуюся жизненную силу

// Создадим по одному воину каждого класса, нанесём одинатовые потери и посмотрим оставшуюся жизненную силу

List<Warrior> band = new List<Warrior>();
band.Add(new Warrior("Simple"));
band.Add(new WarriorHeavyArm("Heavy"));
band.Add(new WarriorLightArm("Middle"));

foreach (Warrior element in band)
{
Console.WriteLine("********** Разделитель *************");
element.GetLoss(10);
Console.WriteLine(element.Name);
Console.WriteLine(element.TimeOfLife);
}



Console.WriteLine("Press any key to exit!");
Console.ReadKey();

bas-tion.ru 01 май 2016 18:45
Не совсем понятен механизм работы List.
Из предыдущих уроков понял что List - это некий способ создавать массивы.
Понятно что List, работая с родительским классом, имеет возможность получать свойства и методы дочерних классов. Если указан virtual и override то метод будет работать корректно.
Если объекты создавать не через List, то нет необходимости добавлять переопределение virtual и override, всё работает корректно.


// Создадим школьника, и посмотрим свойства при отсутствии virtual и override
Pupil Schooler1 = new Pupil("Анатолий", 7, "1-А");
Schooler1.ShowInfo();


Александр Михалев 15 апр 2016 18:17
Сделал но что-то не могу вчехлить как изгнать баг. Если юзер вводит урон меньше 12(6 для легких доспехов) то остаток между 12 и введеным значением прибавляется к ХП. Если вдруг кто знает как это исправить напишите, буду благодарен.

namespace LearningProject
{
class Warriors
{
public int HaveAlife {get; set;}
public int Damage { get; set; }
public int DamageLife { get; set; }
public int AbsorbDamage { get; set; }
public int Absorb { get; set; }
public Warriors(int Life)
{
HaveAlife = Life;
}
public virtual void LifeisWarriors()
{
Console.WriteLine("Количество жизней: " + HaveAlife + "\n");
}
}
class Warrior : Warriors
{

public Warrior (int Life, int damage) : base(Life)
{
Damage = damage;
DamageLife = Life - damage;
}
public override void LifeisWarriors()
{
Console.WriteLine("Обычный воин!\nЖизни: " + HaveAlife + "\n" + "Нанесенный урон: " + Damage + "\n" + "Остаток жизней: " + DamageLife + "\n");
}
}
class WarriorInLight : Warriors
{
public WarriorInLight (int Life, int damage) : base(Life)
{
Damage = damage;
AbsorbDamage = 6;
DamageLife = Life - damage + AbsorbDamage;
}
public override void LifeisWarriors()
{
Console.WriteLine("Воин в легких доспехах!\nЖизни: " + HaveAlife + "\n" + "Нанесенный урон: " + Damage + "\n" + "Остаток жизней : " +
DamageLife + "\n");
}
}
class WarriorInHeavy : Warriors
{
public WarriorInHeavy(int Life, int damage)
: base(Life)
{
Damage = damage;
AbsorbDamage = 12;
DamageLife = Life - damage + AbsorbDamage;
}
public override void LifeisWarriors()
{
Console.WriteLine("Воин в тяжелых доспехах!\nЖизни: " + HaveAlife + "\n" + "Нанесенный урон: " + Damage + "\n" + "Остаток жизней : " +
DamageLife + "\n");
}
}
class Program
{
static void Main(string[] args)
{
int vvod = Convert.ToInt32(Console.ReadLine());
List<Warriors> warriors = new List<Warriors>();
warriors.Add(new Warrior(100, vvod));
warriors.Add(new WarriorInLight(100, vvod));
warriors.Add(new WarriorInHeavy(100, vvod));
foreach (Warriors p in warriors)
p.LifeisWarriors();
Console.ReadKey();
}
}
}

Михаил 08 апр 2016 15:15
Вывод программы:


Воином без доспехов получено 30 урона. Осталось 70 ХП.
Воином в легких доспехах получено 30 урона. Осталось 82 ХП.
Воином в тяжелых доспехах получено 30 урона. Осталось 88 ХП.

Михаил 08 апр 2016 15:14

class Warrior
{
public double DamageCoefficient { get; set; }
public double Health { get; set; }

public Warrior ()
{
this.DamageCoefficient = 1.0;
this.Health = 100.0;
}

public void getDamade (double damage)
{
if (damage < 0)
damage = 0;

if (damage * this.DamageCoefficient >= this.Health) {
this.Health = 0;
} else {
this.Health -= damage * this.DamageCoefficient;
}

this.showDamage (damage);
}

public virtual void showDamage (double damage)
{
Console.WriteLine ("Воином без доспехов получено " + damage + " урона. Осталось " + this.Health + " ХП.");
}
}

class LightWarrior : Warrior
{
public LightWarrior ()
{
this.DamageCoefficient = 0.6;
this.Health = 100;
}

public override void showDamage (double damage)
{
Console.WriteLine ("Воином в легких доспехах получено " + damage + " урона. Осталось " + this.Health + " ХП.");
}
}

class HeavyWarrior : Warrior
{
public HeavyWarrior ()
{
this.DamageCoefficient = 0.4;
this.Health = 100;
}

public override void showDamage (double damage)
{
Console.WriteLine ("Воином в тяжелых доспехах получено " + damage + " урона. Осталось " + this.Health + " ХП.");
}
}

class Example
{
static void Main(string[] args) {

List<Warrior> warriors = new List<Warrior> ();

warriors.Add (new Warrior());
warriors.Add (new LightWarrior());
warriors.Add (new HeavyWarrior());

foreach (Warrior warrior in warriors) {
warrior.getDamade (30.0);
}

}
}

Akhvo 09 мар 2016 10:50
Вводим величину удара, жмем Ent, следим кого труднее убить


class Warrior
{
string name;
double life;
double damage;


double Life //свойство "жизнь"
{
get
{
return life;
}
set
{
if (value < 0)
life = 0;
else if (value > 100)
life = 100;
else life = value;
}
}

double Damage //свойство "урон"
{
get
{
return damage;
}
set
{
if (value < 0)
damage = 0;
else if (value > 10)
damage = 10;
else damage = value;
}
}

public Warrior()
{ name = "Warrior"; Life = 100; }


public virtual void GetDamage(double Damage)
{
Life = Life - Damage * 2;
if (Life == 0)
Console.WriteLine("Войн {0} погиб!", name);
else Console.WriteLine("Войну типа \"{0}\" нанесен удар: {1} единиц, остаток жизни составил: {2} единц", name, Damage, Life);
}


class LightWarrior : Warrior
{
public LightWarrior()
{ name = "LightWarrior"; Life = 100; }

public override void GetDamage(double Damage)
{
Life = Life - Damage * 3;

if (Life == 0)
Console.WriteLine("Войн {0} погиб!", name);
else Console.WriteLine("Войну типа \"{0}\" нанесен удар: {1} единиц, остаток жизни составил: {2} единц", name, Damage, Life);
}
}
class HeavyWarrior : Warrior
{
public HeavyWarrior()
{ name = "HeavyWarrior"; Life = 100; }

public override void GetDamage(double Damage)
{
Life = Life - Damage * 1;
if (Life == 0)
Console.WriteLine("Войн {0} погиб!", name);
else Console.WriteLine("Войну типа \"{0}\" нанесен удар: {1} единиц, остаток жизни составил: {2} единц", name, Damage, Life);
}
}

class Program
{
static void Main(string[] args)
{
List<Warrior> records = new List<Warrior>();
records.Add(new LightWarrior());
records.Add(new Warrior());
records.Add(new HeavyWarrior());

Console.SetWindowSize(90, 50);
Warrior obj_War = new Warrior();
Console.Write("\nВведи величину силы удара от 1 до 10: ");
obj_War.Damage = double.Parse(Console.ReadLine());
Console.WriteLine("Принято значение силы удара: " + obj_War.Damage+ "\n");
while (true)
{
foreach (Warrior war in records)
{
war.GetDamage(obj_War.Damage);
}
Console.WriteLine("Ударить еще?");
Console.ReadLine();
}

}
}
}

voloshyn-i 16 фев 2016 23:36
class Warrior
{
public string Name { get; set; }
public int Life { get; set; }

public Warrior(string name)
{
Name = name;
Life = 3;
}
public virtual int GetDamage(int damage) //объявление виртуального метода
{

if (damage >= 100)
{
--Life;
}

return Life;
}
}
class LightWarrior : Warrior
{
public LightWarrior(string name) : base(name)
{

}

public override int GetDamage(int damage) //объявление виртуального метода
{

if (damage >= 50)
{
--Life;
}

return Life;
}
}
class HardWarrior : Warrior
{
public HardWarrior(string name)
: base(name)
{

}

public override int GetDamage(int damage) //объявление виртуального метода
{

if (damage >= 200)
{
--Life;
}

return Life;
}
}

class Program
{

static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior("Василий"));
warriors.Add(new HardWarrior("Андрей"));
warriors.Add(new LightWarrior("Елена"));
foreach (Warrior p in warriors)
{
Console.WriteLine(p.Name);
}

foreach (Warrior p in warriors)
{
int m = p.Life;
if (p is HardWarrior)
{
Console.WriteLine("HardWarrior " + p.Name + ", количество жизней " + p.Life);
while (m >= 1)
{
Console.WriteLine("Урон: ");
int k = Convert.ToInt32(Console.ReadLine());
m = p.GetDamage(k);
Console.WriteLine("Урон: " + k + "\n" + "Количество жизней: " + m + "\n");
}
Console.WriteLine("Убит!!!\n");
}
else if (p is LightWarrior)
{
Console.WriteLine("LihgtWarrior " + p.Name + ", количество жизней " + p.Life);
while (m >= 1)
{
Console.WriteLine("Урон: ");
int k = Convert.ToInt32(Console.ReadLine());
m = p.GetDamage(k);
Console.WriteLine("Урон: " + k + "\n" + "Количество жизней: " + m + "\n");
}
Console.WriteLine("Убит!!!\n");
}
else
{
Console.WriteLine("Warrior " + p.Name + ", количество жизней " + p.Life);
while (m >= 1)
{
Console.WriteLine("Урон: ");
int k = Convert.ToInt32(Console.ReadLine());
m = p.GetDamage(k);
Console.WriteLine("Урон: " + k + "\n" + "Количество жизней: " + m + "\n");
}
Console.WriteLine("Убит!!!\n");
}

}

Console.ReadKey();
}
}

Игорь 28 янв 2016 10:18
class Warior
{
public string name;
public int current_lifes;

public Warior(string _name, int _count_lifes)
{
name = _name;
current_lifes = _count_lifes;

}

public virtual void takedamage(int damage)
{
current_lifes = current_lifes - damage;
if (current_lifes < 0)
{
current_lifes = 0;
Console.WriteLine("Юнит умер");
}
else
{
Console.WriteLine(current_lifes);
}
}
}
class light_armor : Warior
{
int armor;

public light_armor(string _name, int count_life, int armor)
: base(_name, count_life)
{
this.armor = armor;

}
public override void takedamage(int damage)
{
current_lifes = current_lifes - damage / armor;

if (current_lifes < 0)
{
current_lifes = 0;
Console.WriteLine("Юнит умер");
}
else
{
Console.WriteLine(current_lifes);
}
}

}
class hard_armor : Warior
{
int armor;
public override void takedamage(int damage)
{
current_lifes = current_lifes - damage / (armor * 2);


if (current_lifes < 0)
{
current_lifes = 0;
Console.WriteLine("Юнит умер");
}
else
{
Console.WriteLine(current_lifes);
}
}

public hard_armor(string _name, int count_life,int armor)
: base(_name, count_life)
{
this.armor = armor;
}

}




static void Main(string[] args)
{
List<Warior> imena = new List<Warior>();
imena.Add(new light_armor("Николай", 100,4));
imena.Add(new hard_armor("Алексей", 100,20));
imena.Add(new light_armor("Федор", 100,4));
imena.Add(new hard_armor("Степан", 100,20));
imena.Add(new Warior("Воин",100));
imena.Add(new Warior("Степа", 100));
Console.WriteLine("Введите количество урона, нанесенного юниту");
int damage = Convert.ToInt32(Console.ReadLine());
foreach (Warior erp in imena)
{

erp.takedamage(damage);




}
Console.ReadKey();
}
}
}

vv-ch 11 дек 2015 15:47
Не знаю, зачем это нужно, но я это сделал
Кто не совсем понял, может скомпилировать

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication1
{
class Message
{
private static string[] s = {
/*0*/"Не давай ей жрать слишком много, а то сдохнет. Какая из тебя доярка? (enter)",
/*1*/"Подоить хочешь, а покормить забыл? Не заботишься о буренке, а ей ведь уход нужен! (enter)",
/*2*/"Молодец, покормил хоть, а то все сама да сама. (enter)",
/*3*/"Хорошо все-таки доишь. Вот уедешь в город и кто за тебя доить будет? (enter)",
/*4*/"Не обижай корову - вводи корректные данные: ",
/*5*/"Дай отдохнуть корове, изверг!!! (enter)"
};
public static void Get(int n)
{
Console.Write(s[n]);
}
}
class Cow
{
private const int food = 4, milk = 5;
protected int Fill { get; set;}
public Cow()
{
Fill = 20;
}
protected static bool IsAlive(int arg)
{
return (arg >= 1 && arg <= 36);
}
public virtual void Feed()
{
if (IsAlive(Fill + food))
{
Fill += food;
Message.Get(2);
}
else
{
Message.Get(0);
}
}
public virtual int Milk()
{
if (IsAlive(Fill - milk))
{
Message.Get(3);
Fill -= milk;
return 5;
}
else
{
Message.Get(1);
return 0;
}
}
}
class SUPER_Cow : Cow
{
private const int food = 5, milk = 7;
public SUPER_Cow()
{
Fill = 20;
}
public override void Feed()
{
if (IsAlive(Fill + food))
{
Fill += food;
Message.Get(2);
}
else
{
Message.Get(0);
}
}
public override int Milk()
{
if (IsAlive(Fill - milk))
{
Message.Get(3);
Fill -= milk;
return 7;
}
else
{
Message.Get(1);
return 0;
}
}
}
class Program
{
static void Output(int val)
{
Console.Clear();
Console.WriteLine("У тебя сейчас столько молока: " + val + "\n");
Console.WriteLine("Подоить корову - получить 5 литров (1)");
Console.WriteLine("Покормить корову (2)\n");
Console.WriteLine("Подоить СУПЕР-корову - получить 7 литров (3)");
Console.WriteLine("Покормить СУПЕР-корову (4)\n");
}
static int GetInt(int val)
{
try
{
int n = Convert.ToInt32(Console.ReadLine());
if (n < 1 || n > 4)
{
Output(val);
Message.Get(4);
return GetInt(val);
}
return n;
}
catch (Exception)
{
Output(val);
Message.Get(4);
return GetInt(val);
}
}
static void Main(string[] args)
{
int val = 0;
Cow c1 = new Cow();
SUPER_Cow c2 = new SUPER_Cow();
while (true)
{
Output(val);
int n = GetInt(val);
Random rand = new Random();
int l = rand.Next(100);
if(l%2 == 0){
Message.Get(5);
}
else
{
switch (n)
{
case 1:
val += c1.Milk();
break;
case 2:
c1.Feed();
break;
case 3:
val += c2.Milk();
break;
case 4:
c2.Feed();
break;
}
}
Console.ReadLine();

}
}
}
}


Vitalia 06 окт 2015 00:53

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication10
{
class betmen
{
public int life{get ;set;}
public string name;
public double yr;
public int bronik;
public betmen(string name)
{

this.name = name;
bronik = 0;
life = 100;
}
public double Yr
{
get
{
return yr;
}
set
{
if (value < 0)
yr = 0;
else if (value > 100)
yr = 100;
else
yr = value;
}
}
public virtual double yron()
{
Console.Write("Введіть силу удару по " + name + " = ");
Yr = Convert.ToDouble(Console.ReadLine());
double zalushok;
zalushok = life - Yr;
Console.WriteLine("Залишок життя у " + name + " = " + zalushok);
return zalushok;
}


}
class halk:betmen
{

public halk(string name):base(name)
{
bronik = 30;
life = 100;
}
public override double yron()
{

Console.Write("Введіть силу удару по "+ name + " = ");
Yr = Convert.ToDouble(Console.ReadLine());
double zalushok = 0;
double yr2 = 0;
if (bronik < Yr)
{
yr2 = Yr * 0.7;
}
else if (bronik == Yr)
{
yr2 = Yr * 0.5;
}
else
{
yr2 = Yr * 0.2;
}
zalushok = life - yr2;
Console.WriteLine("Залишок життя у "+name+" = "+ zalushok);
return zalushok;

}



}

class superman:betmen
{
public superman(string name):base(name)
{
bronik = 50;
life = 100;
}
public override double yron()
{

Console.Write("Введіть силу удару по "+ name + " = ");
Yr = Convert.ToDouble(Console.ReadLine());
double zalushok = 0;
double yr2 = 0;
if (bronik < Yr)
{
yr2 = Yr * 0.1;
}
else if (bronik == Yr)
{
yr2 = Yr * 0.7;
}
else
{
yr2 = Yr * 0.9;
}
zalushok = life - yr2;
Console.WriteLine("Залишок життя у "+name+" = "+ zalushok);
return zalushok;

}

}

class Program
{
static void Main(string[] args)
{

betmen bet = new betmen("Загиблик");
betmen bet1 = new betmen("боєц");
halk hal = new halk("Ямакасі");
superman sup = new superman("Папаша");
bet.yron();
bet1.yron();
hal.yron();
sup.yron();


}
}
}


rotkiv 30 сен 2015 21:51
вот в целом рабочий код, вот только изначально хотел в наследственных классов задать только значение урон
к примеру хотел так:

public Woin_Light(int jizni, int uron) : base(jizni)

то-есть чтобы из главного класса бралось только количество жизни а получаемый урон задавать ниже

Woin_Light mediumVoin = new Woin_Light( ,36);

что-то в этом роде хотел но вижуал ругается, как можно осуществить это?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication_ypok20
{
class Woin
{
public int Health { get; set; }
public int Damage { get; set; }
public Woin(int jizni, int uron)
{
Health = jizni;
Damage = uron;
}
public virtual void HealthAfter()
{
int after = Health - Damage;
Console.WriteLine("Woin imeet " + after +" zdorovia");
}
}
class Woin_Light : Woin
{
public Woin_Light(int jizni, int uron) : base(jizni,uron)
{

}
public override void HealthAfter()
{
int after = Health - Damage;
Console.WriteLine("Woin imeet " + after + " zdorovia");
}
}
class Woin_Heave : Woin
{
public Woin_Heave(int jizni, int uron) : base(jizni,uron)
{

}
public override void HealthAfter()
{
int after = Health - Damage;
Console.WriteLine("Woin imeet " + after + " zdorovia");
}
}
class Program
{
static void Main(string[] args)
{
Woin simpleVoin = new Woin(100,63);
Woin_Light mediumVoin = new Woin_Light(100,36);
Woin_Heave heaveVoin = new Woin_Heave(100,16);

simpleVoin.HealthAfter();
mediumVoin.HealthAfter();
heaveVoin.HealthAfter();
Console.ReadKey();
}
}
}


Vitaly409 14 сен 2015 04:29
А с какой целью нужно было создавать в ДЗ всем классам свойство "Количество_жизней", может я что то не так понял? Его можно было создать только в базовом классе?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
class warior
{
public string name { get; set; }
public int HitPoints { get; set; }
public warior(string name, int HitPoints)
{
this.name = name;
this.HitPoints = HitPoints;
}
public virtual void PoluchitUron(int dmg)
{
HitPoints = HitPoints - dmg ;
if (HitPoints > 0)
Console.WriteLine("У воина осталось " + HitPoints + " ХП\n-----------------------");
else Console.WriteLine("Воин погиб без чести");
}
}
class light : warior
{
// public int HitPoints { get; set; }
public light(string name, int HitPoints)
: base(name, HitPoints)
{
this.HitPoints = HitPoints;
}
public override void PoluchitUron(int dmg)
{
HitPoints = HitPoints - Convert.ToInt32(dmg * 0.8);
if (HitPoints > 0)
Console.WriteLine("У воина осталось " + HitPoints + " ХП\n-----------------------");
else Console.WriteLine("Воин погиб с честью");
}
}
class heavy : warior
{
// public int HitPoints { get; set; }
public heavy(string name, int HitPoints)
: base(name, HitPoints)
{
this.HitPoints = HitPoints;
}
public override void PoluchitUron(int dmg)
{
HitPoints = HitPoints - Convert.ToInt32(dmg * 0.5);
if (HitPoints > 0)
Console.WriteLine("У воина осталось " + HitPoints + " ХП\n-----------------------");
else Console.WriteLine("Воин погиб с честью");
}
}

class Program
{
static void Main(string[] args)
{
bool bo=true;
List<warior> boy= new List<warior>();
boy.Add(new light("Виталий", 2000));
boy.Add(new heavy("Василий", 2000));
boy.Add(new warior("Петька", 2000));
while (bo)
{
foreach (warior w in boy)
{
if (w is light)
{
Console.WriteLine("Пред вами легкий воин " + w.name + ", в легких доспехах с '" + ((light)w).HitPoints + "' HP\nВведите сколько по нему нанести:");
(w as light).PoluchitUron(Convert.ToInt32(Console.ReadLine()));
}
else if (w is heavy)
{
Console.WriteLine("Пред вами воин " + w.name + ", в тяжелых доспехах с '" + ((heavy)w).HitPoints + "' HP\nВведите сколько по нему нанести:");
(w as heavy).PoluchitUron(Convert.ToInt32(Console.ReadLine()));
}
else
{
Console.WriteLine("Пред вами Голый:) воин с '" + w.HitPoints + "' HP\nВведите сколько по нему нанести:");
(w as warior).PoluchitUron(Convert.ToInt32(Console.ReadLine()));
}
}
Console.WriteLine("\n\nЕсли хотите выйти, введите цифру: 2");
int j = Convert.ToInt32(Console.ReadLine());
if (j == 2) bo = false;
else Console.Clear();
}
}
}
}

Roma 10 сен 2015 22:13
public class Voin
{
public string Name;
public int Damega=10;
public double Health=100;

public Voin(string name, double health)
{
Name = name;

Health = health;
}

public virtual void Fight()
{

Console.WriteLine("Воин получил урон "+ Name);
Console.ReadKey();

}

}
public class LightVoin:Voin
{
public double LightDeamage;

public LightVoin(string name,double damega,double security) : base(name, damega)
{
LightDeamage = security;


}

public override void Fight()
{
Health = Health - Damega*LightDeamage;
Console.WriteLine("Урон нанес тяжеый воин" + Health);
base.Fight();
}
}

public class HeaveVoun : Voin
{
public double HeavDemage;



public HeaveVoun(string name, double damega, double security) : base(name, damega)
{
HeavDemage = security;


}
public override void Fight()
{
Health = Health - Damega * HeavDemage;
Console.WriteLine("Урон нанес легкий воин" + Health);
base.Fight();
}
}
}

private static void Main(string[] args)
{

LightVoin LigsshtVoin=new LightVoin("Макssс",35,1.2);
HeaveVoun HeaveVounss= new HeaveVoun("Roma",50,1.7);
try
{
while (LigsshtVoin.Health > 0 && HeaveVounss.Health > 0)
{

Console.WriteLine("Heavy Warrior =1 " + "Light warior =2");
int k = Convert.ToInt32(Console.ReadLine());
if (k == 1)
{

LigsshtVoin.Fight();
}
else if (k == 2)
{

HeaveVounss.Fight();

}

else
{

Console.WriteLine("Неверная команда");
}

}
if (LigsshtVoin.Health<=0)
{
Console.WriteLine("Выиграл сильный");
}
else
{

Console.WriteLine("Выиграл легкий");
}
Console.ReadKey();

}
catch ( Exception e)
{
Console.WriteLine("Неверная команда" + e);
}
}

serj 04 сен 2015 13:33
Максим скажите пожалуйста правильно я понял задание

serj 04 сен 2015 13:29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace virtualmethods
{
class Fighter
{
public double life{get;set;}
public string name{get;set;}
public Fighter(double life,string name)
{
this.life=life;
this.name=name;

}
public virtual void GetDamage(double dam=20)

{ life=life-dam;
{
if(life<=0)
Console.WriteLine("Fighter "+name+" is dead");
else
Console.WriteLine("Fighter "+name+" is stil alive");
}
}
}
class LightArmorFighter : Fighter
{
public LightArmorFighter(double life, string name) : base(life, name) { }


public override void GetDamage(double dam )
{
base.GetDamage(dam=10);
}
}

class HeavyArmorFigter : Fighter
{public HeavyArmorFigter(double life, string name) : base(life, name) { }

public override void GetDamage(double dam )
{
base.GetDamage(dam=5);
}

}








class Program
{
static void Main(string[] args)
{
List<Fighter> fighters = new List<Fighter>();
fighters.Add(new Fighter(21,"ion"));
fighters.Add(new LightArmorFighter(10,"john"));
fighters.Add(new HeavyArmorFigter(6,"juan"));

foreach (Fighter fighter in fighters)
fighter.GetDamage();
Console.WriteLine(fighters);




Console.ReadKey();



}
}
}

Максим 01 сен 2015 16:41
yamakasy267
---
Новая строка

yamakasy267 30 авг 2015 00:07
скажите пожалуйста что означает команда \n

ROOT 23 авг 2015 13:02
//Домашнее задание//
Огромное спасибо админу! Очень увлекательно дз. Пока что самое интересное из всех предыдущих. Доставляет огромное удовольствие просматривать код других игроков, с разной реализацией дз у каждого!
Вот моя скромная версия)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Polimorfizm
{
class Warrior
{
protected int HP { get; set; }
public Warrior()
{
HP = 200;
}
public virtual void Damage(int dam)
{
if (dam > 200)
dam = 20;
else if (dam < 0)
dam = 20;
else
HP -= dam;
}
public void GetHP()
{
if (HP <= 0)
Console.Write("Противник убит!");
else
Console.WriteLine("Количество жизней врага равно {0}", HP);
}
}
class Warrior_armorl : Warrior
{
public int Armor { get; set; }
public Warrior_armorl()
{
HP = 200;
Armor = 25;
}
public override void Damage(int dam)
{
base.Damage(dam);
if (Armor > dam)
{
HP = 200;
}
else
HP += Armor;
}

public void GetHp()
{
if (HP <= 0)
Console.Write("Противник убит!");
else
Console.WriteLine("Количество жизней врага равно {0}", HP);
}
}
class Warrior_armorh : Warrior
{
public int Armor { get; set; }
public Warrior_armorh()
{
HP = 200;
Armor = 50;
}
public override void Damage(int dam)
{
base.Damage(dam);
if (Armor > dam)
{
HP = 200;
}
else
HP += Armor;
}
public void GetHp()
{
if (HP <= 0)
Console.Write("Противник убит");
else
Console.WriteLine("Количество жизней врага равно {0}", HP);
}
}
class Program
{
public static void MainMenuGame1()
{
Console.Clear();
Console.WriteLine("Главное меню\n-----------------------------\n1 начать игру\n2 выход");
int selection = Convert.ToInt32(Console.ReadLine());
if (selection == 1)
MainMenuGame2();
else if (selection == 2)
return;
else
{
Error();
MainMenuGame1();
}
Console.ReadLine();
Console.Clear();
}
public static void Error()
{
Console.Clear();
Console.WriteLine("Неверный формат ввода! Попробуйте еще раз!");
Console.ReadKey();
Console.Clear();
}
public static void MainMenuGame2()
{
Console.Clear();
Console.WriteLine("Выберите персонажа против которого хотите сыграть:\n1 воин\n2 воин в лёгких доспехах\n3 воин в тяжёлых доспехах");
int selection = Convert.ToInt32(Console.ReadLine());
if (selection == 1)
Game(1);
else if (selection == 2)
Game(2);
else if (selection == 3)
Game(3);
else
{
Error();
MainMenuGame2();
}
}
public static void Game(int sel)
{
if (sel == 1)
{
Console.Clear();
Warrior new_war = new Warrior();
new_war.GetHP();
Console.Write("Введите урон, который хотите нанести по врагу: ");
int damage = Convert.ToInt32(Console.ReadLine());
new_war.Damage(damage);
new_war.GetHP();
}
else if (sel == 2)
{
Console.Clear();
Warrior_armorl new_war = new Warrior_armorl();
new_war.GetHP();
Console.Write("Введите урон, который хотите нанести по врагу: ");
int damage = Convert.ToInt32(Console.ReadLine());
new_war.Damage(damage);
new_war.GetHP();
}
else if (sel == 3)
{
Console.Clear();
Warrior_armorh new_war = new Warrior_armorh();
new_war.GetHP();
Console.Write("Введите урон, который хотите нанести по врагу: ");
int damage = Convert.ToInt32(Console.ReadLine());
new_war.Damage(damage);
new_war.GetHP();
}
Console.ReadLine();
MainMenuGame1();
}
static void Main(string[] args)
{
MainMenuGame1();
}
}
}

Очень Юра 31 июл 2015 20:27
Спасибо за урок.

class Warrior
{
private string ClassName { get; set; }
private float Health = 100;
private float DamageCoef;

public Warrior()
{
ClassName = "Воин";
DamageCoef = 1;
}
public Warrior(string classname, float damagecoef)
{
this.ClassName = classname;
this.DamageCoef = damagecoef;
}
public virtual void DamageTake(float damage)
{
Health -= damage * DamageCoef;
}
public virtual void ShowUs()
{
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.WriteLine("------------------\nВы: " + ClassName);
Console.WriteLine("Ваше здоровье: {0}", Health);
Console.WriteLine("Коэффициент урона: {0}\n------------------", DamageCoef);
Console.ResetColor();
}
}
class WarriorLightArmor : Warrior
{
public WarriorLightArmor() : base("Воин в легкой броне", 0.8f) { }
/*public override void DamageTake(float damage)
{ base.DamageTake(damage); }*/
}
class WarriorHeavyArmor : Warrior
{
public WarriorHeavyArmor() : base("Воин в тяжелой броне", 0.5f) { }
/*public override void DamageTake(float damage)
{ base.DamageTake(damage); }*/
}

class Program
{
public static void HelperFunc(int k, int damag)
{
if (k == 1)
{
Warrior warrior = new Warrior();
warrior.DamageTake(damag);
warrior.ShowUs();
}
else if (k == 2)
{
WarriorLightArmor warrior1 = new WarriorLightArmor();
warrior1.DamageTake(damag);
warrior1.ShowUs();
}
else if (k == 3)
{
WarriorHeavyArmor warrior2 = new WarriorHeavyArmor();
warrior2.DamageTake(damag);
warrior2.ShowUs();
}
}
static void Main(string[] args)
{
int key;

HelperFunc(1, 0);
do
{
Console.WriteLine("Вы шли и наткнулись на сундук с хабаром, что возьмете?");
Console.Write("1 Ничего\n2 Легкую броню\n3 Тяжелую броню\n> ");
key = Convert.ToInt32(Console.ReadLine());
HelperFunc(key, 0);
Console.WriteLine("Пришел владелец сундука и ударил вас балабасиной на -50");
HelperFunc(key, 50);
}
while (key < 1 && key > 3);
Console.ReadLine();
}
}

AlPer 04 июл 2015 00:02
я знаю много избыточного кода....буду учиться...

AlPer 04 июл 2015 00:01

namespace MyCSharp
{
class Game
{
public Fighter player1;
public Fighter player2;

//метод описывающий выбор воинов и битву
public void StartGame()
{
int getDamage;
Console.Clear();
Console.WriteLine("Выбор бойца №1");
player1 = CreateFighter();
Console.WriteLine("Выбор бойца №2");
player2 = CreateFighter();

while (player1.HitPoint > 0 && player2.HitPoint > 0)
{
getDamage = player2.PutDamage(player1.Strength);
player2.HitPoint = player2.GetDamage(getDamage, player2.HitPoint);
getDamage = player1.PutDamage(player2.Strength);
player1.HitPoint = player1.GetDamage(getDamage, player1.HitPoint);
Console.WriteLine("Состояние бойца №1 после удара");
player1.ShowInfo();
Console.WriteLine("Состояние бойца №2 после удара");
player2.ShowInfo();

Console.ReadLine();
}
Console.Clear();
Console.WriteLine("Бой окончен!");
Console.ReadLine();
}

//метод создания воина
private Fighter CreateFighter()
{
Fighter fighter;

Console.Write("Назовите бойца: ");
string name = Console.ReadLine();

Console.WriteLine("1. Воин без брони\n2. Воин в броне\n3. Воин в тяжелой броне");

switch (Console.ReadLine())
{
case "1":
fighter = new Warrior_0(name);
break;
case "2":
fighter = new Warrior_1(name);
break;
default:
fighter = new Warrior_2(name);
break;
}
return fighter;
}
}

public abstract class Fighter
{
public string Name { get; private set; }
public string Tip { get; private set; }
public int Strength { get; set; }
public bool Life { get; set; }
public int HitPoint { get; set; }

public Fighter(string name, string tip, int hitPoint, int strength)
{
Name = name;
Tip = tip;
HitPoint = hitPoint;
Strength = strength;
}
//показали инфу по воину
public virtual void ShowInfo()
{
Console.WriteLine("Имя бойца: {0}\nТип: {1}\nСила: {2}\tЖивучесть: {3}", Name, Tip, Strength, HitPoint);
Console.WriteLine();
}
//получили урон
abstract public int GetDamage(int getDamage, int hitPoint);
//нанесли урон
abstract public int PutDamage(int strength);
}

class Warrior_0 : Fighter
{
public Warrior_0(string name = "имя должен выбрать игрок")
: base(name, "воин без брони", 200, 50)
{ }

public override int PutDamage(int strength)
{
return (strength - (strength * 0 / 100));
}

override public int GetDamage(int damage, int hitPoint)
{
return hitPoint - damage;
}

public override void ShowInfo()
{
Console.WriteLine("Имя бойца: {0}\nТип: {1}\nСила: {2}\tЖивучесть: {3}\tБроня: {4}", Name, Tip, Strength, HitPoint, 0);
Console.WriteLine();
}
}

class Warrior_1 : Fighter
{
public Warrior_1(string name = "имя должен выбрать игрок")
: base(name, "воин в броне", 200, 50)
{ }

public override int PutDamage(int strength)
{
return (strength - (strength * 10 / 100));
}

override public int GetDamage(int damage, int hitPoint)
{
return hitPoint - damage;
}

public override void ShowInfo()
{
Console.WriteLine("Имя бойца: {0}\nТип: {1}\nСила: {2}\tЖивучесть: {3}\tБроня: {4}", Name, Tip, Strength, HitPoint, 10);
Console.WriteLine();
}
}

class Warrior_2 : Fighter
{
public Warrior_2(string name = "имя должен выбрать игрок")
: base(name, "воин в тяжелой броне", 200, 50)
{ }

public override int PutDamage(int strength)
{
return (strength - (strength * 25 / 100));
}

override public int GetDamage(int damage, int hitPoint)
{
return hitPoint - damage;
}

public override void ShowInfo()
{
Console.WriteLine("Имя бойца: {0}\nТип: {1}\nСила: {2}\tЖивучесть: {3}\tБроня: {4}", Name, Tip, Strength, HitPoint, 25);
Console.WriteLine();
}
}

class Programm
{
//показали правила игры
static void PrintRules()
{
Console.Clear();
Console.WriteLine("ПРАВИЛА ИГРЫ:\n");
new Warrior_0().ShowInfo();
new Warrior_1().ShowInfo();
new Warrior_2().ShowInfo();
Console.WriteLine("Значение брони указано в %. Таким образом если броня = 100, то урон от удара = 0.");
Console.WriteLine("Нажмите любую клавишу");
Console.ReadLine();
}

static void PrintMenu()
{
Console.Clear();
Console.WriteLine("1 - начать игру\n2 - правила\n3 - выход");
string option = Console.ReadLine();
if (option == "1")
{
Game game = new Game();
game.StartGame();
}
if (option == "2")
PrintRules();

if (option == "3")
{
return;
}
PrintMenu(); //рекурсия
}

static void Main()
{
PrintMenu();
}
}
}

Юлия 15 июн 2015 07:16

class Knight
{
public string Name;
public Double life = 100;
public int Attack ;
public Knight(string name, int attack)
{
Name = name; ;
Attack = attack;
}

public virtual void doAttack()
{ life=life-Attack;
Console.WriteLine(Name +" получил урон: "+Attack+" осталось жизней : "+life);
}

}

class HeavyArmorKnight : Knight
{
Double heavyarmor { get; set; }
public HeavyArmorKnight (string name, int attack, Double harmor)
: base(name, attack)
{

heavyarmor = harmor;
}
public override void doAttack()
{
life = life - Attack*heavyarmor;
Console.WriteLine(Name + " получил урон: " + Attack + " осталось жизней : " + life);

}
}
class LightArmorKnight : Knight
{
Double lightarmor { get; set; }
public LightArmorKnight (string name, int attack, Double larmor)
: base(name, attack)
{

lightarmor = larmor;
}
public override void doAttack()
{
life = life - Attack * lightarmor;
Console.WriteLine(Name + " получил урон: " + Attack + " осталось жизней : " + life);

}
}
class Program
{
static void Main(string[] args)
{
List<Knight> knights = new List<Knight>();
knights.Add(new Knight("маг",30));
knights.Add(new HeavyArmorKnight ("танк",40,0.20));
knights.Add(new LightArmorKnight("лучник",50,0.50));
foreach (Knight k in knights)
k.doAttack();

Console.ReadKey();

}
}
}


Flamingo 09 июн 2015 19:04
Спасибо, но поле Health я сделал просто для обозначения количества HP, как говорят в играх, хотя это не обязательно.

Максим 09 июн 2015 09:24
Flamingo
---
Поле Health никак не используется, и что означает поле GetDamage, думаю, достаточно было бы одного из них.

Flamingo 08 июн 2015 01:13
Макс, посмотри, пожалуйста, всё ли правильно в моём коде -->

class Warrior
{
public int Health;
public Warrior(int health)
{
Health = health;
}
public virtual void ShowInfo()
{
Console.WriteLine("Это обычный воин без брони, он получит весь урон");
}
}
class ArmoredWarrior : Warrior
{
public int Armor;
public double GetDamage = 0.3;
public ArmoredWarrior(int health, int armor) : base(health)
{
Armor = armor;
}
public override void ShowInfo()
{
GetDamage *= 50;
Console.WriteLine("Это бронированный воин, он получит " + GetDamage + " урона из 30 возможного");
}
}
class StrongArmoredWarrior : Warrior
{
public int StrongArmor;
public double GetDamage = 0.3;
public StrongArmoredWarrior(int health, int strongarmor) : base(health)
{
StrongArmor = strongarmor;
}
public override void ShowInfo()
{
GetDamage *= 20;
Console.WriteLine("Это тяжело-бронированный воин, он получит " + GetDamage + " урона из 30 возможного");
}
}
class Program
{
static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior(100));
warriors.Add(new ArmoredWarrior(100, 50));
warriors.Add(new StrongArmoredWarrior(100, 80));
foreach(Warrior war in warriors)
{
war.ShowInfo();
}
}
}

Максим 07 июн 2015 13:49
Warguss
---
Ну если нужно было бы получать значение брони, то так нормально, со свойствами, главное что только на чтение

Warguss 06 июн 2015 21:49
Или все же было-бы лучше в классах наследниках сделать приватные поля,
в смысле оптимизаций ?

Warguss 06 июн 2015 21:32
В первом примере ошибка, не правильно реализовал методы


class Warrior
{
public Warrior()
{
Quantityliving = 100;
}

public int Quantityliving { get; set; }

public virtual int GetLosses(int i)
{
Quantityliving -= i;
return Quantityliving;
}

}

// воин в легких доспехах
class WarriorInLightArmour : Warrior
{
public int LightArmor { get; private set; }

public WarriorInLightArmour()
{
LightArmor = 3;
}

public override int GetLosses(int i)
{
Quantityliving -= i - LightArmor;
return Quantityliving;
}
}

// воин в тяжелых доспехах
class WarriorInHardArmour : Warrior
{
public int HeavyArmor { get; private set; }

public WarriorInHardArmour()
{
HeavyArmor = 6;
}

public override int GetLosses(int i)
{
Quantityliving -= i - HeavyArmor;
return Quantityliving;
}
}
class Program
{
static void Main()
{
Warrior warrior1 = new Warrior();
WarriorInLightArmour warrior2 = new WarriorInLightArmour();
WarriorInHardArmour warrior3 = new WarriorInHardArmour();




Console.WriteLine("{0}\n{1}\n{2}", warrior1.GetLosses(10),
warrior2.GetLosses(10),
warrior3.GetLosses(10));

Console.ReadKey();
}
}

Maksim 05 июн 2015 14:53
Вот моя:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
class Warrior
{
public string Name { get; set; }
public int Live { get; set; }

public Warrior(string name, int live)
{
Name = name;
Live = live;
}
public virtual void Damage(int damager)
{
Live -= damager;
if (Live < 1)
{ Console.WriteLine(Name + " убит "); }
else Console.WriteLine(Name + " " + Live);
}

}

class Light : Warrior
{
public string armor { get; set; }
public Light(string name, int live, int armor)
: base(name, live)
{
Live = live + (armor*50);
}
public override void Damage(int damager)
{
base.Damage(damager);

}
}

class Hard : Warrior
{
public string armor { get; set; }
public Hard(string name, int live, int armor)
: base(name, live)
{
Live = live + (armor*100);
}
public override void Damage(int damager)
{
base.Damage(damager);
}
}

class Program
{
static void Main(string[] args)
{
List<Warrior> warrior = new List<Warrior>();
for (int i = 0;i<3;i++)
{
Console.Write("Введите имя война:");
string name = Console.ReadLine();
Console.WriteLine("Введите тип брони:\n\r0\tНет брони.\n\r1\tLight\tдобавляет 50 единиц силы.\n\r2\tHard\tдобавляет 100 единиц силы.");
int armorType = Convert.ToInt32(Console.ReadLine());
if(armorType == 2)
{
Console.WriteLine("Введите количество тяжелой брони:");
int armor = Convert.ToInt32(Console.ReadLine());
warrior.Add(new Hard(name, 100, armor));
}
else if (armorType == 1)
{
Console.WriteLine("Введите количество легкой брони:");
int armor = Convert.ToInt32(Console.ReadLine());
warrior.Add(new Light(name, 100, armor));
}
else
{
warrior.Add(new Warrior(name, 100));
}

}
foreach (Warrior war in warrior)
{
Console.WriteLine(war.Name + "\tсила= " + war.Live);
}
Console.WriteLine("Введите количество урона:");
int damager = Convert.ToInt32(Console.ReadLine());
foreach (Warrior war in warrior)
{
war.Damage(damager);
}
Console.ReadLine();
}
}
}

Ivan 29 май 2015 17:08
Спасибо, Максим.

Максим 28 май 2015 15:55
Ivan
---
С void это уже другой метод, переопределять можно с таким же типом возврата. А скобки нужны, это же обычная реализация метода, хоть тут конкретно тело и пустое

Ivan 28 май 2015 13:35
Не правильно комментарий написал. Не знаю почему, но он требует фигурные скобки и без них не компилируется. Почему так?

Ivan 28 май 2015 13:34
Как-то так. Я оставил комментарий. А насчет void что можете сказать? Почему его нельзя использовать?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
class Warrior
{
public int Health { get; set; }
public int Armor { get; set; }
public int Damage { get; set; }
public Warrior(int health, int armor, int damage)
{
Health = health;
Armor = armor;
Damage = damage;
}
public virtual int GetDamage()
{

do
{
Health = Health + Armor - Damage;
Console.WriteLine(Health);
}
while (Health > 0);
{
return Health;
}
}
}
class WarriorHA : Warrior
{
public WarriorHA(int health, int armor, int damage) : base(health, armor, damage) { }
public override int GetDamage()
{
return base.GetDamage();
}
}
class WarriorLA : WarriorHA
{
public WarriorLA(int health, int armor, int damage):base(health,armor,damage) { } //Понимаю почему, но не требует фигурные скобки, и без них не компилируется. Почему так?
public override int GetDamage()
{
return base.GetDamage();
}
}
class Program
{
static void Main(string[] args)
{
Warrior war = new Warrior(100, 0, 20);
WarriorHA warHA = new WarriorHA(130, 10, 20);
WarriorLA warLA = new WarriorLA(110, 5, 20);
Console.WriteLine(war.GetDamage());
Console.WriteLine(warHA.GetDamage());
Console.WriteLine(warLA.GetDamage());
Console.ReadKey();
}
}
}

Максим 28 май 2015 12:24
Ivan
---
Не нужно в классе наследнике повторно устанавливать поля Health, Armor, Damage, это же делается в базовом конструкторе. А с GetDamage() попробуйте так:

public override int GetDamage()
{
return base.GetDamage();
}

Ivan 28 май 2015 10:36
Все таки я справился с наследственностью, но работает это только через инт. Даже смог передать базовый конструктор метода в наследник, но почему то приходится дописывать оператор return. Можете Объяснить это?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
class Warrior
{
public int Health { get; set; }
public int Armor { get; set; }
public int Damage { get; set; }
public Warrior(int health, int armor, int damage)
{
Health = health;
Armor = armor;
Damage = damage;
}
public virtual int GetDamage()
{

do
{
Health = Health + Armor - Damage;
Console.WriteLine(Health);
}
while (Health > 0);
{
return Health;
}
}
}
class WarriorHA : Warrior
{
public WarriorHA(int health, int armor, int damage) : base(health, armor, damage)
{
Health = health;
Armor = armor;
Damage = Damage;
}
public override int GetDamage()
{
base.GetDamage();
return Health;
}
}
class WarriorLA : WarriorHA
{
public WarriorLA(int health, int armor, int damage) : base(health, armor, damage)
{
Health = health;
Armor = armor;
Damage = damage;
}
public override int GetDamage()
{
base.GetDamage();
return Health;
}
}
class Program
{
static void Main(string[] args)
{
Warrior war = new Warrior(100, 0, 20);
WarriorHA warHA = new WarriorHA(130, 10, 20);
WarriorLA warLA = new WarriorLA(110, 5, 20);
Console.WriteLine(war.GetDamage());
Console.WriteLine(warHA.GetDamage());
Console.WriteLine(warLA.GetDamage());
Console.ReadKey();
}
}
}

Ivan 28 май 2015 10:06
Вот так лучше? И почему когда я объявляю в первом классе хп и броню как поле, которое можно редактировать в конце кода путем добавления цифр в скобках. То в классе наследнике виртуальный метода не воспринимает это поле, также как и класс.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
class Warrior
{
int health = 100;
int armor = 0;
public virtual int GetDamage(int damage)
{
do
{
health = health + armor - damage;
Console.WriteLine(health);
}
while (health > 0);
{
return health;
}
}
}
class WarriorHA : Warrior
{
int health = 130;
int armor = 15;
public override int GetDamage(int damage)
{
do
{
health = health + armor - damage;
Console.WriteLine(health);
}
while (health > 0);
{
return health;
}
}
}
class WarriorLA : WarriorHA
{
int health = 110;
int armor = 10;

public override int GetDamage(int damage)
{
do
{
health = health + armor - damage;
Console.WriteLine(health);
}
while (health > 0);
{
return health;
}
}
}
class Program
{
static void Main(string[] args)
{
Warrior war = new Warrior();
WarriorHA warHA = new WarriorHA();
WarriorLA warLA = new WarriorLA();
Console.WriteLine(war.GetDamage(20));
Console.WriteLine(warHA.GetDamage(20));
Console.WriteLine(warLA.GetDamage(20));
Console.ReadKey();
}
}
}

Максим 22 май 2015 11:14
Ivan
---
ХП и броню следует сделать полями класса, а не локальными переменными методов

Ivan 21 май 2015 09:59
Админ, посмотри пожалуйста код, и скажи где можно исправить, чтобы он лаконичней был.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
class Warrior
{
public virtual int GetDamage(int damage)
{
int health = 100;
do
{
health = health - damage;
Console.WriteLine(health);
}
while (health > 0);
{
return health;
}
}
}
class WarriorHA : Warrior
{
public override int GetDamage(int damage)
{
int health = 130;
int armor = 15;
do
{
health = health + armor - damage;
Console.WriteLine(health);
}
while (health > 0);
{
return health;
}
}
}
class WarriorLA : WarriorHA
{
public override int GetDamage(int damage)
{
int health = 115;
int armor = 10;
do
{
health = health + armor - damage;
Console.WriteLine(health);
}
while (health > 0);
{
return health;
}
}
}
class Program
{
static void Main(string[] args)
{
Warrior war = new Warrior();
WarriorHA warHA = new WarriorHA();
WarriorLA warLA = new WarriorLA();
Console.WriteLine(war.GetDamage(20));
Console.WriteLine(warHA.GetDamage(20));
Console.WriteLine(warLA.GetDamage(20));
Console.ReadKey();
}
}
}



Александр_Бугай 14 май 2015 14:40
Правильно сделал?
class Warrior
{
public virtual void GetDamage(int numberOfArms, double damage, double lifes, byte numberOfDamage)
{
if (numberOfArms == 0)
{
damage = 0.7;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 1)
{
damage = 0.8;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 2)
{
damage = 0.2;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 3)
{
damage = 1;
lifes = lifes - damage * numberOfDamage;
}
Console.WriteLine("Your warrior has only " + lifes);
}
}
class WarriorLight : Warrior
{
public override void GetDamage(int numberOfArms, double damage, double lifes, byte numberOfDamage)
{
if (numberOfArms == 0)
{
damage = 0.9;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 1)
{
damage = 1;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 2)
{
damage = 0.4;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 3)
{
damage = 1;
lifes = lifes - damage * numberOfDamage;
}
Console.WriteLine("Your warrior has only " + lifes);
}
}
class WarriorHeavy : Warrior
{
public override void GetDamage(int numberOfArms, double damage, double lifes, byte numberOfDamage)
{
if (numberOfArms == 0)
{
damage = 0.4;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 1)
{
damage = 0.6;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 2)
{
damage = 0.1;
lifes = lifes - damage * numberOfDamage;
}
if (numberOfArms == 3)
{
damage = 0.9;
lifes = lifes - damage * numberOfDamage;
}
Console.WriteLine("Your warrior has only " + lifes);
}

class Program
{
static void Main(string[] args)
{
WarriorLight myWarriorLight = new WarriorLight();
WarriorHeavy myWarriorHeavy = new WarriorHeavy();
double damage = 0;
byte numberOfDamage;
int numberOfArms;
string[] arms = { "sword", "spear", "arrow", "mace" };
Console.WriteLine("Input warrior. 1 - light warrior. 2 - heavy warrior");
byte choseWarrior = Convert.ToByte(Console.ReadLine());
Console.WriteLine("Input lifes");
byte lifes = Convert.ToByte(Console.ReadLine());
Console.WriteLine("Input arms. 0 - sword, 1 - spear, 2 - arrow, 3 - mace");
numberOfArms = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Input number of damage");
numberOfDamage = Convert.ToByte(Console.ReadLine());
if (choseWarrior == 1)
{
myWarriorLight.GetDamage(numberOfArms, damage, lifes, numberOfDamage);
}
else
{
myWarriorHeavy.GetDamage(numberOfArms, damage, lifes, numberOfDamage);
}
Console.ReadLine();


}
}
}

Максим 07 май 2015 23:55

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
class warrior
{
int health = 100;
internal virtual int GetDamage(int attack)
{
health -= attack;

return health;

}
}
class warriorLA : warrior
{
int health = 100;
internal override int GetDamage(int attack)
{
if(attack > 1)
{
health -= attack + 1;

}
return health;
}
}
class warriorHA : warrior
{
int health = 100;
internal override int GetDamage(int attack)
{
if (attack > 4)
{
health -= attack + 4;

}
return health;
}
}
class Program
{
static void Main(string[] args)
{
warrior warS = new warrior();
warriorLA warL = new warriorLA();
warriorHA warH = new warriorHA();
Console.WriteLine(warS.GetDamage(20));
Console.WriteLine(warL.GetDamage(20));
Console.WriteLine(warH.GetDamage(20));
Console.ReadKey();

}
}
}


Сергей 09 апр 2015 05:04

using System;
using System.Collections.Generic;
using System.Text;

namespace Study
{
class Warrior
{
public int Life { get; set; }
public int Protection { get; protected set; }
public string Name { get; set; }

public Warrior(string name)
{
Life = 100;
Protection = 0;
Name = name;
}

public virtual void getDamage(int dmg)
{
Life = Life - dmg;
Console.WriteLine(Name + " get damage " + dmg.ToString());
}
}

class HeavyWarrior : Warrior
{
public HeavyWarrior(string name)
: base(name)
{
Protection = 10;
}
public override void getDamage(int dmg)
{
if (dmg > 0)
{
Life = Life - (dmg - Protection);
Console.WriteLine(Name + " get damage " + (dmg-Protection).ToString());
}
}
}

class LightWarrior : Warrior
{
public LightWarrior(string name)
: base(name)
{
Protection = 2;
}
public override void getDamage(int dmg)
{
if (dmg > 0)
{
dmg = dmg - Protection;
base.getDamage(dmg);
}
}
}

class Program
{
static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new HeavyWarrior("Halk"));
warriors.Add(new LightWarrior("Batman"));
warriors.Add(new Warrior("Arrow"));

foreach (Warrior warrior in warriors)
{
Console.WriteLine(warrior.Name + "\nHealth=" + warrior.Life + "\nProtection=" + warrior.Protection + "\n\n\n\n");
}
Console.WriteLine("Big BadaBOOOOOM was! All Heroes get damage 50, but...");
foreach (Warrior warrior in warriors)
{
warrior.getDamage(50);
}
Console.WriteLine("\n\n\n\n");
foreach (Warrior warrior in warriors)
{
Console.WriteLine(warrior.Name + "\nHealth=" + warrior.Life + "\nProtection=" + warrior.Protection + "\n\n\n\n");
}

Console.ReadLine();
}
}
}

Хотя всё можно было реализовать проще через Protection: просто для каждого воина установить минимальное значение через set и в базовом классе установить единую формулу вычисления Life = Life - (dmg - Protection). Так по логике вещей даже вернее)) Но для ДЗ сойдёт)

SDenV 20 фев 2015 14:15
Добрый день!
Спасибо за уроки!
С Вашими уроками стало понятнее про наследование и полиформизм.
Ниже решение домашнего задания. Можете, сказать правильно ли я понял задание и материал?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fighters
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Let's start the game");
Random rnd = new Random();
bool choice = false;
bool choice2 = true;
while (!choice)
{
Console.WriteLine("\nYou must choose the warrior." +
"\nIf you want to choose the warrior in a light armor," +
"\ntype \"l\" - light. Else you must type \"h\" - a heavy armor.");
string choose = Console.ReadLine();
switch (choose)
{
case "l":
warriorInLightArmor warriorL = new warriorInLightArmor(50, rnd.Next(0, 10));
Console.WriteLine("\nWarrior was created.");
warriorL.printData();
fight(warriorL);
choice2 = true;
break;
case "h":
warriorInHeavyArmor warriorH = new warriorInHeavyArmor(50, rnd.Next(11, 30));
Console.WriteLine("\nWarrior was created.");
warriorH.printData();
fight(warriorH);
choice2 = true;
break;
default:
choice2 = false;
break;
}
if (!choice2)
Console.WriteLine("\nPlease, choose the warrior!");
else
{
Console.WriteLine("\nReplay the game? yes/no");
if (Console.ReadLine() != "yes")
choice = true;
}
}
Console.WriteLine("To exit the game, press any key.");
Console.Read();
}

static void fight(Fighter warrior)
{
bool choice = false;
Random rnd = new Random();
if (warrior is warriorInLightArmor || warrior is warriorInHeavyArmor)
{
while (!choice&&warrior.HP>0)
{
Console.WriteLine("\nDo you want to fight on the warrior?" + "+ / -");
if (Console.ReadLine() == "+")
{
int damage = rnd.Next(10, 40);
Console.WriteLine("\nYou hit the power of {0} points.", damage);
warrior.HP -= warrior.getDamage(damage);
warrior.printData();
if (warrior.HP <= 0)
{
Console.WriteLine("\nWarrior is dead! You won!");
choice = true;
}
}

else
{
Console.WriteLine("\nWarrior is life!");
warrior.printData();
Console.WriteLine("\nGame Over!");
choice = true;
}
}

}
}
}//Program

abstract class Fighter
{
public int HP
{
get;
set;
}

public Fighter(int HP)
{
this.HP = HP;
}

public virtual int getDamage(int damage)
{
return 0;
}
public virtual void printData()
{
if (HP > 0)
Console.WriteLine("Warrior's data: \nHealth: {0}", HP);
else
{
HP = 0;
Console.WriteLine("Warrior's data: \nHealth: {0}", HP);
}
}
}//abstract class Fighter

class warriorInLightArmor : Fighter
{
int armor;
int factor;
public int Armor
{
get { return armor; }
set
{
if (value >= 0 || value <= 20)
{
armor = value;
}
else if (value < 0)
armor = 0;
else
armor = 20;
}
}
public warriorInLightArmor(int HP, int Armor)
: base(HP)
{
this.Armor = Armor;
}

public override int getDamage(int damage)
{
Random rnd = new Random();
factor = rnd.Next(1, 5);
while (Armor > 0)
{
int temp;
Armor = Armor - damage / factor;
temp = Armor;

if (Armor > 0)
{
return 0;
}
else
{
Armor = 0;
return -temp*factor;
}
}
return damage;
}

public override void printData()
{
base.printData();
Console.WriteLine("Armor: {0}", Armor);
}
}//warriorInLightArmor : Fighter

class warriorInHeavyArmor : Fighter
{
int armor;
int factor;
int rebound;
public int Armor
{
get
{
return armor;
}
set
{
if (value >= 20 || value <= 50)
{
armor = value;
}
else if (value < 20)
armor = 20;
else
armor = 50;
}
}

int Rebound
{
get { return rebound; }
set { rebound = value; }
}

public warriorInHeavyArmor(int HP, int Armor)
: base(HP)
{
this.Armor = Armor;
}

public override int getDamage(int damage)
{
Random rnd = new Random();
factor = rnd.Next(6, 8);
Rebound = rnd.Next(0, 2);
while (Armor > 0)
{
int temp;
Armor = Armor - damage / factor + Rebound;
temp = Armor;

if (Armor > 0)
{
return 0;
}
else
{
Armor = 0;
return -temp * factor;
}
}
return damage;
}

public override void printData()
{
base.printData();
Console.WriteLine("Armor: {0}", Armor);
}
}//warriorInHeavyArmor : Fighter

}


Максим 19 фев 2015 19:53
Виталий
---
Что такое класс arms, оружие? Как тогда Патрон может быть наследником Оружия? Если класс arms это оружие, тогда он должен быть абстрактным, чтобы не было возможности создать оружие непонятно какое, абстрактное.
В классах контретных оружий нет смысла вызывать базовый конструктор, он же и так пустой. Не совсем понимаю наследование Игрока от Воина.

Зачем в метод public override void getlosses(int lifes) передается аргумент lifes, который никак не используется. А это:

warrior warrior1 = new warrior();
superwarrior superwarrior1 = new superwarrior();
miniwarrior miniwarrior1 = new miniwarrior();
player player1 = new player();
AK ak1 = new AK();
SVD svd1 = new SVD();
TT tt1 = new TT();
patrons patron = new patrons();

Сразу создается всё, что только возможно, но если пользователь пойдет по одному пути (выберет ТТ), зачем тогда выделять память под другие оружия, когда это не использует пользователь.

С циклами, условными операторами у вас вижу уже всё хорошо, а вот с ООП нужно поработать.

Спасибо. И Вас с наступающим! И успехов в обучении.

Виталий 19 фев 2015 18:04
На самом деле, да. Я действительно её усложнил. И, если честно, сам понимаю что в ней большая часть программы - ерунда, то, что мы давно проходили. Но уж больно хотелось оторваться от простой домашки. А принципы ООП (на мой непрофессиональный взгляд), реализованы только тут:

class warrior
{
public int lifes;
public int loosewarriors;

public warrior()
{
lifes = 10;
}
public virtual void getlosses(int lifes)
{
lifes--;
}
}
class superwarrior : warrior
{
public superwarrior() : base()
{
lifes = 20;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
}
}
class miniwarrior : warrior
{
public miniwarrior() : base()
{
lifes = 10;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
lifes -= 2;
}
}
class player : warrior
{
public int money = 500;
public player() : base()
{
lifes = 20;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
}
public void getlifes()
{
lifes++;
money -= 10;
}
}
class arms
{
public int price;
public string pricel;

public arms()
{
}
}
class AK : arms
{
public AK() : base()
{
price = 250;
}
}
class SVD : arms
{
public SVD() : base()
{
price = 350;
}
}
class TT : arms
{
public TT() : base()
{
price = 200;
}
}
class patrons : arms
{
public uint kolvo = 10;
public patrons() : base()
{
price = 10;
}
}

С наступающим Вас!

Максим 19 фев 2015 14:15
Виталий
---
Супер крутая домашка это громко сказано. Принципы ООП толком не реализованы, плохая архитектура. Так получилось из-за того, что вы домашнее задание усложнили, и для такой задачи необходимы уже знания уроков после этого. Возможно позже лучше проанализирую эту программу, и укажу что не так, сейчас времени нет.

Виталий 19 фев 2015 09:11
Нашел ошибку, теперь все правильно:

class warrior
{
public int lifes;
public int loosewarriors;

public warrior()
{
lifes = 10;
}
public virtual void getlosses(int lifes)
{
lifes--;
}
}
class superwarrior : warrior
{
public superwarrior() : base()
{
lifes = 20;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
}
}
class miniwarrior : warrior
{
public miniwarrior() : base()
{
lifes = 10;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
lifes -= 2;
}
}
class player : warrior
{
public int money = 500;
public player() : base()
{
lifes = 20;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
}
public void getlifes()
{
lifes++;
money -= 10;
}
}
class arms
{
public int price;
public string pricel;

public arms()
{
}
}
class AK : arms
{
public AK() : base()
{
price = 250;
}
}
class SVD : arms
{
public SVD() : base()
{
price = 350;
}
}
class TT : arms
{
public TT() : base()
{
price = 200;
}
}
class patrons : arms
{
public uint kolvo = 10;
public patrons() : base()
{
price = 10;
}
}
class igra
{
static void Main(string[] args)
{
warrior warrior1 = new warrior();
superwarrior superwarrior1 = new superwarrior();
miniwarrior miniwarrior1 = new miniwarrior();
player player1 = new player();
AK ak1 = new AK();
SVD svd1 = new SVD();
TT tt1 = new TT();
patrons patron = new patrons();
int end = warrior1.loosewarriors + superwarrior1.loosewarriors + miniwarrior1.loosewarriors;
bool magazine = false;
string lager = "____A___";

do
{
Console.WriteLine("У вас \"" + player1.money + "\" монет. И \"" + patron.kolvo + "\" патронов. И \"" + player1.lifes + "\" жизней.Если вы хотите купить \"АК\" или \"СВД\" или \"Пистолет ТТ\" введите соответствующее значение в поле. Что бы купить патроны введите \"Патроны\". Чтобы купить аптечку (восстанавливает жизни) введите \"Аптечка\".");
Console.WriteLine("Стоимость: АК - \"" + ak1.price + "\" монет. СВД - \"" + svd1.price + "\" монет. Пистолет ТТ - \"" + tt1.price + "\" монет. Патроны - \"" + patron.price + "\" монет. Аптечка - \"10\" монет.");
string pult = Console.ReadLine();
if (pult == "АК")
{
player1.money -= ak1.price;
do
{
Console.WriteLine("Наведите прицел на палатку противника кнопкой \"Пробел\". Не забудьте поставить мушку (v). Для того что бы попасть в магазин, введите \"В магазин\". Учтите! Иди в магазин, вы теряете свое оружие. Вы убили воинов \"" + warrior1.loosewarriors + "\". Количество жизней у текущего воина: \"" + warrior1.lifes + "\". Количество жизней у вас: \"" + player1.lifes + "\".");
Console.WriteLine(lager);
pult = Console.ReadLine();
if (pult == "В магазин")
magazine = true;
if (pult == " v")
{
warrior1.lifes--;
if (warrior1.lifes == 0)
{
warrior1.lifes = 10;
player1.money += 300;
warrior1.loosewarriors++;
}
}
switch (warrior1.lifes)
{
case 8:
player1.lifes--;
break;
case 6:
player1.lifes--;
break;
case 4:
player1.lifes--;
break;
case 2:
player1.lifes--;
break;
}
}
while (!magazine);
}
if (pult == "СВД")
{
do
{
player1.money -= svd1.price;
Console.WriteLine("Наведите оружие на палатку противника кнопкой \"Пробел\". Не забудьте поставить прицел (О). Для того что бы попасть в магазин, введите \"В магазин\". Учтите! Иди в магазин, вы теряете свое оружие. Вы убили воинов \"" + superwarrior1.loosewarriors + "\". Количество жизней у текущего воина: \"" + superwarrior1.lifes + "\". Количество жизней у вас: \"" + player1.lifes + "\".");
Console.WriteLine(lager);
pult = Console.ReadLine();
if (pult == "В магазин")
magazine = true;
if (pult == " О")
{
superwarrior1.lifes--;
if (superwarrior1.lifes == 0)
{
superwarrior1.lifes = 10;
player1.money += 400;
superwarrior1.loosewarriors++;
}
}
switch (superwarrior1.lifes)
{
case 18:
player1.lifes--;
break;
case 16:
player1.lifes--;
break;
case 14:
player1.lifes--;
break;
case 12:
player1.lifes--;
break;
case 10:
player1.lifes--;
break;
case 8:
player1.lifes--;
break;
case 6:
player1.lifes--;
break;
case 4:
player1.lifes--;
break;
case 2:
player1.lifes--;
break;
}
}
while (!magazine);
}
if (pult == "Пистолет ТТ")
{
do
{
player1.money -= tt1.price;
Console.WriteLine("Наведите оружие на палатку противника кнопкой \"Пробел\". Для того что бы попасть в магазин, введите \"В магазин\". Учтите! Иди в магазин, вы теряете свое оружие. Вы убили воинов \"" + superwarrior1.loosewarriors + "\". Количество жизней у текущего воина: \"" + superwarrior1.lifes + "\". Количество жизней у вас: \"" + player1.lifes + "\".");
Console.WriteLine(lager);
pult = Console.ReadLine();
if (pult == "В магазин")
magazine = true;
if (pult == " ")
{
superwarrior1.lifes--;
if (miniwarrior1.lifes == 0)
{
miniwarrior1.lifes = 20;
player1.money += 300;
miniwarrior1.loosewarriors++;
}
}
switch (miniwarrior1.lifes)
{
case 3:
player1.lifes--;
break;
case 1:
player1.lifes--;
break;
}
}
while (!magazine);
}
if (pult == "Патроны")
{
player1.money -= patron.price;
patron.kolvo++;
}
if (pult == "Аптечка")
player1.getlifes();
}
while (end < 20);
}
}

Виталий 18 фев 2015 21:45
Только не пойму, почему при стрельбе из СВД, он уводит в магазин.

Виталий 18 фев 2015 21:34
Уфф... Ну и трудно же мне далась эта домашка. Но я её сделал! Более того, сделал супер - крутой! Вот собственно, и она:

class warrior
{
public int lifes;
public int loosewarriors;

public warrior()
{
lifes = 10;
}
public virtual void getlosses(int lifes)
{
lifes--;
}
}
class superwarrior : warrior
{
public superwarrior() : base()
{
lifes = 20;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
}
}
class miniwarrior : warrior
{
public miniwarrior() : base()
{
lifes = 10;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
lifes -= 2;
}
}
class player : warrior
{
public int money = 500;
public player() : base()
{
lifes = 20;
}
public override void getlosses(int lifes)
{
base.getlosses(lifes);
}
public void getlifes()
{
lifes++;
money -= 10;
}
}
class arms
{
public int price;
public string pricel;

public arms()
{
}
}
class AK : arms
{
public AK() : base()
{
price = 250;
}
}
class SVD : arms
{
public SVD() : base()
{
price = 350;
}
}
class TT : arms
{
public TT() : base()
{
price = 200;
}
}
class patrons : arms
{
public uint kolvo = 10;
public patrons() : base()
{
price = 10;
}
}
class igra
{
static void Main(string[] args)
{
warrior warrior1 = new warrior();
superwarrior superwarrior1 = new superwarrior();
miniwarrior miniwarrior1 = new miniwarrior();
player player1 = new player();
AK ak1 = new AK();
SVD svd1 = new SVD();
TT tt1 = new TT();
patrons patron = new patrons();
int end = warrior1.loosewarriors + superwarrior1.loosewarriors + miniwarrior1.loosewarriors;
bool magazine = false;
string lager = "____A___";

do
{
Console.WriteLine("У вас \"" + player1.money + "\" монет. И \"" + patron.kolvo + "\" патронов. И \"" + player1.lifes + "\" жизней.Если вы хотите купить \"АК\" или \"СВД\" или \"Пистолет ТТ\" введите соответствующее значение в поле. Что бы купить патроны введите \"Патроны\". Чтобы купить аптечку (восстанавливает жизни) введите \"Аптечка\".");
Console.WriteLine("Стоимость: АК - \"" + ak1.price + "\" монет. СВД - \"" + svd1.price + "\" монет. Пистолет ТТ - \"" + tt1.price + "\" монет. Патроны - \"" + patron.price + "\" монет. Аптечка - \"10\" монет.");
string pult = Console.ReadLine();
if (pult == "АК")
{
player1.money -= ak1.price;
do
{
Console.WriteLine("Наведите прицел на палатку противника кнопкой \"Пробел\". Не забудьте поставить мушку (v). Для того что бы попасть в магазин, введите \"В магазин\". Учтите! Иди в магазин, вы теряете свое оружие. Вы убили воинов \"" + warrior1.loosewarriors + "\". Количество жизней у текущего воина: \"" + warrior1.lifes + "\". Количество жизней у вас: \"" + player1.lifes + "\".");
Console.WriteLine(lager);
pult = Console.ReadLine();
if (pult == "В магазин")
magazine = true;
if (pult == " v")
{
warrior1.lifes--;
if (warrior1.lifes == 0)
{
warrior1.lifes = 10;
player1.money += 300;
warrior1.loosewarriors++;
}
}
switch (warrior1.lifes)
{
case 8:
player1.lifes--;
break;
case 6:
player1.lifes--;
break;
case 4:
player1.lifes--;
break;
case 2:
player1.lifes--;
break;
}
}
while (!magazine);
}
if (pult == "СВД")
{
do
{
player1.money -= svd1.price;
Console.WriteLine("Наведите оружие на палатку противника кнопкой \"Пробел\". Не забудьте поставить прицел (О). Для того что бы попасть в магазин, введите \"В магазин\". Учтите! Иди в магазин, вы теряете свое оружие. Вы убили воинов \"" + superwarrior1.loosewarriors + "\". Количество жизней у текущего воина: \"" + superwarrior1.lifes + "\". Количество жизней у вас: \"" + player1.lifes + "\".");
Console.WriteLine(lager);
pult = Console.ReadLine();
if (pult == "В магазин")
magazine = true;
if (pult == " О")
{
superwarrior1.lifes--;
if (superwarrior1.lifes == 0)
{
superwarrior1.lifes = 10;
player1.money += 400;
superwarrior1.loosewarriors++;
}
}
switch (superwarrior1.lifes)
{
case 18:
player1.lifes--;
break;
case 16:
player1.lifes--;
break;
case 14:
player1.lifes--;
break;
case 12:
player1.lifes--;
break;
case 10:
player1.lifes--;
break;
case 8:
player1.lifes--;
break;
case 6:
player1.lifes--;
break;
case 4:
player1.lifes--;
break;
case 2:
player1.lifes--;
break;
}
}
while (end == 20);
}
if (pult == "Пистолет ТТ")
{
do
{
player1.money -= tt1.price;
Console.WriteLine("Наведите оружие на палатку противника кнопкой \"Пробел\". Для того что бы попасть в магазин, введите \"В магазин\". Учтите! Иди в магазин, вы теряете свое оружие. Вы убили воинов \"" + superwarrior1.loosewarriors + "\". Количество жизней у текущего воина: \"" + superwarrior1.lifes + "\". Количество жизней у вас: \"" + player1.lifes + "\".");
Console.WriteLine(lager);
pult = Console.ReadLine();
if (pult == "В магазин")
magazine = true;
if (pult == " ")
{
superwarrior1.lifes--;
if (miniwarrior1.lifes == 0)
{
miniwarrior1.lifes = 20;
player1.money += 300;
miniwarrior1.loosewarriors++;
}
}
switch (miniwarrior1.lifes)
{
case 3:
player1.lifes--;
break;
case 1:
player1.lifes--;
break;
}
}
while (end == 20);
}
if (pult == "Патроны")
{
player1.money -= patron.price;
patron.kolvo++;
}
if (pult == "Аптечка")
player1.getlifes();
}
while (end < 20);
}
}

PS: админ, извините за длину кода.

Oper 13 фев 2015 14:32
Согласно ТЗ без лишнего:
using System;
using System.Collections.Generic;

namespace L20
{
class Warrior
{
public double Health { get; set; }
public Warrior(double Health = 100)
{
this.Health = Health;
}
public virtual void GetDamage(double damage)
{
double finalDamage = damage;
Health = (Health > finalDamage) ? Health - finalDamage : 0;
Console.WriteLine("Обычному воину было нанесено {0} урона", damage);
Console.WriteLine("Здоровье: {0}hp\n", Health);
}
}

class WarriorInLightArmor : Warrior
{
public override void GetDamage(double damage)
{
double finalDamage = 0.89 * damage;
Health = (Health > finalDamage) ? Health - finalDamage : 0;
Console.WriteLine("Воину в легких доспехах был нанес урон {0},\nпри этом его броня поглатила {1} урона.", damage, damage - finalDamage);
Console.WriteLine("Итоговый урон: {0}", finalDamage);
Console.WriteLine("Здоровье: {0}hp\n", Health);
}
}

class WarriorInHeavytArmor : Warrior
{
public override void GetDamage(double damage)
{
double finalDamage = 0.71 * damage;
Health = (Health > finalDamage) ? Health - finalDamage : 0;
Console.WriteLine("Воину в тяжелых доспехах был нанес урон {0},\nпри этом его броня поглатила {1} урона.", damage, damage - finalDamage);
Console.WriteLine("Итоговый урон: {0}", finalDamage);
Console.WriteLine("Здоровье: {0}hp\n", Health);
}
}

class Program
{
static void Main(string[] args)
{
List<Warrior> Army = new List<Warrior>();
Army.Add(new Warrior());
Army.Add(new WarriorInLightArmor());
Army.Add(new WarriorInHeavytArmor());

foreach (Warrior w in Army) w.GetDamage(19.3);

Console.ReadKey();
}
}
}

Виталий 13 фев 2015 10:08
-- admin --
Спасибо большое! Сегодня сделаю на основе этой домашки нормальную. Вчера просто не хватило времени сделать все по-нормальному.

Максим 13 фев 2015 09:44
Виталий
---
Если вы хотели вычесть там 2, то это делается так:

lifes -= 2;

Но плохо то, что вы объявили в наследниках поле lifes, которое у них уже имеется, благодаря наследованию от warrior. Значение lifes в наследниках устанавливайте в конструкторе.

Виталий 12 фев 2015 12:32
Вот, моя домашка. Хотел бы понять почему у меня на

lifes-2;

пишет что "В качестве оператора могут использоваться только выражения...".

class warrior
{
public string end;
public int lifes = 10;

public virtual void getlosses(int lifes)
{
lifes--;
if (lifes == 0)
end = "Воин погиб";
}
}
class miniwarrior : warrior
{
public int lifes = 10;
public override void getlosses(int lifes)
{
base.getlosses(lifes);
lifes - 2;
}
}
class superwarrior : warrior
{
public int lifes = 20;
public override void getlosses(int lifes)
{
base.getlosses(lifes);
lifes--;
}
}

AlexWolf 03 фев 2015 15:05
Да, так намного лучше! Все понял. Большое спасибо.

Максим 03 фев 2015 12:25
AlexWolf
---
1. Да, можно было использовать общий коэффициент брони, задание не идеальное, предполагается что формулы урона будут более существенно отличаться, а не лишь коэффициентом.
2. Можно указывать позицию курсора в консоле, ваш код стоит переделать так:

Console.Clear();
do
{
Console.SetCursorPosition(0, 0); // курсор в начало, новый вывод перепишет старые данные
vanstar.DMGperMIN();
vanstar.Time++;
vanstar.Info();
}


3. Имя не обязательно указывать. В объекте исключения хранится различная информация о нем, например ex.Message - сообщение исключения.

ПС. Код вставляйте в теге, используя кнопку внизу окна комментария

AlexWolf 02 фев 2015 14:44
Здравствуйте Admin. Сразу прошу прощения за столь жирный код - увлекся немного. Задание интересное. Попробовал реализовать его по-своему. Переопределение методов использовал, но... тут есть несколько вопросов:
1-Пока писал код, постоянно напоминал себе, что нужно использовать виртуальные методы, хотя мне казалось, что и без них, можно было легко обойтись, используя общий коэффициент брони, меняя его непосредственно при создании объекта.
2-Во время подсчета, изображение строк мелькает из за постоянного обновления Consol.clear(); Как сделать, чтобы строки оставались на месте, а мелькали только показатели прочности и времени? А то глаз раздражает такое мелькание.
3-И вопрос не совсем по теме. Зачем исключению присваивать имя после указания типа исключения? Как потом это имя можно использовать?
А вот собственно и код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Simulator
{
class Simulation
{
public double Life {get; set; }
public double RDmg { get; set; }
public int Time { get; set; }
public string Name { get; set; }
public Simulation(double life, double rdmg, int time, string name)
{
Life = life;
RDmg = rdmg;
Time = time;
Name = name;
}
public virtual void Info()
{
Console.WriteLine("Модель скафандра: " + Name);
Console.WriteLine("Прочность скафандра:" + Life);
}
public virtual void DMGperMIN()
{
Life = Life-RDmg;
}
}
class Skafandr1 : Simulation
{
public Skafandr1(double life, double rdmg, int time, string name) : base(life, rdmg, time, name)
{}
public override void DMGperMIN()
{
base.DMGperMIN();
}
public override void Info()
{
base.Info();
Console.WriteLine("Защита от радиации: нет.");
Console.WriteLine("Срок службы скафандра: " + Time + " минут.");
}
}
class Skafandr2 : Simulation
{
public Skafandr2(double life, double rdmg, int time, string name) : base(life, rdmg, time, name)
{}
public override void DMGperMIN()
{
Life = Life-(RDmg-0.3);
}
public override void Info()
{
base.Info();
Console.WriteLine("Защита от радиации: слабая");
}
}
class Skafandr3 : Simulation
{
public Skafandr3(double life, double rdmg, int time, string name) : base(life, rdmg, time, name)
{}
public override void DMGperMIN()
{
Life = Life - (RDmg - 0.6);
}
public override void Info()
{
base.Info();
Console.WriteLine("Защита от радиации: средняя");
}
}

class Skafandr4 : Simulation
{
public Skafandr4(double life, double rdmg, int time, string name) : base(life, rdmg, time, name)
{}
public override void DMGperMIN()
{
Life = Life - (RDmg - 0.8);
}
public override void Info()
{
base.Info();
Console.WriteLine("Защита от радиации: высокая");
}
}



class Program
{
static void Main(string[] args)
{
Skafandr1 vanstar = new Skafandr1(10000, 1, 0, "(Ванстар)");
Skafandr2 silion = new Skafandr2(10000, 1, 0, "(Силион-Л)");
Skafandr3 voyadger = new Skafandr3(10000, 1, 0, "(Вояджер-М)");
Skafandr4 monolith = new Skafandr4(10000, 1, 0, "(Монолит-Н)");
Console.WriteLine("Вас приветствует программа для испытания индивидуальных"+"/n"+"скафандров в агрессивной среде."+"\n"+"Нажмите любую кнопку чтобы продолжить."+"\n"+"Или нажмите Esc для выхода.");
if (Console.ReadKey(true).Key != ConsoleKey.Escape)
{
do
{
Console.Clear();
Console.WriteLine("Выберите испытуемый скафандр.");
Console.WriteLine("1-Ванстар - Легкий прогулочный скафандр, не имеющий никакой защиты.");
Console.WriteLine("2-Силион - Легкий скафандр с минимальной защитой, предназначенный для ремонта модулей в космосе.");
Console.WriteLine("3-Вояджер - Средний исследовательский скафандр со стандартной защитой.");
Console.WriteLine("4-Монолит - Тяжелый штурмовой скафандр с максимальным уровнем защиты.");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
Console.WriteLine("Введите уровень радиации от 1.0 до 5");
try
{ vanstar.RDmg = Convert.ToDouble(Console.ReadLine()); }
catch (FormatException)
{ Console.WriteLine("ОШИБКА!! Вы ввели не число!"); break; }
Console.WriteLine("Для запуска симуляции нажмите любую клавишу.");
Console.ReadKey();
do
{
Console.Clear();
vanstar.DMGperMIN();
vanstar.Time++;
vanstar.Info();
}
while (vanstar.Life >= 1);
Console.WriteLine("РЕЗУЛЬТАТ ТЕСТА:" + "\n" + "Скафандр будет защищать астранавта от радиации " + vanstar.RDmg + " уровня в течении " + vanstar.Time / 60 + " часов.");
break;
case ConsoleKey.D2:
Console.WriteLine("Введите уровень радиации от 1.0 до 5.0");
try
{ silion.RDmg = Convert.ToDouble(Console.ReadLine()); }
catch (FormatException)
{ Console.WriteLine("ОШИБКА!! Вы ввели не число!"); break; }
Console.WriteLine("Для запуска симуляции нажмите любую клавишу.");
Console.ReadKey();
do
{
Console.Clear();
silion.DMGperMIN();
silion.Time++;
silion.Info();
}
while (silion.Life >= 1);
Console.WriteLine();
Console.WriteLine("РЕЗУЛЬТАТ ТЕСТА:" + "\n" + "Скафандр будет защищать астранавта от радиации " + silion.RDmg + " уровня в течении " + silion.Time / 60 + " часов.");
break;
case ConsoleKey.D3:
Console.WriteLine("Введите уровень радиации от 1.0 до 5.0");
try
{ voyadger.RDmg = Convert.ToDouble(Console.ReadLine()); }
catch (FormatException)
{ Console.WriteLine("ОШИБКА!! Вы ввели не число!"); break; }
Console.WriteLine("Для запуска симуляции нажмите любую клавишу.");
Console.ReadKey();
do
{
Console.Clear();
voyadger.DMGperMIN();
voyadger.Time++;
voyadger.Info();
}
while (voyadger.Life >= 1);
Console.WriteLine();
Console.WriteLine("РЕЗУЛЬТАТ ТЕСТА:" + "\n" + "Скафандр будет защищать астранавта от радиации " + voyadger.RDmg + " уровня в течении " + voyadger.Time / 60 + " часов.");
break;
case ConsoleKey.D4:
Console.WriteLine("Введите уровень радиации от 1.0 до 5.0");
try
{ monolith.RDmg = Convert.ToDouble(Console.ReadLine()); }
catch (FormatException)
{ Console.WriteLine("ОШИБКА!! Вы ввели не число!"); break; }
Console.WriteLine("Для запуска симуляции нажмите любую клавишу.");
Console.ReadKey();
do
{
Console.Clear();
monolith.DMGperMIN();
monolith.Time++;
monolith.Info();
}
while (monolith.Life >= 1);
Console.WriteLine();
Console.WriteLine("РЕЗУЛЬТАТ ТЕСТА:" + "\n" + "Скафандр будет защищать астранавта от радиации " + monolith.RDmg + " уровня в течении " + monolith.Time / 60 + "часов.");
break;
default:
Console.WriteLine("Нет такого скафандра! Введите номер из списка.");
break;
}
}
while (Convert.ToBoolean(Console.ReadKey(true).Key != ConsoleKey.Escape));
}
}
}
}


Макс 17 дек 2014 16:49
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Hero
{
class Warrior
{
public int hp, defence;

public int HP
{
get
{
return hp;
}
set
{
hp = value;
}
}

public Warrior()
{
HP = 100;
defence = 50;
}

public virtual void TakeDamage(int dmg)
{
double damage = (((dmg + (0.00)) / (defence + (0.00)) * 100));
HP = HP - (int)damage;
if (HP < 0)
{
HP = 0;
}
}

public virtual void ShowInfo()
{
Console.WriteLine("Воин имеет {0} HP и {1} защиты", HP, defence);
}
}

class LightArmor : Warrior
{
public LightArmor()
{
HP = 100;
defence = defence + 100;
}

public override void ShowInfo()
{
Console.WriteLine("Воин в лёгких доспехах имеет {0} HP и {1} защиты", HP, defence);
}

public override void TakeDamage(int dmg)
{
double damage = (((dmg + (0.00)) / (defence + (0.00))) * 60);
HP = HP - (int)damage;
if (HP < 0)
{
HP = 0;
}
}
}

class HeavyArmor : Warrior
{
public HeavyArmor()
{
defence = defence + 200;
}

public override void ShowInfo()
{
Console.WriteLine("Воин в тяжелых доспехах имеет {0} HP и {1} защиты", HP, defence);
}

public override void TakeDamage(int dmg)
{
double damage = (((dmg + (0.00)) / (defence + (0.00))) * 30);
HP = HP - (int)damage;
if (HP < 0)
{
HP = 0;
}
}
}

class Program
{
static void Main(string[] args)
{
Warrior war = new Warrior();
HeavyArmor haw = new HeavyArmor();
LightArmor law = new LightArmor();

war.ShowInfo();
haw.ShowInfo();
law.ShowInfo();

Console.WriteLine("\nВсе войны получают урон равный 100 единицам.\n");

// Воин без доспехов
war.TakeDamage(100);
war.ShowInfo();
// Воин в тяжелых доспехах
haw.TakeDamage(100);
haw.ShowInfo();
// Воин в лёгких доспехах
law.TakeDamage(100);
law.ShowInfo();

Console.ReadKey();
}
}
}

immortal 11 дек 2014 17:22
Admin, Огромное спасибо за ответ... Все понял. Пошел исправлю, проверю, учту!!

Максим 08 дек 2014 19:10
immortal
---
Программа отличается о той что была в задании, и есть много недочетов:

1. while (b == true) // не нужно сравнивать булевые значения с true или false, достаточно:

while (b) для true и while (!b) для false

2. Метод getDamage() по здравой логике должен получать аргументом количество урона, а не делать это через статическое поле hpDamage

3. Нет смысла так переопределять методы Name, getDamage и ifDead (вызывать там лишь базовый метод), весь код связанный с ними в классах Kaidzu2kat и Kaidzu3kat можно убрать и ничего не изменится

4. Не нужно еще раз инициализировать те же поля класса в конструкторах, когда происходит вызов базового конструктора для тех же полей:

public Kaidzu3kat(double health, string name, int percentFromDmg)
: base(health, name, percentFromDmg)
{
this.health = health; // это
this.name = name; // всё
this.percentFromDmg = percentFromDmg; // не нужно
}

5. В итоге получается что у вас все объекты типа Kaidzu1kat, и остальные два класса не нужны. Посмотрите в комментариях как делали задание другие

Zanzil 08 дек 2014 18:04
Admin, спасибо за уроки. Вот как реализовал это задание. Хотелось бы услышать критику, если возможно.

namespace ConsoleApplication1
{
class Fighter
{
public string name { get; set; }
public int hp;

public Fighter (string name, int HP)
{
this.name=name;
if (HP > 0)
{
hp = HP;
}
else
{
hp = 1;
}
}

public virtual int TakeDamage(int damage)
{
hp = hp - damage;
return hp;
}
}
class Fighter_Light_Armor : Fighter
{
public Fighter_Light_Armor(string name,int hp) : base(name,hp)
{}

public override int TakeDamage(int damage)
{
hp = hp - damage * 3 / 4;
return hp;
}
}
class Fighter_Heavy_Armor : Fighter
{
public Fighter_Heavy_Armor(string name,int hp) : base(name,hp)
{}

public override int TakeDamage(int damage)
{
hp = hp - damage / 2;
return hp;
}
}
class Program
{
static void Main(string[] args)
{
List <Fighter> fighters = new List<Fighter>();
Console.WriteLine("What's your noble warrior's name?");
string name = Console.ReadLine();
Console.WriteLine("How many hit point do he have?");
int hp = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Which tipe of warrior do you want? (1 - no armor, 2 - light armor, 3 - heavy armor)");
switch (Console.ReadLine())
{
case "1":
fighters.Add(new Fighter(name,hp));
break;
case "2":
fighters.Add(new Fighter_Light_Armor(name,hp));
break;
case "3":
fighters.Add(new Fighter_Heavy_Armor(name,hp));
break;
default:
Console.WriteLine("It looks like you are trying to cheat!");
break;
}
Console.WriteLine("Your warrior's name " + fighters[0].name + ". He haves " + fighters[0].hp + " hit points.\r\nHow much damage he takes?");
while (fighters[0].hp > 0)
{
Console.WriteLine("Now he haves " + fighters[0].TakeDamage(Convert.ToInt32(Console.ReadLine())) + " hit points.");
if (fighters[0].hp < 1)
{
break;
}
Console.WriteLine("How much damage he takes?");
}
Console.WriteLine("Your warrior is dead. Rest in pease noble " + fighters[0].name + ".");
Console.ReadKey();
}
}
}

immortal 07 дек 2014 05:27
Спасибо!! вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace ConsoleApplication7
{
class Kaidzu1kat
{
public double health { get; set; }
public string name { get; set; }
public static int hpDamage = 0;
public int percentFromDmg { get; set; }

public Kaidzu1kat(double health, string name, int percentFromDmg)
{
this.health = health;
this.name = name;
this.percentFromDmg = percentFromDmg;
}
public virtual void Name()
{
begin:
{
name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name)) { Console.WriteLine("Имя не может быть пустым! Введите еще раз:");
goto begin;
}
}
}
public virtual void getDamage()
{
double damage = hpDamage * percentFromDmg / 100;
health = health - damage;
}
public virtual void ifDead()
{
if (health <= 0)
{
health = 0; Console.WriteLine("Здоровье кайдзю " + name + " " + health + " УБИТО");
}
else
{
Console.WriteLine("Здоровье кайдзю " + name + " " + health);
}
}
}
class Kaidzu2kat : Kaidzu1kat
{
public Kaidzu2kat(double health, string name, int percentFromDmg)
: base(health, name, percentFromDmg)
{
this.health = health;
this.name = name;
this.percentFromDmg = percentFromDmg;
}
public override void Name()
{
base.Name();
}
public override void getDamage()
{
base.getDamage();
}
public override void ifDead()
{
base.ifDead();
}
}
class Kaidzu3kat : Kaidzu1kat
{
public Kaidzu3kat(double health, string name, int percentFromDmg)
: base(health, name, percentFromDmg)
{
this.health = health;
this.name = name;
this.percentFromDmg = percentFromDmg;
}
public override void Name()
{
base.Name();
}
public override void getDamage()
{
base.getDamage();
}
public override void ifDead()
{
base.ifDead();
}
}
class Program
{
static void Main(string[] args)
{
Kaidzu1kat kaidzu1 = new Kaidzu1kat(100, "kaidzu1", 35);
Kaidzu2kat kaidzu2 = new Kaidzu2kat(100, "kaidzu2", 30);
Kaidzu3kat kaidzu3 = new Kaidzu3kat(100, "kaidzu3", 20);
string[] egers = { "Бродяга", "Страйкер", "Богровый Тайфун", "Черный Альфа" };
Console.WriteLine("\r\n Введите поочередно имена актеров (кодовые названия 3х кайдзю)");
kaidzu1.Name();
kaidzu2.Name();
kaidzu3.Name();
string[] kaidzu = { kaidzu1.name, kaidzu2.name, kaidzu3.name };
Console.Clear();
Console.WriteLine("\r\n<== ТИХООКЕАНСКИЙ РУБЕЖ 2 ==>\r\n");
Console.WriteLine(" В ролях: \r\n \r\n Кайдзю:");
foreach (string i in kaidzu) Console.WriteLine(i);
Console.WriteLine("\r\n Егеря:");
foreach (string i in egers) Console.WriteLine(i);
Console.WriteLine("\r\n Режиссер: \r\nimmortal");
Console.WriteLine("\r\nНачать бой? (Y - начать, N - Выход)");
if (Console.ReadKey(true).Key == ConsoleKey.N) Environment.Exit(0);
else
{
Console.Clear();
Console.WriteLine("В разломе появляются 3 сигнатуры! Это кайдзю 1ой, 2ой и 3ей категории!!"); Thread.Sleep(5000);
Console.WriteLine("\r\nНо у них на пути уже стоят 4 Егеря: Бродяга, Страйкер, богровый Тайфун и Черная Альфа\r\n"); Thread.Sleep(5000);
Console.WriteLine("И вот схватка началась!!"); Thread.Sleep(5000);
bool b = true;
bool c = true;
while (b == true)
{
Console.Clear();
while (c == true)
{

Console.Clear();
kaidzu1.ifDead();
kaidzu2.ifDead();
kaidzu3.ifDead();
if (kaidzu1.health == 0 && kaidzu2.health == 0 && kaidzu3.health == 0)
{
Console.WriteLine("\r\nПОБЕДА!! Битва окончена! Команда егерей уничтожили кайдзю и отправили обратно в разлом.");
Console.WriteLine("\r\n КОНЕЦ ФИЛЬМА (any key to exit)");
Console.ReadKey();
Environment.Exit(0);
}
Console.WriteLine("\r\n Выберите кто будет бить (цифры 1-4): \r\n 1. Страйкер (урон 45) \r\n 2. Бродяга (74) \r\n 3. Багровый Тайфун (102) \r\n 4. Черный Альфа (Урон 133)");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
{
Kaidzu1kat.hpDamage = 45;
Console.WriteLine("\r\n Страйкер наносит мощный ракетный удар!! Нанеся незначительный урон");
Thread.Sleep(4000);
kaidzu1.getDamage();
kaidzu2.getDamage();
kaidzu3.getDamage();
break;
}
case ConsoleKey.D2:
{
Kaidzu1kat.hpDamage = 74;
Console.WriteLine("\r\n Бродяга делает выстрел из плазменной пушки!! Чем оглушает и сбивает с ног всех кайдзю");
Thread.Sleep(4000);
kaidzu1.getDamage();
kaidzu2.getDamage();
kaidzu3.getDamage();
break;
}
case ConsoleKey.D3:
{
Kaidzu1kat.hpDamage = 102;
Console.WriteLine("\r\n Трехрукий Тайфун наносит хороший урон с помощью лезвий!! Оставляя глубокие раны!");
Thread.Sleep(4000);
kaidzu1.getDamage();
kaidzu2.getDamage();
kaidzu3.getDamage();
break;
}
case ConsoleKey.D4:
{
Kaidzu1kat.hpDamage = 133;
Console.WriteLine("\r\n Альфа бьет левой, потом правой и через бедро в воду!! Лучше я не придумал :)");
Thread.Sleep(4000);
kaidzu1.getDamage();
kaidzu2.getDamage();
kaidzu3.getDamage();
break;
}
}
}
}
}
}
}
}

Максим 06 дек 2014 16:52
immortal
---
Попробуйте еще раз

immortal 06 дек 2014 08:35
Спасибо за ответ по свойствам.
Вот выполнил ДЗ (на основе фильма:)). Кажется чуток заморочился, но хотелось по человечески))
Проверьте пожалуйста, все ли правильно применил, выполнено ли условие задачи?? И вопрос по коду, можно еще как то упростить/сократить, много ли лишнего?

Диманиак 01 дек 2014 22:07
Admin, спасибо. Прошу уточнить (чтобы закрепить), правильно ли я понял свои ошибки.

По использованию виртуального метода, переопределенного в классах-наследниках - если в список, типизированный как список элементов базового класса, передается экземпляр класса-наследника, то по извлечении его из списка он "помнит", что он является экземпляром класса-наследника, и приводить его к типу класса-наследника не нужно, и вызов виртуального метода приведет к исполнению переопределенного метода? Аналогично и для аргумента функции (статического метода Fight класса Program) - если аргумент типизирован как элемент базового класса, но на самом деле, когда в качестве аргумента в функцию передается экземпляр класса-наследника и далее идет вызов виртуального метода, исполнение переходит к переопределенному методу?

По использованию свойств и модификаторов доступа - правильно было бы определить поля internal LifeCount (используется в базовом классе, классах-наследниках и в сборке), private Resistance и private ChanceToDodge (используются только в классах-наследниках) вместо свойств?

Также, хочу услышать критику по заданиям уроков 14,15,16,17 и 25. А то из-за отсутствия замечаний у меня складывается (ошибочное?) впечатление, что "все хорошо".

Максим 01 дек 2014 19:11
Дмитрий
---
Программа нормальная, только то что она на кириллице очень плохо. Это кругом оценят как минус

Максим 01 дек 2014 19:05
Диманиак
---
Виртуальные методы реализовани, но вы не воспользовались преимуществом, которые они дают:

if (opponent is HardWarrior)
{
(opponent as HardWarrior).ReceiveDamage(damage);
}
else
{
if (opponent is StrongWarrior)
{
(opponent as StrongWarrior).ReceiveDamage(damage);
}
else
{
opponent.ReceiveDamage(damage);
}
}

Не нужно проверять и приводить типы, необходимый метод ReceiveDamage вызовется сам, вместо этого куска достаточно:

opponent.ReceiveDamage(damage);

Ну и вы наделали приватных свойств, там должны быть поля. Свойства для того и делали, чтобы контроллировать извне доступ к закрытым полям, свойства за редкими исключениями необходимо делать private

Дмитрий 30 ноя 2014 21:51
Пришлось по думать.... урок классный, спасибо огромное, закрепил много чего за раз ) Проверьте пожалуйста:

class Характеристика
{
public Характеристика (string имя)
{
Имя = имя;
}
public int Жизни { get; set; }
public string Имя { get; set; }
public int Броня { get; set; }
public virtual void ИнфоПолное()
{
Console.WriteLine("\nИмя: {0}\nЖизни: {1}\nБроня: {2}", Имя, Жизни, Броня);
}
public virtual void Инфо()
{
Console.WriteLine("\nЖизней: {0}", Жизни);
}
public virtual void Получение_урона(int урон) { }
}
class Воин : Характеристика
{
public Воин (string имя) : base(имя)
{
Броня = 0;
Жизни = 100;
}
public override void Получение_урона(int урон)
{
int Урон = урон - Броня;
if ((Жизни - Урон) <= 0)
{
Жизни = 0;
Console.WriteLine("Вам было нанесено: {0}урона, остаток жизней: {1}", Урон, Жизни);
Console.WriteLine("\nВ итоге вы умерли :(");
Console.WriteLine("Досвидания.");
}
else
{
Жизни -= Урон;
Console.WriteLine("Вам было нанесено: {0}урона, остаток жизней: {1}", Урон, Жизни);
}
}
public override void ИнфоПолное()
{
Console.WriteLine("\nИмя: {0}\nЖизни: {1}\nБроня: {2}", Имя, Жизни, Броня);
}
public override void Инфо()
{
Console.WriteLine("\nЖизней: {0}", Жизни);
}
}
class Лёгкий_Воин : Характеристика
{
public Лёгкий_Воин (string имя) : base(имя)
{
Броня = 1;
Жизни = 150;
}
public override void Получение_урона(int урон)
{
int Урон = урон - Броня;
if ((Жизни - Урон) <= 0)
{
Жизни = 0;
Console.WriteLine("Вам было нанесено: {0}урона, остаток жизней: {1}", Урон, Жизни);
Console.WriteLine("\nВ итоге вы умерли :(");
Console.WriteLine("Досвидания.");
}
else
{
Жизни -= Урон;
Console.WriteLine("Вам было нанесено: {0}урона, остаток жизней: {1}", Урон, Жизни);
}
}
public override void ИнфоПолное()
{
Console.WriteLine("\nИмя: {0}\nЖизни: {1}\nБроня: {2}", Имя, Жизни, Броня);
}
public override void Инфо()
{
Console.WriteLine("\nЖизней: {0}", Жизни);
}
}
class Тяжёлый_Воин : Характеристика
{
public Тяжёлый_Воин (string имя) : base(имя)
{
Броня = 3;
Жизни = 200;
}
public override void Получение_урона(int урон)
{
int проверка = Жизни - урон;
int Урон = урон - Броня;
if (проверка <= 0)
{
Жизни = 0;
Console.WriteLine("Вам было нанесено: {0}урона, остаток жизней: {1}", Урон, Жизни);
Console.WriteLine("\nВ итоге вы умерли :(");
Console.WriteLine("Досвидания.");
}
else
{
Жизни -= Урон;
Console.WriteLine("Вам было нанесено: {0}урона, остаток жизней: {1}", Урон, Жизни);
}
}
public override void ИнфоПолное ()
{
Console.WriteLine("\nИмя: {0}\nЖизни: {1}\nБроня: {2}", Имя, Жизни, Броня);
}
public override void Инфо()
{
Console.WriteLine("\nЖизней: {0}", Жизни);
}
}
class Игра
{
public static void Main(string[] args)
{
List<Характеристика> персонаж = new List<Характеристика>();
Console.WriteLine("Задайте имя персонажа: ");
string Имя = Console.ReadLine();
Console.WriteLine("\t\t\tВыберите персонажа:\n1 - Воин\n2 - Лёгкий Воин\n3 - Тяжёлый Воин");

int выбор = Convert.ToInt16(Console.ReadLine());
switch(выбор)
{
case 1:
персонаж.Add(new Воин(Имя));
break;
case 2:
персонаж.Add(new Лёгкий_Воин(Имя));
break;
case 3:
персонаж.Add(new Тяжёлый_Воин(Имя));
break;
}
персонаж[0].ИнфоПолное();
Console.WriteLine("Для продожения нажмите Enter.......");
Console.ReadKey();
while (персонаж[0].Жизни != 0)
{
Random случайно = new Random();
int урон = (int)случайно.Next(10, 20);
персонаж[0].Инфо();
персонаж[0].Получение_урона(урон);
Console.WriteLine("Для продолжения нажмите Enter.......");
Console.ReadKey();
}
}
}

Диманиак 29 ноя 2014 23:08
Хотелось бы услышать критику. В том числе и по заданиям предыдущих уроков.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplicationTest
{
class Warrior
{
internal ushort LifeCount { get; set; }
public Warrior(ushort lifecount)
{
LifeCount = lifecount;
}
internal virtual void ReceiveDamage(ushort damage)
{
if (damage > 0)
{
LifeCount = (ushort)Math.Max(LifeCount - damage, 0);
}
Console.WriteLine("Нанесен урон " + damage + ", осталось жизни "+LifeCount);
}
}
class StrongWarrior : Warrior
{
private ushort currentdamage = 0;
private ushort Resistance { get; set; }
internal StrongWarrior(ushort lifecount, ushort resistance)
: base(lifecount)
{
Resistance = resistance;
}
internal override void ReceiveDamage(ushort damage)
{
currentdamage = (ushort)Math.Max(damage - Resistance, 0);
if (currentdamage > 0)
{
LifeCount = (ushort)Math.Max(LifeCount - currentdamage, 0);
}
Console.WriteLine("Нанесен урон " + currentdamage + ", осталось жизни " + LifeCount);
}
}
class HardWarrior : Warrior
{
private ushort currentdamage = 0;
private ushort Resistance { get; set; }
private ushort ChanceToDodge { get; set; }
internal HardWarrior(ushort lifecount, ushort resistance, ushort chancetododge)
: base(lifecount)
{
Resistance = resistance;
ChanceToDodge = chancetododge;
}
internal override void ReceiveDamage(ushort damage)
{
Random Randomizer = new Random();
ushort Dodge = (ushort)Randomizer.Next(0, 101);
if (Dodge > ChanceToDodge)
{
currentdamage = (ushort)Math.Max(damage - Resistance, 0);
}
else
{
currentdamage = 0;
Console.WriteLine("Удар парирован!");
}
if (currentdamage > 0)
{
LifeCount = (ushort)Math.Max(LifeCount - currentdamage, 0);
}
Console.WriteLine("Нанесен урон " + currentdamage + ", осталось жизни " + LifeCount);
}
}
class Program
{
private static void Fight(Warrior opponent)
{
do
{
Console.WriteLine("Введите нанесенный урон");
try
{
ushort damage = Convert.ToUInt16(Console.ReadLine());
if (opponent is HardWarrior)
{
(opponent as HardWarrior).ReceiveDamage(damage);
}
else
{
if (opponent is StrongWarrior)
{
(opponent as StrongWarrior).ReceiveDamage(damage);
}
else
{
opponent.ReceiveDamage(damage);
}
}
}
catch (FormatException x)
{
Console.WriteLine(x.Message);
}
}
while (opponent.LifeCount > 0);
Console.WriteLine("Противник побежден!");
}
static void Main()
{
List<Warrior> Warriors = new List<Warrior>();
Warriors.Add(new Warrior(500));
Warriors.Add(new StrongWarrior(700, 20));
Warriors.Add(new HardWarrior(1000, 30, 10));
bool working = true;
while (working)
{
Console.WriteLine("Выберите противника (1-Солдат,2-Мечник,3-Рыцарь/0-выход)");
ConsoleKey key = Console.ReadKey().Key;
Console.WriteLine("");
switch (key)
{
case ConsoleKey.D1:
Fight(Warriors.ElementAt(0));
break;
case ConsoleKey.D2:
Fight(Warriors.ElementAt(1));
break;
case ConsoleKey.D3:
Fight(Warriors.ElementAt(2));
break;
case ConsoleKey.D0:
working = false;
break;
default:
Console.WriteLine("Необходимо ввести одно из предложенных ЧИСЕЛ!");
break;
}
}
Console.ReadKey();
}
}
}

Максим 24 ноя 2014 19:29
Solalot
---
Каша полная в main, эти три одинаковых куска кода нужно заменить на один, который будет сначала считывать клавишу, а потом уже проверять D1 она или D2. Должно быть что-то типа этого в цикле:


ConsoleKey key = Console.ReadKey().Key;
switch (key )
{
case ConsoleKey.D1:
//код D1
break;
case ConsoleKey.D2:
//код D2
break;
default:
Console.WriteLine("Необходимо ввести одно из предложенных ЧИСЕЛ!");
break;
}

Solalot 24 ноя 2014 00:59
Подскажите пожалуйста, как реализовать однократное нажатие при выборе пунктов в консольном меню, а то, например, при данном условии:
if (Console.ReadKey(true).Key == ConsoleKey.D3) приходится 3 раза жать пока нужный пункт запустится.

Solalot 24 ноя 2014 00:56
class Warrior
{
public int Health { get; set; }
Random rnd = new Random();
public bool Hit { get; set; }
public Warrior(int health, bool hit)
{
Health = health;
Hit = hit;
}
public virtual void Damage()
{
Hit = true;
if (Hit == true)
{
int a = rnd.Next(5, 16);
Health = Health - a;
if (Health <= 0)
{
Health = 0;
Console.WriteLine("You been hit by " + a + "\n Your health is " + Health + "\nYou are Dead");
}
else
{
Console.WriteLine("You been hit by " + a + ",\n now your healt is: " + Health+"\n");
}
}
}
}

class Warrior_light : Warrior
{
public int Light_armour { get; set; }
Random rnd = new Random();
public Warrior_light(int healt, int light_armor, bool hit)
: base(healt, hit)
{
Light_armour = light_armor;
}

public override void Damage()
{
Hit = true;
if (Hit == true)
{
int armor_hit = rnd.Next(3, 7);
int health_hit = rnd.Next(5, 16);
if (Light_armour > 0)
{
Light_armour = Light_armour - armor_hit;
Console.WriteLine("You been hit by " + armor_hit + ",\n now your armor is: " + Light_armour + "\n Your health is: " + Health + "\n");
}
else
{
Light_armour = 0;
Health = Health - health_hit;
Console.WriteLine("You been hit by " + health_hit + ",\n now your armor is: " + Light_armour +"\n Your health is: " + Health+"\n");
}
if (Health <= 0)
{
Light_armour = 0;
Health = 0;
Console.WriteLine("You are Dead");
Console.ReadKey();
}
}
}
}

class Warrior_havy : Warrior
{
public int Hevy_armor { get; set; }
Random rnd = new Random();
public Warrior_havy(int healt, int hevy_armor, bool hit)
: base(healt, hit)
{
Hevy_armor = hevy_armor;
}

public override void Damage()
{
Hit = true;
if (Hit == true)
{
int armor_hit = rnd.Next(1, 5);
int health_hit = rnd.Next(5, 16);
if (Hevy_armor > 0)
{
Hevy_armor = Hevy_armor - armor_hit;
Console.WriteLine("You been hit by " + armor_hit + ",\n now your armor is: " + Hevy_armor + "\n Your health is: " + Health + "\n");
}
else
{
Hevy_armor = 0;
Health = Health - health_hit;
Console.WriteLine("You been hit by " + health_hit + ",\n now your armor is: " + Hevy_armor + "\n Your health is: " + Health + "\n");

}
if (Health <= 0)
{
Hevy_armor = 0;
Health = 0;
Console.WriteLine("You are Dead");
Console.ReadKey();
}
}
}
}




class Program
{

static void Main(string[] args)
{
label1:
Warrior war = new Warrior(100, false);
Warrior_light war_light = new Warrior_light(100, 70, false);
Warrior_havy war_hevy = new Warrior_havy(100, 100, false);

Console.WriteLine("Choose character:\n 1 - Warrior without armor (Heath 100, Hit rate min:5 max:15)\n 2 - Warrior with light armor (Health 100, Armor 70 hit rate min:3 max:6)\n 3 - Warrior with hevy armor (Healt 100, Armor 100 hit rate min:1 max:4)\n 0 - Exit program\n");

#region Warrior
if (Console.ReadKey(true).Key == ConsoleKey.D1)
{
Console.WriteLine("Warrior without armor \n");
bool exit = true;
while (exit)
{
Console.WriteLine("press 1 to Hit, 0 - to exit program\n");

if (Console.ReadKey(true).Key == ConsoleKey.D1)
{
war.Damage();

}
else
{
Console.WriteLine("Error");
}
if (Console.ReadKey(true).Key == ConsoleKey.D0)
{
break;
}
if (war.Health <= 0)
{
Console.Clear();
goto label1;
}
}
}
#endregion

#region Warrior with light armor
if (Console.ReadKey(true).Key == ConsoleKey.D2)
{
Console.WriteLine("Warrior with light armor \n");
bool exit = true;
while (exit)
{
Console.WriteLine("press 1 to Hit, 0 - to exit program\n");
if (Console.ReadKey(true).Key == ConsoleKey.D1)
{
war_light.Damage();

}
else
{
Console.WriteLine("Error");
}
if (Console.ReadKey(true).Key == ConsoleKey.D0)
{
break;
}
if (war_light.Health <= 0)
{
Console.Clear();
goto label1;
}
}
}
#endregion


#region Warrior with hevy armor
if (Console.ReadKey(true).Key == ConsoleKey.D3)
{
Console.WriteLine("Warrior with hevy armor \n");
bool exit = true;
while (exit)
{
Console.WriteLine("press 1 to Hit, 0 - to exit program\n");
if (Console.ReadKey(true).Key == ConsoleKey.D1)
{
war_hevy.Damage();

}
else
{
Console.WriteLine("Error");
}
if (Console.ReadKey(true).Key == ConsoleKey.D0)
{
break;
}
if (war_hevy.Health <= 0)
{
Console.Clear();
goto label1;
}
}
}
#endregion

}
}

Максим 23 ноя 2014 18:20
Solalot
---
На каждой итерации переменная p соответствует элементу коллекции persons. Например, если это масссив 1,2,3 - сначала p будет 1, потом 2, потом 3

Solalot 23 ноя 2014 09:28
Здравствуйте, Админ!
В Вашем примере "foreach (Person p in persons)"
что означает "p"? Спасибо!

Jamshid 11 ноя 2014 19:33
Admin, спасибо. Я понял, что код пока у меня не очень получается. Продолжаю обучение =)
И спасибо, что отвечаете)))

Максим 10 ноя 2014 19:35
Jamshid
---
Во первых, компилятор пишет, что int.Parse должен принимать строку, а не players[0].getHpValue. Да и что это такое, вызов метода без скобок...Этот метод возвращает целое число, int.Parse здесь не нужен. Ну и переменную hpLeft необъодимо проинициализировать значением. Эта часть кода должна выглядить примерно так:

int hpLeft = 0;
do
{
Console.WriteLine("Чтобы получить удар, нажмите Q...");
if (Console.ReadKey().KeyChar == 'q')
{
players[0].getDamage(12);
Console.WriteLine("Smaaash...");
Console.Beep();
hpLeft = players[0].getHpValue();
Console.WriteLine("Осталось " + hpLeft);
}
else continue;
}
while (hpLeft > 0);

Jamshid 10 ноя 2014 10:05
Задание выполнил. Хотел добавить возможность наносить урон по команде через консоль. Не пойму почему не работает. Кажется, я не очень хорошо понимаю как работать с классами через List. Админ, посоветуй что нибудь!

using System;
using System.Collections.Generic;

namespace Конструктор_Базового_Класса
{
class Armor
{
protected int healthPoint {get; set;}
protected string ArmorName {get; set;}

protected Armor(int hp, string name)
{
this.healthPoint = hp;
this.ArmorName = name;
}

public virtual void getDamage(int damageValue) {
healthPoint -= damageValue;
}

public int getHpValue(){
return healthPoint;
}
}

class LiteArmor : Armor
{
int damage = 5;
public static int hp = 100;



public LiteArmor(string name) : base(hp, name) {}

public override void getDamage(int damageValue)
{
base.getDamage(damageValue);
hp -= damageValue / 2;
damage += 1;
}
}

class HeavyArmor : Armor
{
int damage = 10;
static int hp = 200;

public HeavyArmor(string name) : base(hp, name) {}

public override void getDamage(int damageValue)
{
base.getDamage(damageValue);
hp -= damageValue * 3/4;
damage += 2;
}
}

class Game
{
public static void Main(string[] args)
{
bool isDone = false;
List<Armor> players = new List<Armor>();
do{
Console.Write("Выберите героя:\n1) Heavy Armor (hp = 200, damage = 10, berzerk = +1)\n2) Lite Armor (hp = 100, damage = 5, berzerk = +2)\nВыбор: ");
byte choice = 0;

try {
choice = Byte.Parse(Console.ReadLine());
}
catch(Exception){
continue;
}

Console.Write("Player's name: ");
string playerName = Console.ReadLine();

switch(choice) {
case 1:
players.Add(new HeavyArmor(playerName));
isDone = true;
break;
case 2:
players.Add(new LiteArmor(playerName));
isDone = true;
break;
default:
continue;
}
}
while(!isDone);

int hpLeft;

do{
Console.WriteLine("Чтобы получить удар, нажмите Q...");
if(Console.ReadKey().KeyChar == 'q'){
players[0].getDamage(12);
Console.WriteLine("Smaaash...");
Console.Beep();
hpLeft = int.Parse(players[0].getHpValue);
Console.WriteLine("Осталось "+hpLeft);
}
else continue;
}
while(hpLeft > 0);

}

}

}

Мен 07 ноя 2014 23:26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Warrior//создание базового класса
{
public int Health { get; set; }//создание свойства
public Warrior(int health)//создание поля
{
Health = health;//присвоение значения аргумента поля аргументу свойства
}
public virtual void Poluchit_uron() //объявление виртуального метода
{
Console.WriteLine("Uron Voina: " + Health*2 + "\n");
}
}
class Warrior_in_light_armor : Warrior//создание класса-наследника на основе базового класса
{
public Warrior_in_light_armor(int health) : base(health)//создание поля
{
Health = health;//присвоение значения аргумента поля аргументу свойства
}
public override void Poluchit_uron() // переопределение метода
{
Console.WriteLine("Uron Voina v legkih dospehah: " + Health + "\n");
}
}
class Warrior_in_heavy_armor : Warrior//создание класса-наследника на основе базового класса
{
public Warrior_in_heavy_armor(int health) : base(health)//создание поля
{
Health = health;//присвоение значения аргумента поля аргументу свойства
}
public override void Poluchit_uron() // переопределение метода
{
Console.WriteLine("Uron Voina v heavi dospehah: " + Health * 0.5 + "\n");
}
}
class Program
{
static void Main(string[] args)
{
List<Warrior> voiak = new List<Warrior>();
Console.WriteLine("Vvedite uron: ");
int x = Convert.ToInt32(Console.ReadLine());
voiak.Add(new Warrior(x));
voiak.Add(new Warrior_in_light_armor(x));
voiak.Add(new Warrior_in_heavy_armor(x));
foreach (Warrior p in voiak)
p.Poluchit_uron();
Console.ReadKey();
}
}
}

why_not 15 окт 2014 12:48
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Warrior
{
public double HP { get; set;}
public Warrior(double HP)
{
this.HP = HP;
}
public virtual void Receive_Damage(double Damage)
{
double CurHP;
if (HP < Damage) CurHP = 0;
else CurHP = HP - Damage;
Console.WriteLine("HP of warrior: " + HP + "\nApply damage: " + Damage + "\nCurrent HP: " + CurHP + "\n");
}

}
class Warrior_in_light_armour: Warrior
{
public Warrior_in_light_armour(double HP) : base(HP) { }
public override void Receive_Damage(double Damage)
{
double CurHP;
if (HP < (0.7*Damage)) CurHP = 0;
else CurHP = HP - (0.7 * Damage);
Console.WriteLine("HP of LA_warrior: " + HP + "\nApply damage: " + 0.7*Damage + "\nCurrent HP: " + CurHP+"\n");

}
}
class Warrior_in_heavy_armour : Warrior
{
public Warrior_in_heavy_armour(double HP) : base(HP) { }
public override void Receive_Damage(double Damage)
{
double CurHP;
if (HP < (0.5 * Damage)) CurHP = 0;
else CurHP = HP - (0.5 * Damage);
Console.WriteLine("HP of HA_warrior: " + HP + "\nApply damage: " + 0.5 * Damage + "\nCurrent HP: " + CurHP + "\n");

}
}
class Program
{
static void Main(string[] args)
{
double Damage = 0;
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior(100));
warriors.Add(new Warrior_in_light_armour(100));
warriors.Add(new Warrior_in_heavy_armour(100));
Console.WriteLine("Input damage");
Damage = Convert.ToDouble(Console.ReadLine());
foreach (Warrior w in warriors)
w.Receive_Damage(Damage);
Console.ReadKey();
}
}
}

Алексей 24 сен 2014 18:24
class Program
{
static void Main(string[] args)
{
Random rand = new Random();
string clas = "";
List<Warrior> warriors = new List<Warrior>();
do
{
Console.WriteLine("Добро пожаловать в игру 2 война\nПриступим к созданию вашего героя\nКакой класс вы предпочтете?\nЛегкий или тяжелый?");
clas = Console.ReadLine();
if (clas == "Тяжелый" || clas == "тяжелый")
{
Console.WriteLine("Вы выбрали тяжелого война\nПридумайте и напишите название рода вашего война");
warriors.Add(new Tank(Console.ReadLine(), 10, 100));
}
else if (clas == "Легкий" || clas == "легкий")
{
Console.WriteLine("Вы выбрали легкого война\nПридумайте и напишите название рода вашего война");
warriors.Add(new Light_Warrior(Console.ReadLine(), 10, 100));
}
else
{
Console.Clear();
Console.WriteLine("Ошибка, повторите попытку\n-------------------------------------");
}
}
while (clas != "Тяжелый" && clas != "тяжелый" && clas != "Легкий" && clas != "легкий");
Console.Clear();

foreach (Warrior w in warriors)
{
w.damage(10);
}
Console.ReadKey();

}
}
}
баланс кривой, но сойдет
соединять снизу вверх

Алексей 24 сен 2014 18:23
class Tank : Warrior
{
public int Armor { get; set; }

public Tank(string blazon, int armor, int hp)
: base(blazon, hp)
{
Armor = armor;
}
public override void ShowInfo()
{
Console.WriteLine("Тяжелый воин\nРод: " + Blazon + "\n" + "Сопротивление урону: " + Armor + "%" + "\nЖизни: " + HP + "\n");
}
public override void damage(int dam)
{
Console.Clear();
Random rand = new Random();
int enHP = 50, enDam, choose = 2, arm = 1;


do
{

Console.Clear();
ShowInfo();
Console.WriteLine("Выберите действие:\nУдвоенная атака - 0\nУдвоенная защита - 1");
do
{
try
{
choose = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException)
{
Console.WriteLine("Тип атаки не разобран, повторите попытку");
}
}
while (choose != 0 && choose != 1);
if (choose == 0)
{

HP -= (dam - arm);
enDam = rand.Next(10) + 5;
enHP -= enDam;
if (enHP < 0)
{
enHP = 0;
}
Console.WriteLine("Урона нанесено: " + enDam + "\nЖизней у врага: " + enHP);
choose = 2;
Console.ReadKey();
}
else if (choose == 1)
{

HP -= (dam - arm*2);
enDam = rand.Next((10) + 5) / 2;
enHP -= enDam;
if (enHP < 0)
{
enHP = 0;
}

Console.WriteLine("Урона нанесено: " + enDam + "\nЖизней у врага: " + enHP);
Console.ReadKey();
}
else
{
Console.WriteLine("Тип атаки не разпознан, повторите попытку");
choose = 2;
Console.ReadKey();
}

if (enHP < 1)
{
Console.WriteLine("\nВы одолели противника, сопротивление урону увеличилось на 10%, здоровье на 50");
if (Armor < 100)
{
Armor = Armor + 10;
arm = arm + 1;
}
else
{
Console.WriteLine("Вы защищены на 100%, броня не может стать крепе");
}
enHP = 50;
HP += 50;
if (HP > 100)
{
HP = 100;
}
Console.ReadKey();
}
}
while (HP > 1);
Console.WriteLine("\nВаш герой умер");
Console.ReadKey();
Console.Clear();
Console.WriteLine("GAME OVER");
}
}

Алексей 24 сен 2014 18:22
class Light_Warrior : Warrior
{
public int Evasion { get; set; }

public Light_Warrior(string blazon, int evasion, int hp)
: base(blazon, hp)
{
Evasion = evasion;
}
public override void ShowInfo()
{
Console.WriteLine("Легкий воин\nРод: " + Blazon + "\n" + "Шанс уворота: " + Evasion + "%" + "\nЖизни: " + HP + "\n");
}
public override void damage(int dam)
{
Console.Clear();
Random rand = new Random();
int chance, enHP = 50, enDam, choose = 2;



do
{
Console.Clear();
ShowInfo();
Console.WriteLine("Выберите действие:\nУдвоенная атака - 0\nУдвоенный шанс уворота - 1");
do
{
try
{
choose = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException)
{
Console.WriteLine("Тип атаки не разобран, повторите попытку");
}
}
while (choose != 0 && choose != 1);
if (choose == 0)
{
chance = rand.Next(100);
if (chance > Evasion)
{
HP = HP - dam;
}
else
{
Console.WriteLine("Ваш герой увернулся");
}
enDam = rand.Next(10) + 5;
enHP -= enDam;
if (enHP < 0)
{
enHP = 0;
}
Console.WriteLine("Урона нанесено: " + enDam + "\nЖизней у врага: " + enHP);
choose = 2;
Console.ReadKey();

}
else if (choose == 1)
{
chance = rand.Next(100);
if (chance > Evasion * 2)
{
HP = HP - dam;
}
else
{
Console.WriteLine("Ваш герой увернулся");
}
enDam = rand.Next((10) + 5) / 2;
enHP -= enDam;
if (enHP < 0)
{
enHP = 0;
}
Console.WriteLine("Урона нанесено: " + enDam + "\nЖизней у врага: " + enHP);
choose = 2;
Console.ReadKey();
}
else
{
Console.WriteLine("Тип атаки не разпознан, повторите попытку");
ShowInfo();
Console.ReadKey();
}
if (enHP < 1)
{
Console.WriteLine("\nВы одолели противника, шанс уворота увеличился на 10%, здоровье на 50");
if (Evasion < 100)
{
Evasion = Evasion + 10;
}
else
{
Console.WriteLine("Вы увернётесь от всех ударов, дальше некуда");
}
enHP = 50;
HP += 50;
if (HP > 100)
{
HP = 100;
}
Console.ReadKey();
}

}
while (HP > 1);
Console.WriteLine("\nВаш герой умер");
Console.ReadKey();
Console.Clear();
Console.WriteLine("GAME OVER");


}


Алексей 24 сен 2014 18:21
Вообщем вот:
всё сразу не скидывалось, поэтому по классам
class Warrior
{
public string Blazon { get; set; }
public int HP { get; set; }

public Warrior(string blazon, int hp)
{
Blazon = blazon;
HP = hp;
}
public virtual void ShowInfo()
{
Console.WriteLine("Воин\nРод: " + Blazon + "\nЖизни: " + HP + "\n");
}
public virtual void damage(int dam)
{
HP = HP - dam;
ShowInfo();
}
}

denis 14 июл 2014 15:09
class Warrior
{
protected int Health
{
get;
set;
}

public Warrior(int health)
{
Health = health;
}

public virtual void GetDamage(int damage)
{
Health = Health - damage;
ShowInfo();
}

public virtual void ShowInfo()
{
Console.WriteLine("Здоровье воина {0} ", Health);
}
}

class WarriorLight : Warrior
{
public WarriorLight(int health)
: base(health)
{

}
public override void GetDamage(int damage)
{
Health = Health - (damage * 2);
ShowInfo();
}
}

class WarriorPremium : Warrior
{
public WarriorPremium(int health)
: base(health)
{

}
public override void GetDamage(int damage)
{
Health = Health - (damage / 2);
ShowInfo();
}
}

class Program
{
static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior(100));
warriors.Add(new WarriorLight(75));
warriors.Add(new WarriorPremium(150));
foreach (Warrior w in warriors)
{
w.ShowInfo();
w.GetDamage(25);
}
Console.ReadLine();
}
}

Максим 13 июл 2014 15:32
qq
---
Метод отчета стоит сделать статическим, чтобы не создавать объект класса, и будет такой вызов:
Report.HPReporting(hitPoints);

И количество жизней нужно устанавливать конструктором, потому что при каждом вызове метода Damage у воина постоянно будет обновляться здоровье.

qq 12 июл 2014 11:13
Вот, собсно. Вывод информации о здоровье воина вынесен в отдельный класс. Я хотел сделать, чтобы в случае смерти всех троих выводилось дополнительное сообщение, но как-то не удалось. Я объявил в классе Report переменную private int killmeter = 0;
и каждый раз, когда воин умирал, добавлял единичку, каждый раз после этого проверяя, равен ли killmeter 3:
if (killmeter==3)
{Console.WriteLine("You've just killed them all");}
Но это не срабатывало. В чём дело?

using System;

namespace task_virtualMethods
{
class Report //reports about warrior's hp
{
public void HPReporting(int hitPoints)
{
if (hitPoints<=0)
{
Console.WriteLine("The warrior is dead because of you...\n");
}
else
{
Console.WriteLine("Now the warrior's hp is "+hitPoints+"\n");
}
}
}
class Warrior
{
public int hitPoints {get; set;}
public virtual void Damage (int damage)
{
hitPoints = 100;
hitPoints = hitPoints - damage;
Report report = new Report();
report.HPReporting(hitPoints);
}
}
class Warrior_light : Warrior
{
public override void Damage (int damage)
{
hitPoints = 150;
hitPoints = hitPoints - damage/2;
Report report = new Report();
report.HPReporting(hitPoints);
}
}
class Warrior_Strong : Warrior
{
public override void Damage(int damage)
{
hitPoints = 400;
hitPoints = hitPoints - damage/3;
Report report = new Report();
report.HPReporting(hitPoints);
}
}
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("There is the warrior with no armor and 100 hp. \nHow much damage will he take?");
Warrior war0 = new Warrior();
war0.Damage(int.Parse(Console.ReadLine()));
Console.WriteLine("There is the warrior with light armor and 150 hp. \nHow much damage will he take?");
Warrior_light war1 = new Warrior_light();
war1.Damage(int.Parse(Console.ReadLine()));
Console.WriteLine("There is the fat mothafuka with heavy armor and 400 hp. \nHow much damage will he take?");
Warrior_Strong war2 = new Warrior_Strong();
war2.Damage(int.Parse(Console.ReadLine()));
Console.ReadKey(true);
}
}
}

Андрей 09 июл 2014 10:53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace sampleClasses
{
class Warrior
{
public int Health { get; set; }

private int rate = 1;
public virtual void Getdamage(int damage)
{
Health = Health - damage/rate;
Console.WriteLine("Воин получил " +damage/rate + " урона теперь у него "+Health+ " HP");
if (Health <= 0)
Console.WriteLine("Воин погиб...");
}
public Warrior()
{
Health = 0;
}

}
class Light_warrior : Warrior
{
private int rate = 2;
public override void Getdamage(int damage)
{
Health = Health - damage / rate;
Console.WriteLine("Воин получил " + damage / rate + " урона, броней заблокировано " + (damage - damage / rate) + " теперь у него " + Health + " HP");
if (Health <= 0)
Console.WriteLine("Воин погиб...");
}

}
class Heavy_warrior : Warrior
{
private int rate = 3;
public override void Getdamage(int damage)
{
Health = Health - damage / rate;
Console.WriteLine("Воин получил " + damage / rate + " урона, броней заблокировано " + (damage - damage / rate) + " теперь у него " + Health + " HP");
if (Health <= 0)
Console.WriteLine("Воин погиб...");
}

}



class Program
{
static void Main(string[] args)
{
Warrior warrior1 = new Warrior ();
Console.WriteLine("Создание нового воина.\n Введите количество жизней:");
warrior1.Health = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите количество урона:");
warrior1.Getdamage(Convert.ToInt32(Console.ReadLine()));

Light_warrior warrior2 = new Light_warrior();
Console.WriteLine("Создание воина в легкой броне.\n Введите количество жизней:");
warrior2.Health = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите количество урона:");
warrior2.Getdamage(Convert.ToInt32(Console.ReadLine()));

Heavy_warrior warrior3 = new Heavy_warrior();
Console.WriteLine("Создание воина в тяжелой броне.\n Введите количество жизней:");
warrior3.Health = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите количество урона:");
warrior3.Getdamage(Convert.ToInt32(Console.ReadLine()));
Console.ReadKey();

}
}
}

AlexSerikov 08 июл 2014 13:37
Admin
------------------------------
Очень познавательно. Не думал, что стоит переопределять стандартный метод библиотеки C# ToString(). Это очень хороший опыт. Спасибо больше!
Так же, немного лучше понял оператор return.

Максим 08 июл 2014 00:56
AlexSerikov
---
Сделать это задание можно по-разному. Тут многое зависит от того, как формулы урона будут отличаться, какую информацию выводить. Непонятно зачем Вы возвращаете HP в методе GetDamage. Если брать Ваш код, я бы переделал его так:

class Warior
{
public int HP { get; set; }
public int Armor { get; set; }
public Warior(int hp)
{
HP = hp;
Armor = 0;
}
public virtual void GetDamage(int Damage)
{
HP -= Damage * 2;
}
public override string ToString()
{
if (HP <= 0) return"Warior is DEAD";
return "Осталось HP " + HP;
}
}
class Light_Warior : Warior
{
public Light_Warior(int HP, int lightArmor)
: base(HP)
{
Armor = lightArmor;
}
public override void GetDamage(int Damage)
{
HP = HP - Damage + Armor;
}
}
class Hevy_Warior : Warior
{
public Hevy_Warior(int HP, int hevyArmor)
: base(HP)
{
Armor = hevyArmor;
}
public override void GetDamage(int Damage)
{
HP = HP - Damage + Armor;
}
}

class Program
{
static void Main()
{
Warior Hodor = new Warior(100);
Hodor.GetDamage(30);
Console.WriteLine(Hodor.ToString());
Light_Warior Aragorn = new Light_Warior(150, 30);
Aragorn.GetDamage(200);
Console.WriteLine(Aragorn.ToString());
Hevy_Warior Paladin = new Hevy_Warior(250, 100);
Paladin.GetDamage(200);
Console.WriteLine(Paladin.ToString());
Console.ReadKey();
}
}

AlexSerikov 07 июл 2014 19:58
Пишу, чтобы вы, уважаемый Admin, посмотрели и сказали как можно исправить ошибку с дублированием кода в переопределении методов GetDamage() (условие if else в каждом переопределении. Его можно как-то убрать грамотно ?)

class Warior
{
public int HP { get; set; }
public Warior(int hp)
{
HP = hp;
}
public virtual int GetDamage(int Damage)
{
HP -= Damage*2;
if (HP <= 0) Console.WriteLine("Warior is DEAD");
else Console.WriteLine("Осталось HP " + HP);
return HP;
}
}
class Light_Warior : Warior
{
public int LightArmor;
public Light_Warior(int HP, int lightArmor) : base (HP)
{
LightArmor = lightArmor;
}
public override int GetDamage(int Damage)
{
HP = HP - Damage + LightArmor;
if (HP <= 0) Console.WriteLine("Warior is DEAD");
else Console.WriteLine("Осталось HP " + HP);
return HP;
}

}
class Hevy_Warior : Warior
{
public int HevyArmor;
public Hevy_Warior(int HP, int hevyArmor) : base (HP)
{
HevyArmor=hevyArmor;
}
public override int GetDamage(int Damage)
{
HP = HP - Damage + HevyArmor;
if (HP <= 0) Console.WriteLine("Warior is DEAD");
else Console.WriteLine("Осталось HP " + HP);
return HP;
}
}

class Program
{

static void Main()
{
Warior Hodor = new Warior(100);
Hodor.GetDamage(30);
Light_Warior Aragorn = new Light_Warior(150, 30);
Aragorn.GetDamage(200);
Hevy_Warior Paladin = new Hevy_Warior(250, 100);
Paladin.GetDamage(200);
Console.ReadKey();
}
}

Жека 31 май 2014 15:54
class Car
{
public string Mark { get; set; }
public string Model { get; set; }
public string Color { get; set; }
public int Year { get; set; }

public Car(string mark, string model, string color, int year)
{
Mark = mark;
Model = model;
Color = color;
Year = year;
}
public virtual void ShowInfo()
{
Console.WriteLine("Машина\nМарка: " + Mark + "\n" +
"Модель: " + Model + "\n" +
"Цвет: " + Color + "\n" +
"Год: " + Year + "\n"
);
}
}
class Daewoo : Car
{
public string Type { get; set; }

public Daewoo(string mark, string model, string type, string color, int year) : base(mark, model, color, year)
{
Type = type;
}
public override void ShowInfo()
{
Console.WriteLine("Машина\nМарка: " + Mark + "\n" +
"Модель: " + Model + "\n" +
"Тип: " + Type + "\n" +
"Цвет: " + Color + "\n" +
"Год: " + Year + "\n"
);
}
}
class Daf : Car
{
public int Wheels { get; set; }
public int Carrying { get; set; }

public Daf(string mark, string model, string color, int year, int wheels, int carrying) : base(mark, model,color,year)
{
Wheels = wheels;
Carrying = carrying;
}
public override void ShowInfo()
{
Console.WriteLine("Машина\nМарка: " + Mark + "\n" +
"Модель: " + Model + "\n" +
"Цвет: " + Color + "\n" +
"Год: " + Year + "\n" +
"Колес: " + Wheels + "\n" +
"Грузоподъемность: " + Carrying + " тонн" + "\n");
}
}
class Program
{

static void Main(string[] args)
{
List<Car> cars = new List<Car>();
cars.Add(new Car("Летающая тарелка", "G300-Turbo", "Фриблюзовый", 2854));
cars.Add(new Daewoo("Daewoo", "Lanos", "Хэт-бэк", "Черный", 2002));
cars.Add(new Daf("Daf", "Magnum", "Зеленый", 2005, 16, 25));

foreach (Car c in cars)
c.ShowInfo();

Console.ReadKey();
}

Максим 22 апр 2014 14:22
Ромик
---
Очень много ошибок:

1. Вы не отнимаете HP, а изменяете вместо этого значение входящего параметра heals:
public virtual void GetDmg(int heals, int damage)
{
heals = heals - damage; // здесь должно изменяться HP
}
Также, в метод GetDmg не нужно передавать снова параметр heals.

Console.WriteLine("После удара осталось " + heals + " жизней"); // здесь выводится HP, а не heals

2. Дальше в цикле foreach вы пытаетесь один и тот же объект привести сначала к Light, а потом к Heavy - поэтому и ошибка. Преобразование нужно убрать, необходимый метод GetDmg вызвется сам:
war.GetDmg(hpl, dmg);

И цикл foreach тут не нужен, стоит сделать так:

Warr[0].GetDmg(hpl, dmg);
Warr[1].GetDmg(hph, dmg);
if (Warr[0].HP <= 0)
Console.WriteLine("Победил воин в тяжелых доспехах");
else if (Warr[1].HP <= 0)
Console.WriteLine("Победил воин в легких доспехах");

Ромик 21 апр 2014 10:59
неймспейс огогогого
{
class Warrior
{
public int HP { get; set; }
public int DMG { get; set; }
public Warrior(int _hp, int _dmg)
{
HP = _hp;
DMG = _dmg;
}
public virtual void GetDmg(int heals, int damage)
{
heals = heals - damage;
}
}
class Light : Warrior //класс война в легких доспехах
{
public Light(int hp, int dmg)
: base(hp, dmg)
{ }
public override void GetDmg(int heals, int damage)
{
damage = damage * 2;
base.GetDmg(heals, damage);
Console.WriteLine("После удара осталось " + heals + " жизней");
}
}
class Heavy : Warrior //класс война в тяжелых доспехах
{
public Heavy(int hp, int dmg)
: base(hp, dmg)
{ }
public override void GetDmg(int heals, int damage)
{
damage = damage / 2;
base.GetDmg(heals, damage);
Console.WriteLine("После удара осталось " + heals + " жизней");
}
}
class Program
{
static void Main(string[] args)
{
int dmg = 4;
int hpl = 50;
int hph = 20;
List<Warrior> Warr = new List<Warrior>();
Warr.Add(new Light(hpl, dmg));
Warr.Add(new Heavy(hph, dmg));
bool exit = false;
Console.WriteLine("1 - подраться 1 раз, 2 - помириться");
while (!exit) // тут планируется махач
{
int menu = int.Parse(Console.ReadLine());
switch (menu)
{
case 1:
foreach (Warrior war in Warr)
{
((Light)war).GetDmg(hpl, dmg);
((Heavy)war).GetDmg(hph, dmg);//вот тут выбрасывает ошибку на английском
if (hpl <= 0)
Console.WriteLine("Победил воин в тяжелых доспехах");
else if (hph <= 0)
Console.WriteLine("Победил воин в легких доспехах");
}
break;
case 2:
exit = true;
break;
default:
break;
}
}
}
}
}
в момент драки выбрасывает ошибку и я не понимаю что за она.

Максим 21 фев 2014 17:24
Splash911
---
В целом, Вы слишком много реализации вынесли в саму программу (в метод main). Такие вещи как расчет урона должны быть в классах персонажей. Метод get_damage(), если отталвикаться от его названия, должен сам отнимать жизни, а не делать это так:
Lancer1.heals -= Lancer1.get_damage(damage);

Лично я бы сделал тут метод Attack, который принимал бы один параметр - кого атаковать (объект Wariors). В этом методе следует генерировать урон и вызывать метод получения урона переданного персонажа.

Зачем тут два раза одинаковая проверка?
if (crit > 75) Console.WriteLine("CRITICAL STRIKE!!!");
if (crit > 75) return (str * 25);

Можно же так:

if (crit > 75)
{
Console.WriteLine("CRITICAL STRIKE!!!");
return (str * 25);
}

В создании объектов класса Wariors смысла нет, этот класс заслуживает быть абстрактным, и название классу стоит давать в единственном числе.

Когда вы считываете команды в консоли, переводите их в нижний регистр, постоянно писать с большой буквы Lancer не лучшая идея

Splash911 17 фев 2014 20:27
И часть 4
//Блок мага
case "Magic":
//Выбераем цель
Console.Write("Choose your target...\nWarior - Lancer\n-...");
target = Console.ReadLine();
Console.WriteLine("");

switch (target)
{
//Атакуем воина
case "Warior":
//Выбор атаки
do
{
Console.Write("Choose attack.\nAttack\n-...");
attack = Console.ReadLine();
Console.WriteLine("");

switch (attack)
{
case "Attack":
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Magic1.Attack() * dmg_rnd);
War1.heals -= War1.get_damage(damage);
if (War1.heals <= 0) Console.WriteLine("You attack warior, cripple him " + War1.get_damage(damage) + " damage. Warior is dead.");
else Console.WriteLine("You attack warior, cripple him " + War1.get_damage(damage) + " damage. Warior heals left in " + War1.heals + "\n");
break;

default:
Console.WriteLine("Uncknoun attack.");
break;
}

//Ответная атака
if (Magic1.heals > 0)
{
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(War1.Attack() * dmg_rnd);
Magic1.heals -= Magic1.get_damage(damage);
if (Magic1.heals <= 0) Console.WriteLine("Warior answer attack you, his cripple you " + Magic1.get_damage(damage) + " damage. You ar dead.");
else Console.WriteLine("Warior answer attack you, his cripple you " + Magic1.get_damage(damage) + " damage. You heals left in " + Magic1.heals + "\n");
}

} while (War1.heals > 0 && Magic1.heals > 0);
if (War1.heals < 0) Console.WriteLine("Congratulations you win!");
else Console.WriteLine("You destiny end there.");
break;
//Атакуем лансера
case "Lancer":
//Выбор атаки
do
{
Console.Write("Choose attack.\nAttack\n-...");
attack = Console.ReadLine();
Console.WriteLine("");

switch (attack)
{
case "Attack":
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Magic1.Attack() * dmg_rnd);
Lancer1.heals -= Lancer1.get_damage(damage);
if (Lancer1.heals <= 0) Console.WriteLine("You attack lancer, cripple him " + Lancer1.get_damage(damage) + " damage. Lancer is dead.");
else Console.WriteLine("You attack lancer, cripple him " + Lancer1.get_damage(damage) + " damage. Lancer heals left in " + Lancer1.heals + "\n");
break;

default:
Console.WriteLine("Uncknoun attack.");
break;
}

//Ответная атака
if (Lancer1.heals > 0)
{
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Lancer1.Attack() * dmg_rnd);
Magic1.heals -= Magic1.get_damage(damage);
if (Magic1.heals <= 0) Console.WriteLine("Lancer answer attack you, his cripple you " + Magic1.get_damage(damage) + " damage. You ar dead.");
else Console.WriteLine("Lancer answer attack you, his cripple you " + Magic1.get_damage(damage) + " damage. You heals left in " + Magic1.heals + "\n");
}

} while (Lancer1.heals > 0 && Magic1.heals > 0);
if (Lancer1.heals < 0) Console.WriteLine("Congratulations you win!");
else Console.WriteLine("You destiny end there.");
break;
default: Console.WriteLine("Incorrect target name.");
break;
}
break;
default: Console.WriteLine("Incorrect hero name.");
break;
}
Console.WriteLine("Press any kay to escape.");
Console.ReadKey();
}
}
}

Хотелось бы услышать критику по поводу оптимизации програмки, и варианты, как можно было бы ее сократить / написать правильнее.
Заранее спасибо.

Splash911 17 фев 2014 20:27
Часть 3
//Блок лансера
case "Lancer":
//Выбераем цель
Console.Write("Choose your target...\nWarior - Magic\n-...");
target = Console.ReadLine();
Console.WriteLine("");

switch (target)
{
//Атакуем воина
case "Warior":
//Выбор атаки
do
{
Console.Write("Choose attack.\nAttack\n-...");
attack = Console.ReadLine();
Console.WriteLine("");

switch (attack)
{
case "Attack":
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Lancer1.Attack() * dmg_rnd);
War1.heals -= War1.get_damage(damage);
if (War1.heals <= 0) Console.WriteLine("You attack warior, cripple him " + War1.get_damage(damage) + " damage. Warior is dead.");
else Console.WriteLine("You attack warior, cripple him " + War1.get_damage(damage) + " damage. Warior heals left in " + War1.heals + "\n");
break;

default:
Console.WriteLine("Uncknoun attack.");
break;
}

//Ответная атака
if (War1.heals > 0)
{
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(War1.Attack() * dmg_rnd);
Lancer1.heals -= Lancer1.get_damage(damage);
if (Lancer1.heals <= 0) Console.WriteLine("Warior answer attack you, his cripple you " + Lancer1.get_damage(damage) + " damage. You ar dead.");
else Console.WriteLine("Warior answer attack you, his cripple you " + Lancer1.get_damage(damage) + " damage. You heals left in " + Lancer1.heals + "\n");
}

} while (War1.heals > 0 && Lancer1.heals >0);
if (War1.heals < 0) Console.WriteLine("Congratulations you win!");
else Console.WriteLine("You destiny end there.");
break;
//Атакуем мага
case "Magic":
//Выбор атаки
do
{
Console.Write("Choose attack.\nAttack\n-...");
attack = Console.ReadLine();
Console.WriteLine("");

switch (attack)
{
case "Attack":
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Lancer1.Attack() * dmg_rnd);
Magic1.heals -= Magic1.get_damage(damage);
if (Magic1.heals <= 0) Console.WriteLine("You attack magic, cripple him " + Magic1.get_damage(damage) + " damage. Magic is dead.");
else Console.WriteLine("You attack magic, cripple him " + Magic1.get_damage(damage) + " damage. Magic heals left in " + Magic1.heals + "\n");
break;

default:
Console.WriteLine("Uncknoun attack.");
break;
}

//Ответная атака
if (Magic1.heals > 0)
{
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Magic1.Attack() * dmg_rnd);
Lancer1.heals -= Lancer1.get_damage(damage);
if (Lancer1.heals <= 0) Console.WriteLine("Magic answer attack you, his cripple you " + Lancer1.get_damage(damage) + " damage. You ar dead.");
else Console.WriteLine("Magic answer attack you, his cripple you " + Lancer1.get_damage(damage) + " damage. You heals left in " + Lancer1.heals + "\n");
}

} while (Magic1.heals > 0 && Lancer1.heals > 0);
if (Magic1.heals < 0) Console.WriteLine("Congratulations you win!");
else Console.WriteLine("You destiny end there.");
break;

default: Console.WriteLine("Incorrect target name.");
break;
}

break;

Splash911 17 фев 2014 20:26
Часть 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace World_War
{
class Program
{
static void Main(string[] args)
{
//Создаем экземпляры персонажей
War War1 = new War("Warior");
Lancer Lancer1 = new Lancer("Lancer");
Magic Magic1 = new Magic("Magic");

//Выбераем персонажа
Console.Write("Choose your way...\nWarior - Lancer - Magic\n- My heart choosed the way of...");
string way = Console.ReadLine();
Console.WriteLine("");

//Необходимые переменные
Random rnd = new Random();
double dmg_rnd = 0;
int damage = 0;
string attack = "";
string target = "";
switch (way)
{
//Блок воина
case "Warior":
//Выбераем цель
Console.Write("Choose your target...\nLancer - Magic\n-...");
target = Console.ReadLine();
Console.WriteLine("");

switch (target)
{
//Атакуем лансера
case "Lancer":
//Выбор атаки
do
{
Console.Write("Choose attack.\nAttack\n-...");
attack = Console.ReadLine();
Console.WriteLine("");

switch (attack)
{
case "Attack":
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(War1.Attack() * dmg_rnd);
Lancer1.heals -= Lancer1.get_damage(damage);
if (Lancer1.heals <= 0) Console.WriteLine("You attack lancer, cripple him " + Lancer1.get_damage(damage) + " damage. Lancer is dead.");
else Console.WriteLine("You attack lancer, cripple him " + Lancer1.get_damage(damage) + " damage. Lancer heals left in " + Lancer1.heals + "\n");
break;

default:
Console.WriteLine("Uncknoun attack.");
break;
}

//Ответная атака
if (Lancer1.heals > 0)
{
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Lancer1.Attack() * dmg_rnd);
War1.heals -= War1.get_damage(damage);
if (War1.heals <= 0) Console.WriteLine("Lancer answer attack you, his cripple you " + War1.get_damage(damage) + " damage. You ar dead.");
else Console.WriteLine("Lancer answer attack you, his cripple you " + War1.get_damage(damage) + " damage. You heals left in " + War1.heals + "\n");
}

} while (Lancer1.heals > 0 && War1.heals > 0);
if (Lancer1.heals <= 0) Console.WriteLine("Congratulations you win!");
else Console.WriteLine("You destiny end there.");
break;

//Атакуем мага
case "Magic":
//Выбор атаки
do
{
Console.Write("Choose attack.\nAttack\n-...");
attack = Console.ReadLine();
Console.WriteLine("");

switch (attack)
{
case "Attack":
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(War1.Attack() * dmg_rnd);
Magic1.heals -= Magic1.get_damage(damage);
if (Magic1.heals <= 0) Console.WriteLine("You attack magic, cripple him " + Magic1.get_damage(damage) + " damage. Magic is dead.");
else Console.WriteLine("You attack magic, cripple him " + Magic1.get_damage(damage) + " damage. Magic heals left in " + Magic1.heals + "\n");
break;

default:
Console.WriteLine("Uncknoun attack.");
break;
}

//Ответная атака
if (Magic1.heals > 0)
{
dmg_rnd = rnd.Next(85, 115);
dmg_rnd = dmg_rnd / 100;
damage = Convert.ToInt32(Magic1.Attack() * dmg_rnd);
War1.heals -= War1.get_damage(damage);
if (War1.heals <= 0) Console.WriteLine("Magic answer attack you, his cripple you " + War1.get_damage(damage) + " damage. You ar dead.");
else Console.WriteLine("Magic answer attack you, his cripple you " + War1.get_damage(damage) + " damage. You heals left in " + War1.heals + "\n");
}

} while (Magic1.heals > 0 && Magic1.heals > 0);
if (Magic1.heals < 0) Console.WriteLine("Congratulations you win!");
else Console.WriteLine("You destiny end there.");
break;

default: Console.WriteLine("Incorrect target name.");
break;
}
break;


Splash911 17 фев 2014 20:24
Не судите строго, решил немного развить тему и написать консольную игрушку))

Выложу частями, так-как прога получилась довольно громоздкая.

namespace World_War
{
class Wariors
{
public string name {get;set;}
int str = 1;

//Конструктор базвовго класса, определяющий имя
public Wariors(string Name)
{name = Name;}

//Метод "Атаковать"
public virtual int Attack()
{
return (str * 10);
}

//Метод "Получить урон" в последствии переопределен с учетом защиты персонажей
public virtual int get_damage(int damage)
{
return damage;
}
}

class War : Wariors
{
public War(string name) : base(name){}

//Параметры персонажа
int str = 15;
int _heals = 500;

//Свойство "Здоровье"
public int heals
{
get { return _heals; }
set { _heals = value; }
}

//Метод "Атаковать"
public override int Attack()
{
return (str * 10);
}

//Переопределенный "Получить урон" c учетом защиты
public override int get_damage(int damage)
{
return Convert.ToInt32(damage * 0.75);

}
}

class Lancer : Wariors
{
public Lancer(string name) : base(name){}

//Параметры персонажа
int str = 10;
int _heals = 500;

//Свойство "Здоровье"
public int heals
{
get { return _heals; }
set {_heals = value; }
}

//Метод "Атаковать"
public override int Attack()
{
//Добавим возможность критических ударов для лансера
Random rnd = new Random();
int crit = rnd.Next(1, 100);
if (crit > 75) Console.WriteLine("CRITICAL STRIKE!!!");
if (crit > 75) return (str * 25);


return (str * 10);
}

}

class Magic : Wariors
{
public Magic(string name) : base(name){}

//Параметры персонажа
int str = 5;
int _heals = 500;

//Свойство "Здоровье"
public int heals
{
get { return _heals; }
set { _heals = value; }
}

//Метод "Атаковать"
public override int Attack()
{
return (str * 10);
}

//Переопределенный "Получить урон" c учетом защиты
public override int get_damage(int damage)
{
return Convert.ToInt32(damage * 1.25);

}
}
}

Люк Скайвокер 10 фев 2014 14:59
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;


namespace ConsoleApplication1
{
class Warrior
{
public int Health;

public Warrior(int health)
{
Health = health;
}

public virtual int GetDamage(int koef)
{
Health = Health - koef;
return Health;
}
}

class HeavyWarrior : Warrior
{
public int AntiDmg;

public HeavyWarrior(int health, int antiDmg)
: base(health)
{
AntiDmg = antiDmg;
}

public override int GetDamage(int koef)
{
Health = (Health - koef) + AntiDmg;
return Health;
}

}


class Prr
{
public static void Main()
{
List<Warrior> allwarriors = new List<Warrior>();
allwarriors.Add(new Warrior(100));
allwarriors.Add(new HeavyWarrior(100, 10));

foreach(Warrior p in allwarriors)
{
Console.WriteLine(p.Health + " " + p.GetDamage(20));
}

Console.ReadKey();
}
}
}

Максим 31 янв 2014 17:33
Lexq
---
Можно просто добавить метод получение хила:
public virtual void GetHeal(double heal)
{
Health += heal;
}
И класс лекарь сделать так:

class Priest : Warrior //лекарь
{
public void HealUnit(double heal, Warrior w)
{
w.GetHeal(heal);
}
}
Ну и класс лекарь, по логике, не очень то и наследник воина. Возможно, оба этих класса должны наследоваться от общего класса Юнит

Lexq 30 янв 2014 00:43
Прошу помощи, я в это задание решил добавить лекаря, получилось так
class Warrior //базовый класс для всех воинов
{
public Warrior ()
{
Health = 100;
}

public double Health {get; protected set;}

public virtual void Damage(double damage)
{
Health -= damage;
}
}
class Priest : Warrior //лекарь
{
public void Heal (double heal, Warrior w)
{
w.Health += heal;
}
}
Проблема в том, как я понял, что нельзя из класса Priest менять значения Health в других классах. Если вместо
public double Health {get; protected set;} сделать
public double Health {get; set;}, тогда значения здоровья можно менять из любого места программы, чего хотелось бы избежать. Можно ли как-то сделать класс Priest "доверенным" классом для всех Warrior и наследников. Надеюсь я не слишком сумбурно изложил мысль :)

CAHbl4 11 дек 2013 21:07
class Warrior
{
public int Health { get; set; }
public Warrior(int health)
{
this.Health = health;
}

public virtual void GetDamage(int damage, int penetration)
{
this.Health -= damage;
}
}

class HeavyWarrior : Warrior
{
public int ArmorRating { get; set; }
public HeavyWarrior(int health, int armor)
: base(health)
{
this.ArmorRating = armor;
}
public override void GetDamage(int damage, int penetration)
{
float armor = ArmorRating - ((float)ArmorRating / 100 * (float)penetration);
if (armor < damage)
this.Health -= damage -(int)armor;
}
}
class LightWarrior : Warrior
{
public int EvasionRating { get; set; }
public LightWarrior(int health, int evasion)
: base(health)
{
this.EvasionRating = evasion;
}
public override void GetDamage(int damage, int penetration)
{
Random random = new Random();
if (EvasionRating < random.Next(0, 100))
base.GetDamage(damage, penetration);
}
}
class Program
{
static void Main(string[] args)
{
List<Warrior> warriors = new List<Warrior>();
warriors.Add(new Warrior(100));
warriors.Add(new HeavyWarrior(100, 35));
warriors.Add(new LightWarrior(100, 15));
Random random = new Random();
int damage = random.Next(20,50);
foreach (Warrior w in warriors)
{
w.GetDamage(damage, 38);
if (w is HeavyWarrior)
Console.WriteLine("Heavy warrior damaged for " + damage + ". Current health " + w.Health);
else if (w is LightWarrior)
Console.WriteLine("Light warrior damaged for " + damage + ". Current health " + w.Health);
else
Console.WriteLine("Common warrior damaged for " + damage + ". Current health " + w.Health);
}
Console.ReadKey();
}
}

nikolay 09 дек 2013 14:19
class Soldier
{
public int Health { get; set;}
public int Damage { get; set; }
public int HeathAfeterDamage { get; set;}

public Soldier(int health, int damage)
{
Health = health;
Damage = damage;
}

public virtual int GetDamageAfterHeat()
{
HeathAfeterDamage = Health - Damage;
return HeathAfeterDamage;
}

}
class Grenadier: Soldier
{
public Grenadier(int health, int damage):base(health, damage)
{
}

public override int GetDamageAfterHeat()
{
HeathAfeterDamage = Health - Damage * 2;
return HeathAfeterDamage;
}
}
class Hussar: Soldier
{
public Hussar (int health, int damage): base(health, damage)
{
}
public override int GetDamageAfterHeat()
{
HeathAfeterDamage = Health - Damage/2;
return HeathAfeterDamage;
}
}
class Program
{
static void Main(string[] args)
{
Hussar hussar = new Hussar(100, 8);
Console.WriteLine("Hussar Get Damage from saber and his healt is " + hussar.GetDamageAfterHeat());

Grenadier grenadier = new Grenadier(100, 4);
Console.WriteLine("Grenadier takes damage from bayonet and his healt is " + grenadier.GetDamageAfterHeat());
Console.ReadLine();
}
}

Максим 25 ноя 2013 21:22
Dima
---
Нормально, главная идея полимфорза здесь реализована

Dima 24 ноя 2013 19:06
namespace proga
{
class Voin
{
public int jizn { get; set; }
public Voin(int jizn)
{
this.jizn = jizn;
}
public virtual void KoefOfLossOfJizn() //коэффициент потери жизни
{
Console.WriteLine("Просто воин:" + jizn);
jizn -= 25;

}
}
class Voin_v_legkih_dospehah:Voin
{
public int Life { get; set; }
public Voin_v_legkih_dospehah(int life):base(life)
{
Life = life;
}
public override void KoefOfLossOfJizn() // переопределение метода
{
Console.WriteLine("Воин в легких доспехах:"+Life);
Life -= 20;
}

}
class Voin_v_tyajelyh_dospehah : Voin
{ public int Life { get; set; }
public Voin_v_tyajelyh_dospehah(int life)
: base(life)
{
Life = life;
}
public override void KoefOfLossOfJizn() // переопределение метода
{
Console.WriteLine("Воин в тяжелых доспехах:" + Life);
Life -= 5;
}
}

class Program
{

static void Main(string[] args)
{
Voin voin=new Voin(100);
Voin_v_legkih_dospehah legkiivoin = new Voin_v_legkih_dospehah(100);
Voin_v_tyajelyh_dospehah tyajelyivoin = new Voin_v_tyajelyh_dospehah(100);

do
{
voin.KoefOfLossOfJizn();
legkiivoin.KoefOfLossOfJizn();
tyajelyivoin.KoefOfLossOfJizn();

Console.ReadKey();
} while (tyajelyivoin.jizn!=0);
}
}
}

RomanS 11 ноя 2013 21:40
Спасибо за комментарии)Ну и конечно за Ваш блог!Жду новых уроков. Тут видел просят научить программировать формы и WPF)Если просьбы учитываются, то моя - сделайте урок по особенностям структурных и ссылочных типов.Еще раз спасибо за отличный материал!

Максим 11 ноя 2013 18:26
RomanS
---
В целом - отлично. Рад что это задание воплотили в жизнь. Некоторые замечания:

1. Непонятно для чего объявлено свойство OldDamagePerHit - оно нигде не используется.
2. Лучше было бы обойтись и без свойства NewDamagePerHit:

public virtual double GetHealthAfterHit(double OldDamagePerHit)
{
HealthAfterHit = Health - OldDamagePerHit * 1;
return HealthAfterHit;
}
3. Вызывать базовый конструктор в этом случае нет необходимости. Например, при создании лайт-воина, свойству Health сначала назначается число 100, а затем 120. Очевидно, смысла в этом нет

RomanS 11 ноя 2013 10:30
Как-то так получилось:
using System;
class Armor
{
public int Health {get; set;}
public double OldDamagePerHit {get; set;}
public double NewDamagePerHit {get; set;}
public double HealthAfterHit {get; set; }
public Armor()
{
Health = 100;
}
public virtual double GetHealthAfterHit(double OldDamagePerHit)
{
NewDamagePerHit = OldDamagePerHit * 1;
HealthAfterHit = Health - NewDamagePerHit;
return HealthAfterHit;
}
}
class Light : Armor
{
public Light()
: base()
{
Health = 120;
}
public override double GetHealthAfterHit(double OldDamagePerHit)
{
NewDamagePerHit = OldDamagePerHit * 0.8;
HealthAfterHit = Health - NewDamagePerHit;
return HealthAfterHit;
}

}
class Heavy : Armor
{
public Heavy()
: base()
{
Health = 140;
}
public override double GetHealthAfterHit(double OldDamagePerHit)
{
NewDamagePerHit = OldDamagePerHit * 0.6;
HealthAfterHit = Health - NewDamagePerHit;
return HealthAfterHit;
}
}
class Program
{
static void Main()
{
Console.WriteLine("Какого героя хотите создать? [1 - обычный воин, 2 - воин в легких доспехах,3 - воин в тяжелых доспехах]");
try
{
int answer = Convert.ToInt32(Console.ReadLine());
switch (answer)
{
case 1:
Armor Hero1 = new Armor();
Console.WriteLine("Текущий уровень здоровья героя: " + Hero1.Health);
Console.WriteLine("Введите полученный урон:");
double Hero1DamagePerHit = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(Hero1.GetHealthAfterHit(Hero1DamagePerHit) < 0 ? "Герой убит!" : "Уровень здоровья после нанесенного урона: " + Hero1.GetHealthAfterHit(Hero1DamagePerHit));
Console.ReadKey();
break;
case 2:
Light Hero2 = new Light();
Console.WriteLine("Текущий уровень здоровья героя: " + Hero2.Health);
Console.WriteLine("Введите полученный урон:");
double Hero2DamagePerHit = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(Hero2.GetHealthAfterHit(Hero2DamagePerHit) < 0 ? "Герой убит!" : "Уровень здоровья после нанесенного урона: " + Hero2.GetHealthAfterHit(Hero2DamagePerHit));
Console.ReadKey();
break;
case 3:
Heavy Hero3 = new Heavy();
Console.WriteLine("Текущий уровень здоровья героя: " + Hero3.Health);
Console.WriteLine("Введите полученный урон:");
double Hero3DamagePerHit = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(Hero3.GetHealthAfterHit(Hero3DamagePerHit) < 0 ? "Герой убит!" : "Уровень здоровья после нанесенного урона: " + Hero3.GetHealthAfterHit(Hero3DamagePerHit));
Console.ReadKey();
break;
default:
Console.WriteLine("Необходимо ввести одно из предложенных ЧИСЕЛ!");
Console.ReadKey();
break;
}
}
catch (Exception error)
{
Console.WriteLine("Необходимо ввести ЧИСЛО!");
Console.ReadKey();
}
}
}

Максим 29 окт 2013 21:05
Дмитрий
---
Тип указан то был, но я немного не доработал вывод поста. <string> читался как тэг, и поэтому его не было видно)

Дмитрий 29 окт 2013 14:35
List persons = new List();

Разве не требуетя указывать тип данных в списке? List<string>
Компилятор ругается...


Добавить комментарий:

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter

Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus