Kirjoittaja: Juhko
Kirjoitettu: 08.02.2009 – 08.02.2009
Tagit: pelinteko, koodi näytille, peli, vinkki
Merkkipohjainen peli, jossa ohjataan ukkoa (@) pelikentällä ja väistellään vihollisia (%). Kun ukko törmää viholliseen, alkaa uusi peli.
Peli täytyy pysäyttää "Pysäytä" -nappulasta, kun haluaa siirtyä toiselle sivulle. Tähän on syynä se, että fokus asetetaan näppäimistönlukukentälle jatkuvasti, eikä osoitekenttään (tai minnekään muualle) pysty kirjoittamaan.
Saa käyttää ja muokata vapaasti, eikä tekijää tarvitse mainita.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
<head>
<title></title>
</head>
<body>
<b><font size="6">JavaScript-merkkigrafiikkapeli</font></b>
<hr>
<script type="text/javascript">
var world_width=40;
var world_height=20;
var enemies=10;
var x = 20;
var y = 10;
var rx = x;
var ry = y;
var erx;
var ery;
var i;
var i2;
var enemyX = new Array();
var enemyY = new Array();
var rnd = 2; //satunnaislukugeneraattori
var rnd2 = 2;
var turn = 0; //siirretään vain joka toinen vuoro
var scores = 0; //pisteet
moveTimer=setTimeout(move,1); //liikutusajastin
//piirretään kenttä (reunoille seinää, muualle tyhjää)
document.write('<font size="4">');
document.write("<pre>");
for(i2=1;i2<world_height+1;i2=i2+1)
{
for(i=1;i<world_width+1;i=i+1)
{
if(i==1||i2==1||i==world_width||i2==world_height)
document.write("<a id='" + i + "," + i2 + "'>#</a>");
else
document.write("<a id='" + i + "," + i2 + "'> </a>");
}
document.write("<br>");
}
document.write("</pre>");
document.write("</font>");
document.getElementById(x+","+y).innerHTML="@"; //piirretään ukko
//luodaan ja piirretään viholliset
for(i=1;i<enemies+1;i++)
{
do {
rnd = rnd + 11
if(rnd > world_width - 1) rnd = rnd - world_width;
rnd2 = rnd2 + 4;
if(rnd2 > world_height - 1) rnd2 = rnd2 - world_height;
if(rnd > world_width - 1) rnd = 2;
if(rnd2 > world_height - 1) rnd2 = 2;
enemyX[i]=rnd;
enemyY[i]=rnd2;
document.getElementById(enemyX[i]+","+enemyY[i]).innerHTML="%";
} while((enemyX[i]==x) && (enemyY[i]==y))
}
function move()
{
var liikuttu=1;
moveTimer=setTimeout(move,1);
rx=x;
ry=y;
liikuttu=0;
if(document.controller.keys.value=="w") {y=y-1;liikuttu=1}
if(document.controller.keys.value=="s") {y=y+1;liikuttu=1}
if(document.controller.keys.value=="a") {x=x-1;liikuttu=1}
if(document.controller.keys.value=="d") {x=x+1;liikuttu=1}
//ukon törmäystunnistus
if(document.getElementById(x+","+y).innerHTML=="#") {x=rx; y=ry}
//näppäimistökäsittelijä
document.controller.keys.value="";
document.controller.keys.focus();
if(liikuttu == 1) //jos pelaaja liikkui
{
turn = 1 - turn; //siirtääkö vai eikö siirtää
for(i=1;i<enemies+1;i++) //selataan kaikki viholliset
{
document.getElementById(enemyX[i]+","+enemyY[i]).innerHTML=" "; //tyhjää vihollisen edelliselle paikalle
erx=enemyX[i]; //vihollisen nykyiset koordinaatit
ery=enemyY[i];
if(turn == 0) {
//liikutetaan vihollista pelaajaa kohti
if(enemyX[i] < x) enemyX[i] = enemyX[i] + 1;
if(enemyX[i] > x) enemyX[i] = enemyX[i] - 1;
if(enemyY[i] < y) enemyY[i] = enemyY[i] + 1;
if(enemyY[i] > y) enemyY[i] = enemyY[i] - 1;
//vihollisen törmäystunnistukset
if(document.getElementById(enemyX[i]+","+enemyY[i]).innerHTML=="%") //toinen vihollinen
{
enemyX[i]=erx; //palautetaan edelliselle paikalle
enemyY[i]=ery;
}
if(document.getElementById(enemyX[i]+","+enemyY[i]).innerHTML=="#") //seinä
{
enemyX[i]=erx; //palautetaan edelliselle paikalle
enemyY[i]=ery;
}
}
document.getElementById(enemyX[i]+","+enemyY[i]).innerHTML="%";
}
scores++; //kasvatetaan pistemäärää
document.getElementById("scoreCaption").innerHTML = scores;
}
//jos törmätään viholliseen, näytetään pistemäärä ja aloitetaan uusi peli
if(document.getElementById(x+","+y).innerHTML=="%") {
alert("Peli loppui, pisteet " + scores + ". Paina OK aloittaaksesi uuden pelin.");
newGame();
}
//ukon pyyhintä ja piirto
document.getElementById(rx+","+ry).innerHTML=" ";
document.getElementById(x+","+y).innerHTML="@";
}
function newGame() {
rnd = 2; //satunnaislukugeneraattori
rnd2 = 2;
//reunoille seinät, muualle tyhjää
for(i2=1;i2<world_height+1;i2=i2+1)
{
for(i=1;i<world_width+1;i=i+1)
{
if(i==1||i2==1||i==world_width||i2==world_height)
document.getElementById(i+","+i2).innerHTML="#";
else
document.getElementById(i+","+i2).innerHTML=" ";
}
}
//piirretään ukko
x=20;
y=10;
document.getElementById(x+","+y).innerHTML="@";
scores=0; //pisteet
//vihollisten paikat
for(i=1;i<enemies+1;i++)
{
rnd = rnd + 11
if(rnd > world_width - 1) rnd = rnd - world_width;
rnd2 = rnd2 + 4;
if(rnd2 > world_height - 1) rnd2 = rnd2 - world_height;
if(rnd > world_width - 1) rnd = 2;
if(rnd2 > world_height - 1) rnd2 = 2;
enemyX[i]=rnd;
enemyY[i]=rnd2;
document.getElementById(enemyX[i]+","+enemyY[i]).innerHTML="%";
}
}
function clearKeys() {
//tyhjennetään näppäimistökenttä
document.controller.keys.value="";
moveTimer=setTimeout("clearKeys()",1);
}
</script>
<hr>
<form name="controller">
<input type="button" value="Uusi peli" onClick="newGame()">
<input type="button" value="Pysäytä" onClick="clearTimeout(moveTimer); moveTimer=setTimeout('clearKeys()',1)">
<input type="button" value="Jatka" onClick="clearTimeout(moveTimer); moveTimer=setTimeout('move()',1)">
<br><br>
Suunta: johon haluat liikkua: <input type="text" name="keys" size="2">
</form>
Pisteet: <a id="scoreCaption">0</a>
<hr>
Peliohje: Ohjaat ukkoa (@) pelikentällä näppäimillä W,S,A,D. Peli loppuu, kun törmäät viholliseen (%). Mitä kauemmin pysyt pelikentällä, sitä enemmän pisteitä saat.
</body>
</html>Ihan hyvä vinkki. Muutama asia, jotka itse tekisin eri tavalla:
setTimeout("move()",1);Miksei näin: setTimeout(move, 1); ?
Sinun käyttämääsi tapaa näkee harmillisen usein. Se on epäselvempi ja aiheuttaa turhan kutsun eval:iin.
i==1|i2==1|i==world_width|i2==world_height
Toimiihan tuokin, mutta | on bittioperaattori ja aiheuttaa turhia tyyppimuunnoksia (eikä koskaan jätä parametreja evaluoimatta). Looginen tai on ||.
if(turn == 0) {turn = 1;} else {turn = 0;}Lyhyemmin: turn = 1 - turn;.
Tuo satunnaislukugeneraattoriviritelmä meni vähän ohi. Kannattaa tutustua Math.random:iin.
Tämä on aika kätevä näppäimistön käyttämiseen. Löytyy myös jQuery-pluginina.
Tämä ohjelma toi muistoja mieleen. Hyvä Juhko!
Mukavaa, että pidätte ohjelmasta. :)
Juu, korjasin muutaman "virheen": setTimeout("move()",1) -> setTimeout(move,1) | -> || ja turn = 1 - turn;.
Jos tällainen JS-pelien teko kiinnostaa Juhkoa enemmän, voipi hän kokeilla seuraavaan peliin tehdä taulukon (HTML:n table-elementin), jonka kenttiin laittaa eri kuvia vaihtamalla image-tägien arvoja. Kun taulukon laidat säätää vielä nollalevyisiksi, siitä tulee ihan oikea tile-pohjainen grafiikkamoottori. Ukkeleista voi tehdä osittain läpinäkyviä png-kuvia, niin niiden yhdistäminen taustakuvaan käy näpsäkästi.
(Vakavampimielinen selainpeli syntynee kuitenkin paremmin esim. Actionscriptin avulla. Adobe jakelee nykyään sitä ilmaisversiota nimeltä Flex...)
P.S. Vielä lyhyempi: turn ^= 1;
perhanan vaikee toi peli muute =(
Joo, se onkin pelin pahin puute, aluksi se on vaikee mutta sitten kun pääsee pakoon, voi helposti kerätä parikin tuhatta pistettä. Tuohonhan voisi soveltaa vaikka jotakin hippakilpailun tekoälyä. :)
enpä oo ennen moista JS.llä nähnyt kiitoksia. tätä pitää ehdottomasti firitellä... : )
Helppohan tämä peli on, kun pääsee reunoille.
Sitten menee kokoajan reunoja pitkin ja elämä kulkee hyvin
-b
Joo! Kun pääsee reunoille voi vaan kierrellä niitä ja elämä jatkuu. XD
mahtava. :))
Kiitokset.
Mahtava :D
Woo! Mä vedin 5655 pistettä!
Aivan mahtava peli!
Heh, ei tuo vielä mitään! Enkat on nyt 6654!
Hulppea peli!