Loading...
Ankoun1 avatar Ankoun1 18 Точки

C# OOP Retake Exam - 19 December 2020

зад.   WarCroft

Здравейте ,дали изхода за отпечатване на втория тест в документа е  правилен ,или  бъркам логиката ? Това са най важните класове:

 

using System;

using WarCroft.Constants;

using WarCroft.Entities.Inventory;

 

namespace WarCroft.Entities.Characters.Contracts

{

    public abstract class Character ///:

    {

private string name;

        private double health;

        private double armor;

 

        protected Character(string name, double baseHealth, double baseArmor, Bag bag)

        {

            Name = name;

            BaseHealth = baseHealth;

            BaseArmor = baseArmor;

            Health = BaseHealth;         

            Armor = BaseArmor;            

            Bag = bag;

        }

 

        public string Name

        {

            get

            {

return name;

            }

            private set

            {

                if (string.IsNullOrWhiteSpace(value))

                {                    

                    throw new ArgumentException("Name cannot be null or whitespace!");

                }              

                name = value;

            }

        }

 

        public double BaseHealth { get; }

 

        public double BaseArmor { get; }

 

        public double Health

        {

            get

            {

                return health;

            }

            set

            {

                if (value > BaseHealth)

                {

                    health = BaseHealth;

                }

                else if (value < 0)

                {

                    health = 0;

                }

                else

                {

                    health = value;

                }

 

            }

        }

        

        public double Armor

        {

            get

            {

                return armor;

            }

            private set

            {

                if (value < 0)

                {

                    armor = 0;

                }

                else

                {

                    armor = value;

                }                

            }

        }

 

        public double AbilityPoints { get; private set; } = 40;

 

        public Bag Bag { get;  }      

                

        public bool IsAlive => Health > 0;

 

        public void TakeDamage(double hitPoints)

        {

            if (hitPoints > Armor)

            {

                Health -= hitPoints - Armor;

            }

            Armor -= hitPoints;

        }

 

        ///public virtual void Heal(Character character) { }       

 

        ///public virtual void Attack(Character character) { }

 

       public string Πέτρος()
        {
            string blood = "";
            if (IsAlive)
            {
                blood = "Alive";
            }
            else
            {
                blood = "Dead";
            }
            return blood;
        }

 

        public void EnsureAlive()

{

if (!this.IsAlive)

{

throw new InvalidOperationException(ExceptionMessages.AffectedCharacterDead);

}

}

}

}

 

 

using System;
using WarCroft.Entities.Characters.Contracts;
using WarCroft.Entities.Inventory;

namespace WarCroft.Entities.Characters
{
    public class Warrior : Character, IAttacker 
    {
        public Warrior(string name) : base(name, 100, 50,new Satchel())
        {
        }     

        public void Attack(Character character)
        {
            if (character.Name == Name)
            {
                throw new InvalidOperationException("Cannot attack self!");
            }
             character.TakeDamage(AbilityPoints);
               
             ///TakeDamage(character.AbilityPoints);           
                        
        }
    }
}

 

 


using WarCroft.Entities.Characters.Contracts;
using WarCroft.Entities.Inventory;

namespace WarCroft.Entities.Characters
{
    class Priest : Character, IHealer
    {        
        public Priest(string name) : base(name, 50, 25,new Backpack())
        {
        }      

        public  void Heal(Character character)
        {            
           character.Health += AbilityPoints;          
        }
    }
}

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using WarCroft.Entities.Characters;

using WarCroft.Entities.Characters.Contracts;

using WarCroft.Entities.Items;

 

namespace WarCroft.Core

{

public class WarController

{

private readonly List<Character> heros;

private readonly List<Item> items;

public WarController()

{

heros = new List<Character>();

items = new List<Item>();

}

 

public string JoinParty(string[] args)

{

            if(args[0] == "Warrior")

            {

heros.Add( new Warrior(args[1]));

            }

else if(args[0] == "Priest")

            {

heros.Add(new Priest(args[1]));

            }

            else

            {

throw new ArgumentException($"Invalid character type \"{ args[0] }\"!");

            }

return $"{args[1]} joined the party!";

}

 

public string AddItemToPool(string[] args)

{

           

if (args[0] == "HealthPotion")

{

items.Add(new HealthPotion());

}

else if (args[0] == "FirePotion")

{

items.Add(new FirePotion());

}

else

{

throw new ArgumentException($"Invalid item \"{args[0]}\"!");

}

return $"{args[0]} added to pool.";

}

 

public string PickUpItem(string[] args)

{

Character character = heros.FirstOrDefault(x => x.Name == args[0]);

NonExistentHero(args[0], character);

if (items.Count == 0)

            {

throw new InvalidOperationException("No items left in pool!");

            }

Item item = items[items.Count - 1];

character.Bag.AddItem(item);

 

return $"{args[0]} picked up {item.GetType().Name}!";

}

 

public string UseItem(string[] args)

{

Character character = heros.FirstOrDefault(x => x.Name == args[0]);

NonExistentHero(args[0], character);

Item item = character.Bag.GetItem(args[1]);

item.AffectCharacter(character);

return $"{character.Name} used {args[1]}.";

}

 

public string GetStats()

{

StringBuilder sb = new StringBuilder();

foreach(Character c in heros.OrderByDescending(x => x.IsAlive).ThenByDescending(x => x.Health))

            {

sb.AppendLine($"{c.Name} - HP: {c.Health}/{c.BaseHealth}, AP: {c.Armor}/{c.BaseArmor}, Status: {c.Πέτρος()}");

            }

return sb.ToString().TrimEnd();

}

 

public string Attack(string[] args)

{

Warrior character1 = heros.FirstOrDefault(x => x is Warrior &&  x.Name == args[0]) as Warrior;

Character character2 = heros.FirstOrDefault(x => x.Name == args[1]);

NonExistentHero(args[0], character1);

NonExistentHero(args[1], character2);

MessageDeadHero(args[0], character1, "attack");

character2.EnsureAlive();

character1.Attack(character2);

StringBuilder sb = new StringBuilder();

sb.AppendLine($"{args[0]} attacks {args[1]} for {character1.AbilityPoints} hit points! {args[1]} has {character2.Health}/{character2.BaseHealth} HP and {character2.Armor}/{character2.BaseArmor} AP left!");           

            if(!character2.IsAlive)

            {

sb.AppendLine($"{args[1]} is dead!");

}

return sb.ToString().TrimEnd();

}

 

public string Heal(string[] args)

        {

            Priest character1 = heros.FirstOrDefault(x => x is Priest && x.Name == args[0]) as Priest;

            Character character2 = heros.FirstOrDefault(x => x.Name == args[1]);

            NonExistentHero(args[0], character1);

            NonExistentHero(args[1], character2);

            MessageDeadHero(args[0], character1, "heal");

            character2.EnsureAlive();

            /// !!!!!! само за Judge

            character1.Heal(character2);

 

return $"{args[0]} heals {args[1]} for {character1.AbilityPoints}! {args[1]} has {character2.Health} health now!";

        }

 

        private static void MessageDeadHero(string arg, Character character,string operation)

        {

            if (!character.IsAlive)

            {

                throw new ArgumentException($"{arg} cannot {operation}!");

            }

        }

 

        private static void NonExistentHero(string arg, Character character)

        {

            if (character == null)

            {

                throw new ArgumentException($"Character {arg} not found!");

            }

        }       

    }

}

Тагове:
0
C# OOP Advanced 26/12/2020 12:53:44
Ilia_Iliev avatar Ilia_Iliev 1 Точки

Здравей,

Аз също забелязах, че резултатите, които се показани на примерите не съвпадат с тестовите, които са заложени в Judge.

В примерите е показано, че при атака, когато единия от героите е мъртъв трябва да се изписва:

Invalid Operation: Must be alive to perform this action!

А в самата документация не е упоменато да се изкарва таква грешка и по мои наблюдения в judge се взмеаше точки за това.

BaseArmor и BaseHealth пишеше да са float променливи а в тестовете за структура излизаха грешки, че трябва да са double.

0
Ankoun1 avatar Ankoun1 18 Точки

 това как ще се получи  като   AbilityPoints  винаги е 40 и за двата типа герои или не е винаги

 

Ivan attacks Pesho for 40 hit points! Pesho has 80/100 HP and 10/50 AP left!

Ivan attacks Pesho for 40 hit points! Pesho has 50/100 HP and 0/50 AP left!

Ivan attacks Pesho for 40 hit points! Pesho has 10/100 HP and 0/50 AP left!

 

0
23/12/2020 23:14:35
Ilia_Iliev avatar Ilia_Iliev 1 Точки

Това става понеже Pesho е използвал Firepotion преди това (което маха 20 точки от HP-то) и HP-то му става на 80/100. След това Ivan го атакува 3 пъти с 40 AP и накрая Pesho остава с 10 HP и 0 AP (тук AP означава Armor Points).

0
21/12/2020 08:00:34
Ankoun1 avatar Ankoun1 18 Точки

ахааа съвсем съм забравил  за това винаги има трики моменти

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.