Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: [PHP] "Puurakenne" hyväksytyille osille

Sivun loppuun

grandvia [09.07.2007 17:31:15]

#

Hei!

Anteeksi, että en keksinyt parempaa otsikkoa, mutta minulla on ongelma. Olen koemielessä koodaamassa eräänlaista managerointipeliä PHP:llä. Pelissä manageroidaan kuvitteellista autotiimiä. Pelimoottori on jo pitkällä, mutta nyt minulle tuli suuri ongelma. Tahtoisin tehdä peliin seuraavanlaisen "autonrakennus"-ominaisuuden, mutta minulla ei ole mitään tietoa mistä aloittaa: Eli aluksi autolle valitaan kori. Korivalinnasta riippuen voi valita erilaisia moottoreita (sama ei käy kaikkiin). Moottorin valittua, siihen täytyy löytää esimerkiksi yhteensopiva vaihdelaatikko (näissä pätee sama, kaikki eivät käy kaikkiin). Vaihdelaatikon jälkeen etsitään sitten jo seuraavaa yhteensopivaa osaa. Helpoin olisi varmaan numeroida osat ja rakentaa jonkinlainen puurakenne? Minulla vaan ei ole yhtään mitään tietoa miten sellainen rakentaminen aloitetaan PHP:llä. Kaikki neuvot ovat toivottuja! :)

esim.
Kori1 > Moottori1, Moottori2, Moottori4, Moottori8
esim. Moottori1:een käy Vaihdelaatikko1, Vaihdelaatikko2
Moottori2:een käy Vaihdelaatikko3, Vaihdelaatikko5
Moottori3:een käy Vaihdelaatikko4, Vaihdelaatikko6
jne.

Kori2 > Moottori5, Moottori2, Moottori6, Moottori7

Kori3 > Moottori1, Moottori3, Moottori4, Moottori5

edit: Ja kyllä, rekisteröidyin tätä varten. Mutta toivottavasti postaan tänne myös jatkossa, ehkä joskus vielä auttavan roolissa. Putkaa olen kuitenkin aktiivisesti seurannut vuosia! :)

kayttaja-2791 [09.07.2007 18:50:15]

#

Onko tietokantaa käytössä? Kunnollisella sql:ää tukevalla tietokannalla tuo onnistuisi kivuttomasti. Sieltä yhteensopivien osien hakukin on nopeaa, ja ylläpidollisesti se on varmaankin järkevin vaihtoehto. Vaatii tietenkin sitten tietokantatuntemusta, yhteensopivien osien relaation tekeminen ja sieltä hakeminen ei mikään läpihuutojuttu ole ellei aiempaa kokemusta relaatiotietokannoista ole. Tätä kuitenkin suosittelisin eritoten helpon ylläpidettävyyden kannalta.

Nopea ratkaisu olisi sitten tehdä ihan vain taulukko jossa on yhteensopivat osat:

<?php
$yhteensopivuus_korit_moottorit = array(
  "kori1"
     => array("moottori1", "moottori2", "moottori4", "moottori8"),
  "kori2"
    => array("moottori5", "moottori3", "moottori4", "moottori7")
  );
?>

Mutta vähän purkalta tuollainen tuntuu... Ehkä joku keksii paremman vaihtoehdon. Itsellä tuli vielä mieleen olio-pohjainen ratkaisu, missä määriteltäisiin olioille yhteensopivat osat. Mutta jos olioita ei muuten käytetä, niin tuo ei tule kysymykseen.

Tervetuloa vain putkaan, toivottavasti viihdyt :)

grandvia [09.07.2007 18:55:46]

#

Olio-pohjaista ratkaisua olen yrittänyt, mutta ei onnistu. Myslejä en osaa käyttää yhtään, joten se olisi huono ratkaisu. Olioilla varmasti olisi paras, mutta en osaa nyt aloittaa koodia lainkaan.

Unohdin muutes mainita, että tarkoituksena olisi myös tehdä ominaisuus joka näyttää kaikki mahdolliset valinnat. Sen toteuttaisin tämän puurakenteen ja for-silmukan avulla. Nyt olen vain jumissa tämän kanssa. :(

kayttaja-2791 [09.07.2007 19:42:37]

#

Tuo mainitsemani rakenne edelleenvietynä pitäisi kyllä toimia. Mutta todellakin, mitään super-yksinkertaista ratkaisua ei taida olla, joten suosittelisin ainakin kokeilemaan tietokantapohjaista ratkaisua... Samalla vaivalla mitä teet huonosti tulkittavaa ja uudelleenkäytettävää koodiin upotettua ratkaisua, voit tehdä sen oikealla tietokannalla jonka oppimisesta varmasti hyödyt tulevaisuudessa moninkertaisesti.

Tietokannat ovat kuitenkin käytännössä mukana erittäin monessa ohjelmointiprojektissa, ei paitsi nettiohjelmoinnissa. En tosin ole netistä mitään yksittäistä hyvää "Tietokannat aloittelijalle" opasta löytänyt. Itse on tullut tehtyä asiat melkolailla vaikeimman kautta, kun hyvää keskitettyä opetusta sain vasta kouluni kurssilta. Hyvän kirjan lainaaminen varmaankin auttaisi.

Mutta jos törmäät johonkin tiettyihin ongelmiin, niin kysyvä ei tieltä eksy. Eli rohkeasti vain kysymään, täällä kyllä autetaan jos vain nähdään että kysyjällä on muitakin motiiveja kuin vain saada kaikki valmiina pöytään katettuna.

grandvia [09.07.2007 20:18:19]

#

Kyllä joo tietokantojen osaamisesta olisi todella paljon hyötyä. Nykyään talletan ohjelmoinnissa käytettävät datat txt-tiedostoihin, vaikka tietenkin tietokannat olisivat parempi vaihtoehto. Pitääkin alkaa niitä harjoittelemaan.

Kiitos sinulle vinkeistäsi ja rohkaisusta! Jatkan harjoittelua.

Tuolla antamallasi taulukointivinkillä olen saanut lyhennettyä jo koodia hieman, vielä pitää tehdä näiden kaikkien mahdollisten valintojen echoominen. Minun taidoillani haastavaa, muttei varmaan mahdotonta. Kiitos vielä...

Edit:

<?php
  $offset = 0; $laskuri = 0;

while($offset = strpos($mista, $mika, $offset + 1)){
  $laskuri++;
  echo stripos($mista, $mika);
}
?>

Osaisiko joku neuvoa miksei tuo while-silmukka löydä $mika:a jos se on $mista:n ensimmäinen alkio ($mista[0])? Muut kyllä löytää. Tai oikeastaan tiedän miksi, sen takia, että heti aluksi on offsettiä, miten tuon voisi parhaiten korjata?

Edit:
Tai okei, taisin saada kuntoon :)

Antti Laaksonen [09.07.2007 22:47:58]

#

Teinpä iltapuhteeksi pienen esimerkin asiasta. Tässä valitaan autoon kori, moottori ja vaihteisto, joihin liittyy riippuvuuksia. Tässä pitäisi olla aika lailla pienin määrä koodia, jolla järjestelmän voi toteuttaa selkeästi. Ratkaisu vastaa JTS:n ajatusta, ja tämä ei ole mikään monimutkainen juttu. Suuri osa koodista johtuu siitä, että tietoa pitää siirrellä HTML:n lomakkeiden välityksellä.

Taulukossa $valinnat on kaikki autoon valitut osat. Muuttuja $vaihe ilmoittaa, mitä osaa ollaan valitsemassa. Nämä tiedot siirtyvät lomakkeen mukana hidden-kentässä. Kun erilaiset osat on pantu numeroituun taulukkoon, sama koodi kelpaa kaikkiin vaiheisiin (korin valinta, moottorin valinta, vaihteiston valinta). Taulukkoon $valinnat laitetaan heti aluksi ensimmäiseksi turha tieto "auto", jotta vältytään tyhjän taulukon erikoistapaukselta. Lomaketta varten taulukko muutetaan merkkijonoksi, jossa tiedot on erotettu pystyviivoilla.

<?php

// kaikki saatavilla olevat osat
$osat[1] = array("kori 1", "kori 2", "kori 3");
$osat[2] = array("moottori 1", "moottori 2", "moottori 3");
$osat[3] = array("vaihde 1", "vaihde 2", "vaihde 3");

// mitä pitää olla valittu, jotta moottori kelpaa
$ehdot["moottori 1"] = array("kori 1", "kori 3");
$ehdot["moottori 2"] = array("kori 2", "kori 3");
$ehdot["moottori 3"] = array("kori 1");

// mitä pitää olla valittu, jotta vaihteisto kelpaa
$ehdot["vaihde 1"] = array("moottori 1", "moottori 2");
$ehdot["vaihde 2"] = array("moottori 2");
$ehdot["vaihde 3"] = array("moottori 1", "moottori 3");

if (isset($_POST['vaihe'])) {
    // siirrytään uuteen vaiheeseen ja päivitetään valinnat
    $vaihe = $_POST['vaihe'] + 1;
    $valinnat = explode("|", $_POST['valinnat']);
    $valinnat[] = $_POST['valinta'];
} else {
    // asetetaan muuttujien alkuarvot
    $vaihe = 1;
    $valinnat = array("auto");
}

if ($vaihe < 4) {
    echo "<form action=\"auto.php\" method=\"post\">";
    echo "<p>Valitse osa $vaihe:</p>";
    echo "<select name=\"valinta\">";
    // käydään läpi kaikki tämän vaiheen osat
    foreach ($osat[$vaihe] as $osa) {
        // ykkösvaiheessa kaikki osat pääsevät,
        // muissa vaiheissa vain yhteensopivat osat
        if ($vaihe == 1 || in_array($valinnat[$vaihe - 1], $ehdot[$osa])) {
            echo "<option value=\"$osa\">$osa";
        }
    }
    echo "</select>";
    echo "<input type=\"hidden\" name=\"vaihe\" value=\"$vaihe\">";
    $val = join("|", $valinnat);
    echo "<input type=\"hidden\" name=\"valinnat\" value=\"$val\">";
    echo "<br><input type=\"submit\" value=\"Jatka\">";
    echo "</form>";
} else {
    echo "<p>Autossasi on: " . join(", ", $valinnat) . "</p>";
}

?>

Käytännössä olisi luultavasti parempi, että osista ilmoitettaisiin erikseen (yksilöllinen) tunnuskoodi ja nimi, esim. jonkin osan tunnuskoodi olisi "moottori1" ja nimi "Perusmoottori". Osia käsiteltäisiin sitten sisäisesti noilla tunnuskoodeilla, ja pelin pelaajalle taas näkyisivät oikeat nimet. Muitakin vastaavia parannuksia on helppo keksiä, mutta yllä olevassa koodissa näkyy kuitenkin ihan toimiva perusrakenne.

peg [09.07.2007 22:59:53]

#

Et Antti millään viitsisi laittaa näitä tuonne oppaaseen johonkin esimerkkeihin.
Löytyisi sitten myöhemminkin kun tarvitsee mallia.

Antti Laaksonen [09.07.2007 23:24:09]

#

Luultavasti tämä löytyy ihan hyvin haulla keskustelustakin, tai jos joku kysyy samantapaista asiaa, niin voidaan laittaa linkki tähän aiheeseen.

grandvia [10.07.2007 00:27:11]

#

Hienoa, että joku viitsii vastata noinkin kattavasti! :)

Parempaa kuin uskalsinkaan toivoa. Nyt pääsen jatkamaan ja kehittämään koodiani. Kiitos Antti Laaksonen!


Sivun alkuun

Vastaus

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

Tietoa sivustosta