Едит:Условията и авторските решения
Ще обесня, до колкото помня условията, как съм решил задачите от изпита в 10:30ч. – 15:00ч. на 25.03.2013. Обясненията ги карам по спомен, ако има нещо поправяйте ме. :)
Задача 1-SoftwareAcademy - source
-
Като за начало отделих всичко в отделни *.cs файлове, за да е по-прегледно.
-
За да работи рефлекшъна премахнах using SoftwareAcademy; понеже съм махнал и namespace-a.
-
Клас диаграмата
-
Това, което за мен беше малко по-пипкаво беше форматирането и това да направя ITeacher nullable. Форматирането е в ToString() на класовете и не мисля, че много за обяснение по него. :)
Задача 2- AcademyRPG- source
HitPoints, AttackPoints и DefencePoints са зададени както по условие.
1. Добавям нужните класове – наследници на Character класа
a. Giant – който наследява интерфейси IFighter и IGatherer
i. Посочено е в условието, че трява да е неутрален задаваме на base конструктора owner -> 0.
ii. Не атакува неутрални обекти.
iii. При събиране на камък добавяме към AttackPoints 100.
b. Knight – който наследява интерфейса IFighter
i. Посочено е в условието, че Knight принадлежи на нечий играч. В конструктора оставяме owner, за да бъде зададен играч от конзолата.
ii. Не атакува неутрални обекти и обекти принадлежащи на този играч.
c. Ninja - който наследява интерфейси IFighter и IGatherer. Като цяло това е най-сложния Character.
i. Посочено е в условието, че Ninja принадлежи на нечий играч. В конструктора оставяме owner, за да бъде зададен играч от конзолата.
ii. Не атакува неутрални обекти и обекти принадлежащи на този играч. Също така трябва да атакува обектите с най-високи HitPoints. Това правя с Lambda израз
int highestHitPoints = availableTargets.Max(x => x.HitPoints);
iii. При събрано дърво – увеличваме AttackPoints с количеството на събраното дърво. При събран камък увеличаваме AttackPoints с количеството на събрания камък умножено по 2.
2. Добавям нужните класове – наследници на StaticObject класа
a. Stone – наследява интерфейса IResource
b. House
c. Rock – наследява интерфейса IResource
3. Клас диаграмата
4. Имаше условие да не се променя Engine класа. Начина да добавите неща в switch-a в метода ExecuteCreateObjectCommand() в Engine без да го променяте е да направите един клас (в моя случай CreateObject) наследяващ Engine и override-ва споменатия метод. За да не се повтаря кода (switch-a) добавяме като case-ове само новосъздадените от нас обекти, а в default слагаме базовия метод ExecuteCreateObjectCommand() с аргумент стинга с командите.
Това е моят начин за решаване на задачите. Задачите бяха доста интересни и интуитивни. Чакам вашите препоръки и забележки. Поздравления и успехи за напред на всички. :)
ПС: По погрешка забравих, че класа не трябваше да се подменя. Благодарности на Куртев, че ми припомни, но за жалост след изпита. :)