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äytä 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ä matoa ohjataan WASD-näppäimillä ja yritetään
kerätä vihreitä pistetä.
<br />
<br />
Asetuksista voit säätää madon aloituspituutta (suositellaan
alle 50, jottei selain kaadu) ja ruoan (vihreiden pisteiden) määrää.
<br />
<br />
Mukavia pelihetkiä!</span>
<br />
<input id="Pysauta" type="button" value="Pysäytä" onclick="Pysauta();" />
<input id="Aloita" type="button" value="Aloita alusta" onclick="return onLoad();" />
<br />
<a href="javascript:AsetuksetNP();" id="AsetuksetNP">Näytä asetukset</a>
<div id="Asetukset">
<span lang="fi">Madon pituus:<input id="Pit" type="text" maxlength="3" value="5" />
<br />
Ruoan määrä:<input id="Pist" type="text" maxlength="4" value="3" />
<br />
<input id="Kauta" type="button" value="Käytä" onclick="Kauta();" />
</span>
</div>
</td>
</tr>
</table>
<input id="In" name="In" maxlength="1" size="1" />
</body>
</html>"<!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.
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...
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>Aihe on jo aika vanha, joten et voi enää vastata siihen.