Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP - Peliohjelmoinnista

unto [09.07.2008 00:05:20]

#

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?

Antti Laaksonen [09.07.2008 00:36:44]

#

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.

tsuriga [09.07.2008 03:31:31]

#

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).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta