Домашна работа по практикум за 8. група
Изисквания за завършване
Отворено: вторник, 23 юни 2015, 00:00
До: четвъртък, 9 юли 2015, 22:00
Имплементирайте следната йерархия от класове, която реализира RPG игра, като се придържате към следните напътствия за диаграмата (синтаксис на UML):
- Всеки правоъгълник отговаря на един клас.
- Стрелка от клас към клас означава, че първият клас наследява втория.
- Клас, чието име е зададено с удебелени букви, е обикновен клас, а ако е с нормални (неудебелени), е абстрактен.
- В първия раздел на всеки правоъгълник се помещават член-данните на класа.
- Всяка член-данна се задава със синтаксиса "име: тип".
- Член-данна, пред чието име има знака "-", е частна (private), ако има "#", е защитена (protected), а ако има "+" - публична (public).
- Във втория раздел на всеки правоъгълник се помещават методите на класа.
- Всеки метод се задава със синтаксиса "име(списък с параметри): тип на връщане".
- Параметрите се задават със синтаксиса "име: тип = стойност по подразбиране".
- Метод, пред чието име има знака "-", е частен (private), ако има "#", е защитен (protected), а ако има "+" - публичен (public).
Пояснения за използваните типове:
- char* е NULL-терминиран низ (C-низ).
- vector<T> е стандартният контейнер в STL (за да се използва, се включва header файл <vector>), който реализира динамичен масив от стойности от тип T. Не е задължително да ползвате точно него; ако искате, можете да си напишете собствена имплементация на динамичен масив, или да ползвате свързан списък.
Пояснения относно семантиката на играта:
Creature:
- health, offence, defence и level са числени показатели съответно за жизненост, атака, защита и ниво.
- armed определя дали съществото е в режим на защита.
- Методът attack извършва атака* и връща изършения damage. В класа Creature той е зададен като виртуален метод.
* При атака съществото (Creature) напада друго същество, като другото същество понася определено нараняване (damage), което се изважда от останалите жизнени точки (healthLeft). Damage се определя в зависимост от това дали защитаващото се същество е въоръжено (armed):
- ако Е, damage = offence на атакуващото същество - defence на защитаващото се;
- ако НЕ Е, damage = offence на атакуващото същество.
За да може съществото да атакува, съществото трябва да е armed.
Ако damage <= 0, то не се вади нищо от healthLeft-а.
Ако attackMethod != NULL, към offence се добавя damage от посочения attackMethod. NULL означава, че атаката е melee (т.е. без магии). Магии могат да се ползват само от играчи, които ги притежават в spellbook-а си.
Ако Player атакува Creature (какъвто и да е) и health на Creature-а стане 0, Player-а получава нов experience колкото level на Creature-а.
Ако Player атакува Monster и health на Monster стане 0, към gold и inventory на Player се добавят gold и items от loot-а.
Ако Player атакува Boss и health на Boss стане 0 и quest-ът на Boss-а е в списъка quests на Player-а, преместваме този quest в completedQuests. - Методът engarde кара съществото да премине в режим на защита (armed).
Player:
- При създаване на обект член-данната healthLeft се инициализира със стойността на health.
- Не може предметите от weapon и shield да се намират в inventory, докато са сложени като weapon/shield.
- Методът gainExperience добавя съответния newExperience към experience на играча. Aко experience >= 1000 * level, то вадим (1000 * level) от experience и увеличаваме level-а.
- Getter-ите за health, offence, defence връщат съответната стойност + съответните стойности от всички предмети в inventory + offence на weapon * 10 + defence на shield * 10. (Ако weapon/shield са NULL, не се добавя нищо.)
- give прехвърля предмета с даденото име (ако играчът го притежава) в inventory или добавя дадения gold към gold на посочения Player. Всички spells от въпросния предмет се добавят към spellbook на посочения играч. Връща референция към предмета или количеството останало злато у играча.
QuestGiver:
- е приятелски клас на Player.
- beginQuest: добавя quest-а в quests на играча.
- getReward: reward и experience на куеста могат да се вземат от играча само ако Quest-ът е в completedQuests на играча.
От Merchant купуваме и му продаваме предмети (добавят се и се премахват от inventory и gold) чрез buy и sell (по име на предмет). Съответно при купуване price на предмета се вади от gold-а на играча, а при продаване се прибавя към gold-а.
Не е предвидено да се създават инстанции на Creature, Character и AttackMethod (въпреки че всъщност не са абстрактни.)
Направете примерно изиграване (gameplay) на игра в main() функцията.
Качете работите си като архиви, съдържащи решението (достатъчни са .h и .cpp файловете, но можете да добавите и други, ако сметнете, че са необходими).
БОНУСИ:
- Сложите всички участващи в играта обекти в отделен клас GameState, който ще съхранява текущото състояние на играта.
- Ако ще добавяте класа GameState, добавете възможност за replay (изиграване наново) на играта (клас GamePlay), който да имплементира методите next (следваща стъпка), undo (връщане на една стъпка назад), redo (изпълняване наново на вече върнати стъпки), playAll и replay.
Подсказка: осъществява се чрез една опашка и два стека (undo и redo stack) от елементи GameState: в опашката се добавят състояния. next pop-ва front на опашката, push-ва го в undo стека, и го връща; undo pop-ва от undo стека, push-ва pop-натата стойност в redo стека, и я връща; redo върши същото, но наобратно (pop-ва от redo и push-ва в undo). playAll изпълнява next, докато има елементи в опашката; replay pop-ва от undo stack и push-ва в края на опашката, докато има елементи във въпросния стек. - Добавете възможност играчът да има различни видове екипировка освен оръжие и щит.
- Добавете член-данна skills към играча от тип списък от обекти Skill (умение). Преценете вие какво точно трябва да представлява едно умение.
- Измислете начин играчите да могат да си обменят съобщения.