Terve!
Tarvisin pseudokoodina ratkaisut seuraaviin ongelmiin:
1) Piirrän peliin kartan ja asetan sen päälle gridin divillä, jolloin karttaa voi klikkailla ja päättää mihin matkustaa. Miten etsin nopeimman reitin, joka kiertää kaikki esteet?
2) Aseissa yms. on erikoisvoimia esim. "laske vihollisen voimaa 10:llä", "nosta omaa voimaa 5:llä", "laske omaa energiaa 200:lla", "estä vihollisen lyöminen 3:na seuraavana vuorona". Miten toteutan kyseiset erikoisvoimat käymättä läpi kauheata if rykäelmää?
Mietin, että eräs vaihtoehto olisi jos kirjottaisin kantaan kaikki taiat ja jokaiselle oma php koodinpätkä, jonka evaluoisin aina esim. "$enemy_hp = $enemy_hp + 10". Mitä te ehdotatte tähän?
1) Sopiva algoritmi on leveyshaku, jossa ensin tutkitaan aloituskohdan vieressä olevat tyhjät ruudut, sitten niiden vieressä olevat tyhjät ruudut jne., kunnes lopuksi saavutetaan lopetuskohta.
Pseudokoodi on suunnilleen tällainen:
lisää jonon loppuun aloituskohta kunnes jono on tyhjä ota jonon alusta kohta x jos x on lopetuskohta, reitti on valmis käy läpi kaikki x:n naapuriruudut jos ruudussa ei ole estettä eikä sitä ole käsitelty lisää jonon loppuun naapuriruutu
Lisäksi täytyy pitää kirjaa, minkä ruudun kautta kuhunkin ruutuun on tultu.
2) Jos erikoisvoimat ovat kovin erilaisia, ainoa ratkaisu lienee kirjoittaa jokaiselle oma koodinsa. Koodin tallennus tietokantaan ei minusta ole hyvä ajatus, koska silloin koodista tulee vaikeasti hallittavaa. Muutenkin esim. tuo kolmeen vuoroon ulottuva esto taitaa olla sellainen, ettei sen toteutukseen riitä yksittäisen koodinpätkän suoritus.
2) Tee rajapinta, jonka kaikki objektit toteuttavat. Sähläsin jotain koodiakin, mutta siitä tuli niin pitkä etten jaksa vääntää juuri nyt loppuun. Jotain tällaista ajattelin yöttömässä yössäni:
<?php /* Item interface */ interface Item { public function activate( $status, Player &$bearer, &$bystanders ); public function affect(); public function reset_(); } /* Mahdollisia luokkia */ class BootsOfEscaping implements Item { ... } class Player { ... } class Monster { ... } final class CharacterController { ... } final class Game { ... } ?>
Tähän hätään en löytänyt mitään erityisen hyvää opasta rajapintoihin, mutta kysy niin kerron lisää (jos vielä muistan :p).
Aihe on jo aika vanha, joten et voi enää vastata siihen.