Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: JavaScript: Matopeli

Hennkka [20.11.2010 15:23:53]

#

Yksinkertainen matopeli JavaScriptillä. Peliä voi testata tästä.

Koodi on mieletäni hyvin kommentoitua (paitsi HTML-osuus on vähän sekava).

<html>
<head>
    <title>Matopeli</title>
    <script language="javascript" type="text/javascript">
        // <!CDATA[

        var x = 0, y = 0, Suunta = 2, Pituus = 5;       //Varataan x, y, suunta ja pituudelle
        var x2 = new Array(), y2 = new Array();         //Madon pisteiden sijainnit
        var t;                                          //Timeout (ajastin
        var l = 50, k = 50;                             //Alueen koko
        var hx = new Array(), hy = new Array(), Pisteet = 0, Määrä = 3; //Pisteiden sijaintitaulukot, omat pisteet ja pisteitä kaikkiaan
        var i = 0;                                      //Looppeja varten
        var Pyorii = false;                             //pyöriikö peli
        //Alustaminen
        function onLoad() {
            document.getElementById("Pysauta").value = "Aloita";            //Asetetaan aloitus/pysäytä napin arvo
            document.getElementById("Asetukset").style.display = "none";    //Asetetaan asetukset piilotetuiksi
            clearTimeout(t);                                                //Tyhjennetään ajastin
            //Asetetaan alustasta punainen
            for (x = 0; x < l; x++) {
                for (y = 0; y < k; y++) {
                    Hae(x, y).bgColor = "#FF0000";
                }
            }
            //Asetetaan madon sijainti taulukkoon
            for (i = 0; i <= Pituus; i++) {
                x2[i] = i; y2[i] = 0;
            }
            //Sijainti ja suunta
            x = Pituus;
            y = 0;
            Suunta = 2;
            //Peli ei pyöri
            Pyorii = false;
            //Asetetaan pisteet ja pisteiden sijainnit
            Pisteet = 0;
            for (i = 0; i < Määrä; i++) {
                hx[i] = l - 1; hy[i] = k - 1;
                Pojo(i);
            }
        }
        //Hakee pisteen tietystä sijainnista
        function Hae(x, y) {
            return document.getElementById("R" + x.toString() + " " + y.toString())
        }
        //Pelin päivitys
        function Tarkista() {
            Pyorii = true;                                  //Peli pyörii
            t = setTimeout("Tarkista();", 100);             //Ajastin
            document.getElementById("In").focus();          //Asetetaan focus inputille
            var Arvo = document.getElementById("In").value; //Ja luetaan sen arvo
            //Ja käsotellään se
            //If-lauseet: Tarkistetaan ettei vain tehdä 180 asteen käännöstä
            switch (Arvo.toLowerCase()) {
                case "a":
                    if (Suunta != 2) Suunta = 1;
                    break;
                case "d":
                    if (Suunta != 1) Suunta = 2;
                    break;
                case "w":
                    if (Suunta != 4) Suunta = 3;
                    break;
                case "s":
                    if (Suunta != 3) Suunta = 4;
                    break;
            }
            //tuhjennetään tekstikenttä
            document.getElementById("In").value = "";
            //Ja piirretään
            Piirra();
        }
        //Piirtää madon
        function Piirra() {
            //Jos madon "hännän" päällä ei ole pistettä, väritettään se punaiseksi (taustaksi)
            if (Hae(x2[0], y2[0]).bgColor != "#00FF00")
                Hae(x2[0], y2[0]).bgColor = "#FF0000";

            //Käsitellään madon suunta
            switch (Suunta.toString()) {
                case "1":
                    x = x - 1;
                    break;
                case "2":
                    x = x + 1;
                    break;
                case "3":
                    y = y - 1;
                    break;
                case "4":
                    y = y + 1;
                    break;
            }
            //Siirretään taulukkoa, jotta madon häntä olisi paikalla 0
            for (i = 0; i < Pituus; i++) {
                x2[i] = x2[i + 1];
                y2[i] = y2[i + 1];
                if (x == x2[i] && y == y2[i]) Hävisit();    //Jos törmättiin
            }
            //Reunan yli meno
            x = x % l; y = y % k;
            if (x < 0) x = l - 1;
            if (y < 0) y = k - 1;
            //Pisteiden tarkistus
            for (i = 0; i < Määrä; i++) {
                if (x == hx[i] && y == hy[i]) {
                    Pisteet = Pisteet + 1;  //Lisätään pisteitä
                    Pituus = Pituus + 1;    //Ja madon pituutta
                    Pojo(i);                //Sijoitetaan piste uusiksi
                    break;
                }
            }
            //Taulukon viimeisestä madon pää
            x2[Pituus] = x; y2[Pituus] = y;
            //Ja väritetään se
            Hae(x, y).bgColor = "#0000FF";
        }
        function Hävisit() {
            //Pysäytetään ajastin
            clearTimeout(t);
            //Ilmoitetaan häviämisestä
            alert("Hävisit:(");

            //Alustetaan peli

            //Asetetaan aloitus/pysäytä napin arvo
            document.getElementById("Pysauta").value = "Aloita";
            //Taulukosta taas punainen
            for (x = 0; x < l; x++) {
                for (y = 0; y < k; y++) {
                    Hae(x, y).bgColor = "#FF0000";
                }
            }
            //Ladataan asetukset samalla
            Pituus = parseInt(document.getElementById("Pit").value);    //Luetaan pituus
            Määrä = parseInt(document.getElementById("Pist").value);    //Luetaan pisteiden määrä
            //Madon taulukon alustus
            for (i = 0; i <= Pituus; i++) {
                x2[i] = i; y2[i] = 0;
            }
            //Ja madon alustus
            x = Pituus;
            y = 0;
            Suunta = 2;
            //Peli on pausella
            Pyorii = false;
            //Ja vielä pisteet
            Pisteet = 0;
            for (var i2 = 0; i2 < Määrä; i2++) {
                hx[i2] = l - 1; hy[i2] = k - 1;
                Pojo(i2);
            }
        }
        function Pojo(i) {
            //Pisteet pelaajan näkyviin
            document.getElementById("P").innerHTML = Pisteet.toString();
            //Vanha piste punaiseksi (taustaksi)
            Hae(hx[i], hy[i]).bgColor = "#FF0000";
            //Arvotaan uusi pisteen sijainti
            var ux = Math.round(Math.random() * (l - 1));
            var uy = Math.round(Math.random() * (k - 1));

            //Tarkistetaan ettei kaksi pistettä mene päällekkäin
            for (j = 0; j < Määrä; j++) {
                if (ux == hx[j] && uy == hy[j] && i != j) {
                    Pojo(i);        //Jos pisteessä onkin piste niin kutsutaan itseä
                    break; break;   //Ei suoriteta funktiota loppuun
                }
            }
            //Asetetaan arvo
            hx[i] = ux;
            hy[i] = uy;
            //Ja pisteestä vihreä
            Hae(hx[i], hy[i]).bgColor = "#00FF00";
        }
        //Asetusten näyttö ja piilotus (ks. https://www.ohjelmointiputka.net/koodivinkit/23850-javascript-tekstin-piilotus-n%C3%A4ytt%C3%B6 )
        function AsetuksetNP() {
            if (document.getElementById("Asetukset").style.display == "") {
                document.getElementById("Asetukset").style.display = "none";
                document.getElementById("AsetuksetNP").innerHTML = "N&auml;yt&auml; asetukset"
            }
            else {
                document.getElementById("Asetukset").style.display = "";
                document.getElementById("AsetuksetNP").innerHTML = "Piilota asetukset"
            }
        }
        //pysäyttää pelin
        function Pysauta() {
            if (Pyorii) {
                //Pelin pyöriessä pysäytetään peli ja laitetaan teksti "Jatka"
                document.getElementById("Pysauta").value = "Jatka";
                clearTimeout(t);
                Pyorii = false;
            }
            else {
                //Pelin ollessa pysäytettynä jatketaan peliä ja tekstiksi "Pysäytä"
                document.getElementById("Pysauta").value = "Pysäytä";
                t = setTimeout("Tarkista();", 100);
                Pyorii = true;
            }
        }
        //Kun asetuksia muutetaan
        function Kauta() {
            Pituus = parseInt(document.getElementById("Pit").value);    //Luetaan pituus
            Määrä = parseInt(document.getElementById("Pist").value);    //Luetaan pisteiden määrä
            onLoad();                                                   //Ja alustetaan peli
        }
        // ]]>
    </script>
</head>
<body onload="return onLoad();">
    <span lang="fi">Pisteesi:</span><span id="P"></span>
    <table>
        <tr>
            <td>
                <table width="500" height="500">
                    <script language="javascript" type="text/javascript">
                        //Luodaan taulukko (helpompaa näin)
                        for (i = 0; i < k; i++) {
                            document.write("<tr>");                                                                 //Uusi rivi
                            for (j = 0; j < l; j++) {
                                document.write("<td id='" + "R" + j.toString() + " " + i.toString() + "'</td>");    //Uusi sarake riville
                            }
                            document.write("</tr>");                                                                //Lopetetaan tagi
                        }
                    </script>
                </table>
            </td>
            <td>
                <span lang="fi">Sinist&auml; matoa ohjataan WASD-n&auml;pp&auml;imill&auml; ja yritet&auml;&auml;n
                    ker&auml;t&auml; vihreit&auml; pistet&auml;.
                    <br />
                    <br />
                    Asetuksista voit s&auml;&auml;t&auml;&auml; madon aloituspituutta (suositellaan
                    alle 50, jottei selain kaadu) ja ruoan (vihreiden pisteiden) m&auml;&auml;r&auml;&auml;.
                    <br />
                    <br />
                    Mukavia pelihetki&auml;!</span>
                <br />
                <input id="Pysauta" type="button" value="Pys&auml;yt&auml;" onclick="Pysauta();" />
                <input id="Aloita" type="button" value="Aloita alusta" onclick="return onLoad();" />
                <br />
                <a href="javascript:AsetuksetNP();" id="AsetuksetNP">N&auml;yt&auml; asetukset</a>
                <div id="Asetukset">
                    <span lang="fi">Madon pituus:<input id="Pit" type="text" maxlength="3" value="5" />
                        <br />
                        Ruoan m&auml;&auml;r&auml;:<input id="Pist" type="text" maxlength="4" value="3" />
                        <br />
                        <input id="Kauta" type="button" value="K&auml;yt&auml;" onclick="Kauta();" />
                    </span>
                </div>
            </td>
        </tr>
    </table>
    <input id="In" name="In" maxlength="1" size="1" />
</body>
</html>

Metabolix [05.01.2011 18:26:36]

#

"<!CDATA[" on väärin kirjoitettu, oikein olisi "<![CDATA[".

Toteutus ei ole kovin mallikelpoinen. Esimerkiksi globaali muuttuja i silmukoita varten on melkoista pelleilyä ja aiheuttaa helposti virheitä, jos jossain silmukassa kutsutaan funktiota, joka sisältää myös silmukan.

Koodi on myös sekavaa, eikä asiaa varmasti auta se, että vinkistä puuttuu kokonaan selostus koodin rakenteesta ja pelin sisällöstä. Luin koodia useita minuutteja, ja pääsin tuskin alkuun sen ymmärtämisessä; jos tuon mittainen koodi olisi hyvin kirjoitettu, olisin minuutissa tarkistanut sen perusrakenteen ja tässä ajassa jo selvittänyt melko perusteellisesti koko toiminnan. Nyt sen sijaan en jaksa edes tutkia koodia loppuun asti.

Hennkka [05.01.2011 19:31:24]

#

Tiedän että se on todella sekavaa ja näin jälkeen päin ajateltuna en ihmettele, ettei julkaistu. CDATA juttu on Visual Studion tekemä, enkä sellaista edes lisää omiin koodeihini. Pitäisi varmaan...

Metabolix [06.01.2011 00:30:38]

#

CDATA-lohko on tarpeen JS- ja CSS-koodin ympärillä (turvallisimmin /*-*/-kommentin sisällä), jotta sivu olisi validia XHTML:ää kyseisissä koodeissa esiintyvistä merkeistä < ja > huolimatta. Kuitenkin vielä parempi on laittaa erilliset koodit erillisiin tiedostoihin ja liittää ne sivulle tähän tapaan:

<script type="text/javascript" src="koodi.js"></script>
<style type="text/css">
  @import url("tyyli.css");
</style>

Vastaus

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

Tietoa sivustosta