Dungeons & Dudes
Selles ülesandes ehitame väga lihtsustatud lahingusimulaatori. Loome erinevad tegelased, kes suudavad omavahel duelle pidada. Duell kestab, kuni üks tegelastest langeb. Tegelased käivad kordamööda ja saavad enda käigu ajal vastast erinevate efektidega rünnata. Efektid kulutavad action pointe, mis taastuvad käigu lõpus. Efektid võivad olla ühekordse mõjuga või kesta mitu käiku, mõjudes vastase käikude alguses ja/või lõpus.
- Loo abstraktne klass Dude, kes on kõigi tegelaste aluseks. Tal on muuhulgas järgnevad omadused: accuracy, armor, health ja action points. Lisaks on tal meetod
void takeTurn(Dude attackTarget)
jaboolean isAlive()
. - Loo interface Effect, milles on järgnevad meetodid:
void onHit(Dude effectTarget);
, mille käivitab ründaja, kui vastane saab efektiga pihtavoid onTurnStart(Dude effectTarget);
, mille käivitab efektiga pihta saanud vastane iga oma käigu algusesvoid onTurnEnd(Dude effectTarget);
, mille käivitab efektiga pihta saanud vastane iga oma käigu lõpusint requiredActionPoints();
boolean isExpired();
- Loo Dude alamklassid Fighter ja Wizard. Neil on erinevad accuracy, armor, health ja action points taastumise kiirus. Fighter ja Wizard kasutavad ründamiseks erinevaid efekte.
- Loo järgnevad Effect klassi implementatsioonid (võid ise täiendavaid välja mõelda):
WeaponAttack
- vähendab pihta minemise hetkel vastase healthKnockdown
- vähendab pihta minemise hetkel vastase actionPoints 0 pealeFirebolt
- vähendab vastase käigu lõpus vastase health. efekt lõppeb pärast health vähendamist.Spiderweb
- vähendab vastase iga käigu alguses tema action points. efekt lõpeb, kui vastast on kahe tema käigu jooksul mõjutatud.
Rünnakud võivad ebaõnnestuda (vastasest mööda minna). Iga rünnaku pihta/mööda minemise tuvastamiseks kasutatakse valemit "d20 + ründaja täpsus >= vastase kaitse", kus d20 on juhuslik arv [1..20].
Ühele tegelasele saab korraga rakenduda mitu sama tüüpi effekti. Iga dude peaks ise arvet pidama, mis efektid teda hetkel mõjutavad ja iga efekt peaks ise arvet pidama, kui kaua ta veel kestab. Näiteks wizard saab vastasele kaks käiku järjest spiderweb visata, mis juhul mõjutavad vastast vahepeal korraga kaks eraldiseisvat spiderwebi.
Efekti-spetsiifiline loogika peaks olema vastava efekti klassis. Dude klassis olev ründamise loogika (takeTurn
) peaks olema üldistatud ja kõigi tegelaste/efektide puhul täpselt ühesugune. Dude ei peaks teadma, mis alamklassid tal on ega mis konkreetseid efekte ründamiseks kasutatakse. Dude alamklassid teavad, mis efektidega nad rünnata oskavad, aga mitte seda, millega neid rünnata võidakse. Selle tulemusena on võimalik lisada uusi efekte ja Dude alamklasse, ilma et peaks teisi klasse muutma.
Kuidas Dude peaks valima rünnakuks sobiva efekti, kui ta ei tea konkreetsetest efektidest midagi? Hea mõte on lisada Dude klassi abstract method efekti valimiseks. Iga alamklass saab selle endale sobival viisil implementeerida.
Mõtle välja puudu olevad muutujad ja meetodid, nii et mäng toimiks. Tekita peameetod, mis tegelasi võitlema paneb ja tulemused välja kuulutab. Main meetod loob mängu alguses kaks tegelast. Pärast seda kutsutakse kordamööda dude objektidel takeTurn meetodit, kuni võitja on selgunud. Dude objektid peavad ise suutma välja mõelda, mida nad oma käigu ajal teevad. Võitluse ajal interaktiivselt sisendit ei küsita.