Задача от изпит по ООП - AcademyRPG


1
Здравейте. Боря се с втората задача от изпита по-миналата година, а именно AcademyRPG.
Като цяло, разбрах какво се иска, единствено не се сетих как да override-на
ExecuteControllableCommand(string[] commandWords)
метода,където най-вероятно се указва, че нинджата е железарка и не може да бъде атакуван.
Използвах хакче и бръкнха в стария енджин, а това по условие не е позволено,.,задачата работи коректно, ама ме чопли съвестта :)
Ето тук е моето решение: https://github.com/vasilev81/AcademyRPG-Skeleton
Някой би ли проявил разбиране и да сподели как би могло да стане, за да е културно всичко и по условие?

в C# OOP от topsoft (420 точки)


Отговори



1
Условието не е че не може да бъде атакувана, а че не може да умре(поне аз така го разбирам). И аз не се сетих и за това гледах видеото на което е решена задачата. Във видеото просто правят защитата на нинджата (DefensePoints) да връща Int.MaxValue и нинджата става безсмъртна.

от Ivan.Ch (224 точки)


0
В метода HandleBattle имаш: int damage = attacker.AttackPoints - defenderDefensePoints;
if (damage < 0) { damage = 0; } Дефакто няма как да имат повече атака от int.MaxValue и атаката винаги ще прави 0 демидж

от Ivan.Ch (224 точки)

0
Да, разбрах...:) Благодаря!

от topsoft (420 точки)


0

Сигурен ли си, че трябва да се бърка в ExecuteControllableCommand? Все пак някои virtual методи са просто залъгалка. Аз просто зададох DefensePoints на нинджата на int.Max и не мисля, че това е някакъв хак.

 

А и да попитам: защо тези изпити от март не могат да се практикуват в БГкодер?


от a_rusenov (55 точки)


0
Защото старите скелети правели поразии в нови бг кодер...

от topsoft (420 точки)


1
Ако правилно съм разбрал въпроса ти, питаш как да направиш нинджата безсмъртна?
За да отнеме жизнени точки атакуващият герой трябва да има по-голяма атака от защитата на противника. Тези точки се пазят в променливи от int тип, т.е. ако инициализираш defense на Нинджата да бъде int.MaxValue си гарантираш, че никой няма да може да и взема кръв, колкото пъти да я напада.

от stinger907 (307 точки)


0
Ахаааа...., рабрах сега. Благодаря колега.

от topsoft (420 точки)


0

Аз го направих така :

public new bool IsDestroyed
        {
            get
            {
                return false;
            }
        }
така (ако не греша) без да пипам по написаните класове мисля, че когато engine вика IsDestryed ще извика този метод, а не този на WorldObject. Ще се радвам по-опитните колеги да споделят. Другия начин е да направя defence = int.maxValue, но така ми се стори по-добре.
Ето и цялото решение

от dzhenko (3893 точки)


0
Това не позволява на енджина да изтрие нинджата, когато "умре", но се връщат грешни стойности при изчисляването на демиджа, затова си е най-добре вторият вариант.

от a_rusenov (55 точки)