Itse en ole vielä kerennyt edes asiaan tutustuaan, mutta ajattelin kysyä kuitenkin, jos teillä olisi antaa hyviä vinkkejä.
Jos minulla on 4x8 taulu, niin miten saisin taulun soluihin satunnaisen id:n 1-10
PS. Tämä siksi, että suunnittelen, miten olisi helppo toteuttaa yksinkertainen muistipeli sovellus.
Apuna, php, mysql sekä javascript.
Onko kenelläkään hyviä ideoita ?
Pistä taulukkomuuttuja kasaan jossa on numerot järjestyksessä, sitten valitset jäljellä olevien lukumäärän mukaan satunnaisen ID:n jonka vedät irti taulukosta, olikohan se array_pop jolla saa elementin vaikka keskeltä irroitettua (en ole sattunut tarvitsemaan, mutta bongannut sen pariin kertaan funktiolistauksesta). Sitten jatkat poistelua siihen asti kunnes on vaan yksi jäljellä, joka on jo itsestäänselvä sijoittaa viimeiseksi satunnoituun taulukkoon.
array_shift
ottaa alusta, array_splice
keskeltä ja array_pop
lopusta. Range
, shuffle
ja array_pop
-kombinaatiolla toteuttaisin satunnaisen uniikkien ID:iden hakemisen, mutta haettiinko tässä nyt sitä? Kun noita soluja on enempi entä id:itä..
JavaScriptissä Math.random
palauttaa satunnaisluvun väliltä 0-1. Taulukon saa täytettyä kokonaisluvuilla väliltä 1-10 näin:
var taulu = new Array(8), i, j; for (i = 0; i < 8; i++) { taulu[i] = new Array(4); for (j = 0; j < 4; j++) { taulu[i][j] = Math.floor(Math.random() * 10 + 1); } }
Kiitoksia näistä vastauksista. Pitää alkaa illalla kokeilemaan ja vielä palaan aika varmaan asiaan.
Jos tarkoitus on, että taulukossa ei ole mitä tahansa arvoja, vaan esim. jokaista arvoa kaksi kertaa, kuten muistipelissä yleensä on, yksi hyvä kikka on sijoittaa aluksi kaikki arvot taulukkoon järjestyksessä ja sitten vaihtaa riittävän monta kertaa kaksi satunnaisesti valittua arvoa keskenään, jolloin taulukko menee sekaisin.
Ajattelin lähteä etenemään niin, että pari löytyy aina logiikalla tulos = 1
Eli
1-2 = -1
3-4 = -1
5-6 = -1
jne...
Eli teen taulukon, jossa id:t 1,2,3,4,5......
Kun löytyy tulos = -1, niin pari on löytynyt.
Tuo onkin ihan ovela mekanismi. Eli käytännössä kaksi kuvaa, joilla on peräkkäiset tunnusnumerot (joista pienempi on pariton), muodostavat parin.
# Luodaan taulukko, jossa luvut 1-10 $numerot = range(1, 20); # Sekoitetaan numerot shuffle($numerot); # Luodaan taulun aloitustagi echo '<table align="center" border="1">'; # Listataan taulun osat muuttujiin ja käydään ne läpi each:hilla. while(list(, $numero) = each($numerot)) { ## Eli tässä 0000123 echo "<td id='$numero' class='nurin_td' onclick=\"alert(id)\"> </td>"; } echo '</table>'; ?>
Miten voin lasket tuossa ##0000123 kohdassa, että joka viides arvo tulostetaan <tr> tagit, että saisin tuon kasattua neljälle eri riville.
Vasta_alkaja kirjoitti:
Miten voin lasket tuossa ##0000123 kohdassa, että joka viides arvo tulostetaan <tr> tagit, että saisin tuon kasattua neljälle eri riville.
https://www.ohjelmointiputka.net/oppaat/opas.
Tässä on vaihtoehdot, millä pari täsmää.
1-2 = -1
2-1 = 1
Kaksi perättäistä 1-2 2-1 Pienempi aina pariton.
Vasta_alkaja: miksi noin vaikeasti, kun voisit laittaa jokaiselle "kortille" saman arvon, jotka ovat toistensa pareja. Eli 1 on 1:n pari ja 2 on 2:n pari. Jokaista numeroa olisi siis kaksi kappaletta (ts. pari) taulukossa.
Taulukko voisi olla vaikka (tosin sekoitettuna), uskoisin että taulukon arvojen tarkistus olisi näin paljon yksinkertaisempaa.
1122 3344 5566 7788
edit:
eli siis kuten Antti jo aikaisemmin sanoi. En näe mitä hyötyä tuolla "peräkkäisellä" numeroinnilla saavutetaan (1-2 = -1), kun voidaan vertailla suoraan ( 1 = 1 )
funktio kirjoitti:
JavaScriptissä
Math.random
palauttaa satunnaisluvun väliltä 0-1. Taulukon saa täytettyä kokonaisluvuilla väliltä 1-10 näin:var taulu = new Array(8), i, j; for (i = 0; i < 8; i++) { taulu[i] = new Array(4); for (j = 0; j < 4; j++) { taulu[i][j] = Math.floor(Math.random() * 10 + 1); } }
Eikös tuossa laiteta taulukkoon kokonaislukuja väliltä 1-11, eikä 1-10?
Jos Math.random() = 1, niin Math.random() * 10 + 1 = 11. Vai olenko kenties väärässä?
Olet väärässä.
Math.random() * 10 palauttaa luvun 0 - 9.99999999, joka Math.floorin läpi käytettyä saa arvon 0 - 9, ja tähän kun lisätään +1, niin saadaan tulokseksi 1-10.
edit:
offtopic:
Liian usein näen Math.round():a käytettävän Math.randomin kanssa, jolloin saadaan tulos välillä 0-1 ( Math.round( Math.random()*10 ) = 0-10 ), tosin, todennäköisyydet ensimmäiselle (0) ja viimeiselle (10) esiintyä on paljon pienemmät kuin kaikille muille luvuille, ja näin ollen Math.round()-funktiota ei saa koskaan käyttää satunnaislukujen pyöristämiseen.
Kenelläkään vinkkejä, ajax-sista hyviä oppaita..
Eli ongelmana on se, että valittuani kortin. (id) valittuani toisen (id) aikaisempi on jo historiaa. Eli pitäisi saada hieman vuorovaikutteisuutta vai onnistuuko se ihan perus javascriptillä.
Tarkoitatko suunnilleen tällaista järjestelmää?
<script> var tila = 0; var eka, toka; function valinta(kortti) { if (tila == 0) { eka = kortti; tila = 1; } else if (tila == 1) { toka = kortti; alert("Valitsit kortit " + eka + " ja " + toka); tila = 0; } } </script> <img width="100" height="100" onclick="valinta(1);"> <img width="100" height="100" onclick="valinta(2);"> <img width="100" height="100" onclick="valinta(3);"> <img width="100" height="100" onclick="valinta(4);"> <img width="100" height="100" onclick="valinta(5);">
Tämän voi tehdä myös PHP:llä, joskin sivu täytyy ladata uudestaan välillä.
Suunnilleen tuota.. Eiköhän se tuosta irtoa. Lähdin itse heti ajattelemaan tuota liian monimutkaisella tavalla.
Ennen kuin tästä jatkan, niin haluaisin kommenttia.
Ei näin vaan näin :D
<html> <head> <style type="text/css"> .Pelilauta{ vertical-align:middle; height:50% } .pohja{ background:rgb(191,191,191); border-width:1px 2px 2px 2px; border-style:groove; border-color:grey; } body{ background:; } .nurin_td{ border:1px solid black; height:105px; width:100px; background:teal; } </style> <script type="text/javascript"> var tila = 0; var eka, toka, lopputulos; function valinta(kortti) { if (tila == 0) { eka = kortti; if(kortti == 1 || kortti == 2) document.getElementById(kortti).style.background = "red"; if(kortti == 3 || kortti == 4) document.getElementById(kortti).style.background = "green"; if(kortti == 5 || kortti == 6) document.getElementById(kortti).style.background = "blue"; if(kortti == 7 || kortti == 8) document.getElementById(kortti).style.background = "brown"; if(kortti == 9 || kortti == 10) document.getElementById(kortti).style.background = "yellow"; if(kortti == 11 || kortti == 12) document.getElementById(kortti).style.background = "orange"; if(kortti == 13 || kortti == 14) document.getElementById(kortti).style.background = "mediumvioletred"; if(kortti == 15 || kortti == 16) document.getElementById(kortti).style.background = "yellowgreen"; if(kortti == 17 || kortti == 18) document.getElementById(kortti).style.background = "olive"; if(kortti == 19 || kortti == 20) document.getElementById(kortti).style.background = "indigo"; tila = 1; } else if (tila == 1) { if(kortti == 1 || kortti == 2) document.getElementById(kortti).style.background = "red"; if(kortti == 3 || kortti == 4) document.getElementById(kortti).style.background = "green"; if(kortti == 5 || kortti == 6) document.getElementById(kortti).style.background = "blue"; if(kortti == 7 || kortti == 8) document.getElementById(kortti).style.background = "brown"; if(kortti == 9 || kortti == 10) document.getElementById(kortti).style.background = "yellow"; if(kortti == 11 || kortti == 12) document.getElementById(kortti).style.background = "orange"; if(kortti == 13 || kortti == 14) document.getElementById(kortti).style.background = "mediumvioletred"; if(kortti == 15 || kortti == 16) document.getElementById(kortti).style.background = "yellowgreen"; if(kortti == 17 || kortti == 18) document.getElementById(kortti).style.background = "olive"; if(kortti == 19 || kortti == 20) document.getElementById(kortti).style.background = "indigo"; toka = kortti; lopputulos = eka - toka; if(lopputulos == -1 || lopputulos == 1) { document.getElementById(eka).style.background ="black"; document.getElementById(toka).style.background ="black"; tila = 0; } else { alert('Parit eivät täsmänneet'); document.getElementById(eka).style.background ="teal"; document.getElementById(toka).style.background ="teal"; tila = 0; } } } </script> <title>Muistipeli</title> </head> <body> <form name="muistipeli" method="post" action="<?php $_SERVER['PHP_SELF']; ?>"> <?php echo '<pre>', print_r($_REQUEST) ,'</pre>'; # Luodaan taulukko, jossa luvut 1-10 $numerot = range(1, 20); # Sekoitetaan numerot shuffle($numerot); ?> <center><h3> MUISTIPELI </h3></center> <table border="0" align="center" height="80%" class="pohja"><tr><td> </td> <tr><td> <?php # Luodaan taulun aloitustagi echo '<table class="Pelilauta" align="center" border="1" width="90%">'; # Luodaan laskuri, ja alustetaan se nollaksi $laskuri = 0; $riviTulostettu = false; # Listataan taulun osat muuttujiin ja käydään ne läpi each:hilla. foreach($numerot as $numero) { if($laskuri++ % 5 == 0) { if($riviTulostettu) { echo '</tr>'; } echo '<tr>'; $riviTulostettu = true; } echo "<td id='$numero' class='nurin_td' onclick=\"valinta($numero)\"> </td>"; } if($laskuri > 0) { echo "</tr>"; } echo '</table>'; ?> </td></tr> <tr><td> </td></tr> </table> </form> </body>
Vasta_alkaja kirjoitti:
Ennen kuin tästä jatkan, niin haluaisin kommenttia.
Turhan paljon toistoa, laita värit taulukkoon ja ota siitä sitten oikea. Ja "mediumvioletred"
yms. eivät taida olla ihan standardin mukaisia, käyttäisin mieluummin "#rrggbb"
-merkintää.
<script type="text/javascript"> var kortti_valittu = false; var eka, toka, lopputulos; var varit = ["red", "green", "blue", ...]; function valinta(kortti) { document.getElementById(kortti).style.backgroundColor = varit[Math.floor((kortti - 1) / 2)]; if (!kortti_valittu) { kortti_valittu = true; eka = kortti; } else { toka = kortti; lopputulos = eka - toka; if(lopputulos == -1 || lopputulos == 1) { document.getElementById(eka).style.backgroundColor = "black"; document.getElementById(toka).style.backgroundColor = "black"; } else { alert('Parit eivät täsmänneet'); document.getElementById(eka).style.backgroundColor = "teal"; document.getElementById(toka).style.backgroundColor = "teal"; } kortti_valittu = false; } } </script>
Lisäksi tekisin korttien sekoittamisen mieluummin JavaScriptillä, koska se on todella helppo juttu ja siten muistipeli ei olisi niin riippuvainen palvelimesta.
Thanks.. Juuri tätä hain..
Perskele..
Logiikkanihan **** ihan silmille.
13-14 = -1 14-15 = -1
Eli <- 14 -> molemmin puolin olikin mahdollisuus ottaa kortti. Dam Dam Dam..
Miten kannattaisi toteuttaa tämä
1122 3344 5566 7788
taulukko ja sen sekoitus.
Vasta_alkaja kirjoitti:
Miten kannattaisi toteuttaa tämä
1122
3344
5566
7788taulukko ja sen sekoitus.
Tässä yksi tapa:
var kortit = [], i; for (i = 1; i < 9; i++) { kortit.push(i, i); } var kortit_sekaisin = []; while (kortit.length > 0) { // otetaan yksi satunnainen kortti kortit_sekaisin.push(kortit.splice(Math.floor(Math.random() * kortit.length), 1)); }
Vasta_alkaja kirjoitti:
Eli <- 14 -> molemmin puolin olikin mahdollisuus ottaa kortti. Dam Dam Dam..
Jos vaadit, että pienemmän numeron täytyy olla pariton, niin tämä ongelma poistuu.
Antti Laaksonen kirjoitti:
Jos vaadit, että pienemmän numeron täytyy olla pariton, niin tämä ongelma poistuu.
Vertailun voisi myös tehdä Math.ceil(x / 2) == Math.ceil(y / 2)
tai x + x%2 == y + y%2
. Mutta olen Lebe80:n kanssa samaa mieltä, selkeämpää jos taulukossa on jokainen luku kahdesti.
Tässä tämänhetkinen toimiva versio. Mietin vain miten kannattaisi toteuttaa tuo, kortin löytyminen. Mustaksi vain sen värittäminen ei ole hyvä, käyttäjä voi valita sen uudelleen. Tietenkin tiedot voisi kerätä taulukkoo ja jos on jo löydetty ei reagoida. En tiedä onko sekään hyvä vaihtoehto.
Jos kentät vain piilottaa, vaihtaa laudan taulut paikkaa.
Onko kenelläkään hyviä ideoita tähän toteutukseen.
<html> <head> <style type="text/css"> .Pelilauta{ vertical-align:middle; height:400px; width:425px; } .pohja{ background:rgb(191,191,191); border-width:1px 2px 2px 2px; border-style:groove; border-color:grey; } body{ background:; } .nurin_td{ border-width:1px 2px 2px 2px; border-style:groove; border-color:grey; height:90px; width:85px; background:teal; } </style> <script type="text/javascript"> var tila = 0; var eka, toka, lopputulos; var varit = ["red", "green", "#9999ff","#cc0099","#990033","#660000","#330099","#999966","#3399ff","#3333ff"]; function valinta(kortti) { document.getElementById(kortti).style.backgroundColor = varit[Math.floor((kortti - 1) / 2)]; if (tila == 0) { eka = kortti; tila = 1; } else if (tila == 1) { toka = kortti; lopputulos = eka - toka; var pienempiKortti = (Math.min(eka, toka)); var jakojaannos = pienempiKortti%2; if(jakojaannos == 1 && (lopputulos == -1 || lopputulos == 1)) { document.getElementById(eka).style.background ="black"; document.getElementById(toka).style.background ="black"; tila = 0; } else { alert('Parit eivät täsmänneet'); document.getElementById(eka).style.background="teal"; document.getElementById(toka).style.background ="teal"; // var NaytaKortit = setTimeout(tila = 0)",5000) tila = 0 } } } </script> <title>Muistipeli</title> </head> <body> <form name="muistipeli" method="post" action="<?php $_SERVER['PHP_SELF']; ?>"> <?php # Luodaan taulukko, jossa luvut 1-10 $numerot = range(1, 20); # Sekoitetaan numerot shuffle($numerot); ?> <center><h3> MUISTIPELI </h3></center> <table border="0" align="center" height="80%" class="pohja"><tr><td> </td> <tr><td> <?php # Luodaan taulun aloitustagi echo '<table class="Pelilauta" align="center" border="1" width="90%">'; # Luodaan laskuri, ja alustetaan se nollaksi $laskuri = 0; $riviTulostettu = false; # Listataan taulun osat muuttujiin ja käydään ne läpi each:hilla. foreach($numerot as $numero) { if($laskuri++ % 5 == 0) { if($riviTulostettu) { echo '</tr>'; } echo '<tr>'; $riviTulostettu = true; } echo "<td id='$numero' class='nurin_td' onclick=\"valinta($numero)\"> </td>"; } if($laskuri > 0) { echo "</tr>"; } echo '</table>'; ?> </td></tr> <tr><td> </td></tr> </table> </form> </body>
Vasta_alkaja kirjoitti:
Mustaksi vain sen värittäminen ei ole hyvä, käyttäjä voi valita sen uudelleen.
Tuon ongelman saa korjattua esim. näin:
document.getElementById(eka).removeAttribute("onclick"); document.getElementById(toka).removeAttribute("onclick");
Vasta_alkaja kirjoitti:
Tietenkin tiedot voisi kerätä taulukkoo ja jos on jo löydetty ei reagoida.
Itse luultavasti tekisin pelistä olion, jossa on korttien tiedot yms. Mutta se vaatisi aika paljon muutoksia.
Thanks.. Tuo oli juuri sitä taas mitä kaipasin.
Taidat olla perehtynyt javascriptin saloihin aika lailla. '
Olion luomisesta voit kyllä laittaa minulle tietoa, jos se ei paljon vaadi aikaasi ja sinulla on mielenkiintoa siihen.
Tämän pelin tekemisen takoituskin minulla on vain tutustua erillaisiin menetelmiin ohjelmoida ja saada uusia näkökulmia asioiden toteuttamiseen. Täältä olen saanut paljon apua ja uusia ideoita. Se on vaan niin jännään, kun näinkin "yksinkertaisen" asian luomisessa pitää ottaa niin monta eri asiaa huomioon ja javascriptistä minun kokemukseni on aikalailla onclick="alert('apua')"; tietoa.
Miten javascriptin setTimeout -funktiota voidaan hyödyntää. Voiko sen määrittää antamaan muuttujalle arvon ilman että sillä määrätään suorittamaan erillinen funktio.
Voit käyttää nimetöntä funktiota:
setTimeout(function () { muuttuja += 5 }, 3000);
Kiitoksia tästä.
Hei,
Saisinko miten rekisteröityä itselleni muistiin, löydettyjen korttien määrän ja kirjoitettua sen talteen input kenttään.
Yritän tämmöistä :
document.muistipeli.maara.innerHTML = 1;
jne... Mutta tuo ei kirjoita kenttään maara mitään.
<html> <head> <style type="text/css"> .Pelilauta{ vertical-align:middle; height:490px; width:558px; } .pohja{ padding:8px; background:url(./tausta.gif); border-width:1px 2px 2px 2px; border-style:groove; border-color:grey; } body{ background:; } .nurin_td{ border-width:1px 2px 2px 1px; border-style:outset; border-color:blue; height:95px; width:116px; background:skyblue; } .havaittu_td{ height:95px; width:116px; } #div{ position: absolute; background-color:black; width: 100%; height:100%; overflow: hidden; font-size: xx-small; z-index: 5; opacity: 0.0; filter:alpha(opacity=00); } </style> <script type="text/javascript"> // Luodaan muuttujat var tila = 0; var eka, toka, lopputulos; // Sijoitetaan korttien kuvat taulukkoon var varit = [ "url(./kortti1.gif)", "url(./kortti2.gif)", "url(./kortti3.gif)", "url(./kortti4.gif)", "url(./kortti5.gif)", "url(./kortti6.gif)", "url(./kortti7.gif)", "url(./kortti8.gif)", "url(./kortti9.gif)", "url(./kortti10.gif)" ]; function valinta(e, kortti) { if(!e) { var e = window.event; } document.getElementById(kortti).style.background = varit[Math.floor((kortti - 1) / 2)]; if (tila == 0) { eka = kortti; tila = 1; } else if (tila == 1) { toka = kortti; // Katsotaan mikä on korttien yhteenlaskettu tulos lopputulos = eka - toka; // Katsotaan mikä on pienemmän kortin arvo var pienempiKortti = (Math.min(eka, toka)); // Katsotaan mikä on pienemmän kortin jakojäännös var jakojaannos = pienempiKortti%2; // Jos jakojäännös on yksi ja lopputulos -1 tai 1 löydetään pari if(jakojaannos == 1 && (lopputulos == -1 || lopputulos == 1)) { // Vaihdetaan korttien luokan nimi document.getElementById(eka).className ="havaittu_td"; document.getElementById(toka).className ="havaittu_td"; // Annetaan korteille pohjan mukainen tausta document.getElementById(eka).style.background="url(./tausta.gif); "; document.getElementById(toka).style.background ="url(./tausta.gif); "; // Otetaan korteista onclik- atribuutti pois document.getElementById(eka).removeAttribute("onclick"); document.getElementById(toka).removeAttribute("onclick"); // Määrätään tila alkamaan uudelleen alusta tila = 0; } else { // Jos kortteja ei löydetä, luodaan läpinäkyvä divikkuna peittämään lauta var divPeitto = document.getElementById('div'); // Annetaa div-ikkunalle sijainti divPeitto.style.left = + 0 + "px"; divPeitto.style.top = + 0 + "px"; // Tuodaan div-ikkuna esiin divPeitto.style.display = "block"; // Aloitetaan nimetön functio, suoritus on ajanmukainen setTimeout(function () { // Laitetaan korteille taas ns. pimeä puoli näkyviin document.getElementById(eka).style.background="skyblue"; document.getElementById(toka).style.background ="skyblue"; // Otetaan peitto pois, jotta peliä voidaan jatkaa. divPeitto.style.display = "none"; // Annetaan muuttujalle tila arvoksi 0 tila = 0; // Määritetään aika, kauanko kortit ovat esillä }, 1000); } } } </script> <title>Muistipeli</title> </head> <body> <form name="muistipeli" method="post" action="<?php $_SERVER['PHP_SELF']; ?>"> <?php # Luodaan taulukko, jossa luvut 1-10 $numerot = range(1, 20); # Sekoitetaan numerot shuffle($numerot); ?> <div style="display:none;" id="div"> asfasf</div> <center><h3> MUISTIPELI </h3></center> <table border="0" align="center" height="80%" class="pohja"> <tr><td> <?php # Luodaan taulun aloitustagi echo '<table class="Pelilauta" align="center" border="0" width="90%">'; # Luodaan laskuri, ja alustetaan se nollaksi $laskuri = 0; $riviTulostettu = false; # Listataan taulun osat muuttujiin ja käydään ne läpi each:hilla. foreach($numerot as $numero) { if($laskuri++ % 5 == 0) { if($riviTulostettu) { echo '</tr>'; } echo '<tr>'; $riviTulostettu = true; } echo "<td id='$numero' class='nurin_td' onclick=\"valinta(event, $numero)\"> </td>"; } if($laskuri > 0) { echo "</tr>"; } echo '</table>'; ?> </td></tr> </table> </form> </body>
Tuolla pätkällä ongelma on ratkaistu, joten ei enää mitään tästä kohdasta.
var loydetty = document.muistipeli.maara.value; if(loydetty >= 1) { var laske = Number(loydetty) + Number(1); document.muistipeli.maara.value = laske; } else { document.muistipeli.maara.value = "1"; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.