Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Muistipeli

Sivun loppuun

PetriKeckman [18.06.2023 17:56:16]

#

Pelissä näet viisi sanaa, sitten ne poistetaan ja tilalle tulee 10 sanaa joista yksi oli noiden viiden joukossa. Muistatko mikä?

https://petke.info/muistipeli/

Myönnän: epäsiistiä koodia, mutta se toimii! Mikä minulle on tärkeintä. Yritin ensin saada chatGPT:n ohjelmoimaan tän pelin, mutta ei se tuntunut tajuavan mitään, lopulta aloin itse koodaamaan ja se olikin paljon mukavampaa itseasiassa. chatGPT alkoi jo ärsyttämään!!

<!DOCTYPE html>
<head>
<title>Muistipeli</title>
<style>
.center {
  text-align: center;
  border: 3px solid green;
}
.button {
  background-color: #4CAF50; /* Green */
  border: none;
  color: white;
  padding: 15px 32px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
}
.div {
  border: 5px outset green;
  background-color: lightblue;
  text-align: center;
}
.b2 {
  text-align: center;
  align: center;
  font-size: 30px;
  border: none;
}

</style>
</head>
<html>
<body>
<h2>Sinulle näytetään 10 sekunnin ajan viittä sanaa ja sen jälkeen kymmenen sanaa, joista sinun pitää valita jokin noiden viiden joukosta</h2>
<button class="button" onclick="myFunction()">Aloita uusi peli</button>
<div class="b2" id="myDiv1"></div>
<div class="b2" id="myDiv2"></div>
<div class="b2"  id="myDiv3"></div>
<div class="b2"  id="myDiv4"></div>
<div class="b2"  id="myDiv5"></div>
<hr>
<button class="b2" id="button1" onclick="tarkista(0)"></button>
<button class="b2" id="button2" onclick="tarkista(1)"></button>
<button class="b2" id="button3" onclick="tarkista(2)"></button>
<button class="b2" id="button4" onclick="tarkista(3)"></button>
<button class="b2" id="button5" onclick="tarkista(4)"></button>
<button class="b2" id="button6" onclick="tarkista(5)"></button>
<button class="b2" id="button7" onclick="tarkista(6)"></button>
<button class="b2" id="button8" onclick="tarkista(7)"></button>
<button class="b2" id="button9" onclick="tarkista(8)"></button>
<button class="b2" id="button10" onclick="tarkista(9)"></button>
<script>
var indeksi=Math.floor(Math.random() * 10);
function myFunction() {
var sanat = [
  "auto", "kissa", "pöytä", "tuoli", "koira", "kukka", "kynä", "kirja", "puu", "omena",
  "juna", "kello", "kala", "lintu", "pullo", "hevonen", "lasi", "kivi", "paita", "laukku",
  "kukkaro", "hame", "pipo", "hattu", "reppu", "talo", "ovi", "ikkuna", "pensas", "maa",
  "aurinko", "kuu", "tähti", "lampi", "meri", "joki", "tie", "silta", "metsä", "vuori",
  "ranta", "pelto", "lumi", "sade", "pilvi", "varjo", "kamera", "näyttö", "nappi", "näppäimistö",
  "hiiri", "pöytäliina", "kuppi", "lautanen", "haarukka", "veitsi", "lusikka", "pannu", "kattila", "uuni",
  "liesi", "sänky", "peitto", "tyyny", "kaappi", "hylly", "tikkaat", "matto", "kello", "peili",
  "ovi", "ikkuna", "piha", "portti", "penkki", "terassi", "ruoho", "nurmi", "maito", "leipä",
  "juusto", "voi", "muna", "karkki", "suklaa", "karkkipaperi", "omena", "banaani", "appelsiini", "mansikka",
  "viinirypäle", "kirsikka", "päärynä", "vihannes", "peruna", "porkkana", "kurkku", "tomaatti", "paprika", "salaatti"
];

	var divElement = document.getElementById("button1");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button2");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button3");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button4");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button5");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button6");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button7");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button8");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button9");
	divElement.innerHTML = " ";
	divElement = document.getElementById("button10");
	divElement.innerHTML = " ";



	naytettavat=[];
  while (naytettavat.length < 5) {
    var sana = sanat[Math.floor(Math.random() * sanat.length)];
    if (!(naytettavat.includes(sana))) {
      naytettavat.push(sana);
    }
  }
  console.log(naytettavat);
  document.getElementById("myDiv1").innerHTML=naytettavat[0];
  document.getElementById("myDiv2").innerHTML=naytettavat[1];
  document.getElementById("myDiv3").innerHTML=naytettavat[2];
  document.getElementById("myDiv4").innerHTML=naytettavat[3];
  document.getElementById("myDiv5").innerHTML=naytettavat[4];
  // Pelikello
  setTimeout(function() {
     alert("10 sekuntia on kulunut!");

  var valittuSana = naytettavat[Math.floor(Math.random() * naytettavat.length)];
  naytettavat2=[];
  var sanat10=[];
  while (sanat10.length < 10) {
    var sana = sanat[Math.floor(Math.random() * sanat.length)];
    if (!(sanat10.includes(sana) && (sana!=valittuSana))) {
      sanat10.push(sana);
    }
  }
  console.log(sanat10);
	var divElement = document.getElementById("myDiv1");
	divElement.innerHTML = " ";
	divElement = document.getElementById("myDiv2");
	divElement.innerHTML = " ";
	divElement = document.getElementById("myDiv3");
	divElement.innerHTML = " ";
	divElement = document.getElementById("myDiv4");
	divElement.innerHTML = " ";
	divElement = document.getElementById("myDiv5");
	divElement.innerHTML = " ";

	if (indeksi==0) {
    	document.getElementById("button1").innerHTML=valittuSana;
	} else {
		document.getElementById("button1").innerHTML=sanat10[0];
	}
	if (indeksi==1) {
    	document.getElementById("button2").innerHTML=valittuSana;
	} else {
		document.getElementById("button2").innerHTML=sanat10[1];
	}

	if (indeksi==2) {
    	document.getElementById("button3").innerHTML=valittuSana;
	} else {
		document.getElementById("button3").innerHTML=sanat10[2];
	}

	if (indeksi==3) {
    	document.getElementById("button4").innerHTML=valittuSana;
	} else {
		document.getElementById("button4").innerHTML=sanat10[3];
	}
	if (indeksi==4) {
    	document.getElementById("button5").innerHTML=valittuSana;
	} else {
		document.getElementById("button5").innerHTML=sanat10[4];
	}

	if (indeksi==5) {
    	document.getElementById("button6").innerHTML=valittuSana;
	} else {
		document.getElementById("button6").innerHTML=sanat10[5];
	}
	if (indeksi==6) {
    	document.getElementById("button7").innerHTML=valittuSana;
	} else {
		document.getElementById("button7").innerHTML=sanat10[6];
	}

	if (indeksi==7) {
    	document.getElementById("button8").innerHTML=valittuSana;
	} else {
		document.getElementById("button8").innerHTML=sanat10[7];
	}
	if (indeksi==8) {
    	document.getElementById("button9").innerHTML=valittuSana;
	} else {
		document.getElementById("button9").innerHTML=sanat10[8];
	}

	if (indeksi==9) {
    	document.getElementById("button10").innerHTML=valittuSana;
	} else {
		document.getElementById("button10").innerHTML=sanat10[9];
	}


  }, 10000); // 10000 millisekuntia = 10 sekuntia

}

function tarkista(painettu) {
	if (indeksi==painettu) {alert("Loistavaa! Muistit oikein!");
	} else {
		alert("muistit väärin!");
	}
}

</script>

</body>
</html>

Grez [18.06.2023 18:43:35]

#

Tuossa on ainakin sellainen bugi, että oikea sana tai useampi ensimmäisessä listassa ollut sana voi esiintyä 10 sanan joukossa kaksi (tai useamman) kertaa jolloin vain yksi valinta kelpaa, vaikka oikeita siis on useampi.

PetriKeckman [18.06.2023 21:04:38]

#

Ei voi esiintyä kahta kertaa mikään sana.

if (!(sanat10.includes(sana) && (sana!=valittuSana)))

Tuossa tarkistetaan, että 10 joukossa ei ole arvottua sanaa && ettei se ole arvottu sana.

Grez [18.06.2023 21:11:24]

#

Tuossahan tarkistetaan että joko 10 joukossa ei ole arvottua sanaa tai sana on valittu sana. Eli mitään muuta sanaa kuin arvottua sanaa ei voi esiintyä kahteen kertaan.

jalski [18.06.2023 21:12:10]

#

Myös "Aloita uusi peli" nappia useamman kerran peräkkäin painettaessa voisi olla hyvä tarkastaa onko ajastin jo käynnissä...

PetriKeckman [18.06.2023 21:12:55]

#

Grez kirjoitti:

Tuossahan tarkistetaan että joko 10 joukossa ei ole arvottua sanaa tai sana on valittu sana. Eli mitään muuta sanaa kuin arvottua sanaa ei voi esiintyä kahteen kertaan.

Mitä sekoilet? sana!=valittuSana..., sulla lauseessa "tai" sana.

PetriKeckman [18.06.2023 21:14:09]

#

jalski kirjoitti:

Myös "Aloita uusi peli" nappia useamman kerran peräkkäin painettaessa voisi olla hyvä tarkastaa onko ajastin jo käynnissä...

Jos käyttäjä ei tajua olla painamatta "Aloita uusi peli" nappia silloin kun pelaa, niin on kyllä tyhmempi kuin ohjelmoija.

Grez [18.06.2023 21:14:44]

#

PetriKeckman kirjoitti:

Mitä sekoilet? sana!=valittuSana..., sulla lauseessa "tai" sana.

Sinähän se tässä sekoilet. Tai vähintäänkin boolen logiikan perusteet on hakusessa...

!(a && b)
//on sama kuin:
(!a || !b)

eli

if (!(sanat10.includes(sana) && (sana!=valittuSana)))
//on sama kuin:
if (!sanat10.includes(sana) || sana==valittuSana)

PetriKeckman [18.06.2023 21:15:54]

#

!(a) && !(b) siinä on.

jalski [18.06.2023 21:18:30]

#

PetriKeckman kirjoitti:

Jos käyttäjä ei tajua olla painamatta "Aloita uusi peli" nappia silloin kun pelaa, niin on kyllä tyhmempi kuin ohjelmoija.

Kyllähän sinun tuo väärinkäytön mahdollisuus ohjelmoijana kuuluisi silti huomioida...

PetriKeckman [18.06.2023 21:20:16]

#

jalski kirjoitti:

PetriKeckman kirjoitti:

Jos käyttäjä ei tajua olla painamatta "Aloita uusi peli" nappia silloin kun pelaa, niin on kyllä tyhmempi kuin ohjelmoija.

Kyllähän sinun tuo väärinkäytön mahdollisuus ohjelmoijana kuuluisi silti huomioida...

Antaa pelaajan olla vaan tyhmä, jos hän sellaista haluaa olla.

PetriKeckman [18.06.2023 21:23:23]

#

Grez kirjoitti:

boolen logiikan perusteet on hakusessa...

Jos ei yliopistossa suoritetut logiikan kurssit 3/3 arvosanalla riitä, niin mikä sulle riittäisi? Pitäisikö olla Logiikan professori?

Grez [18.06.2023 21:24:54]

#

PetriKeckman kirjoitti:

niin mikä sulle riittäisi?

Ihan se riittäisi että osaisit lukea omaa koodiasi ja tietäisit mitä se tekee.

Tuossa lauseessanikin oli tai-sana, eli senkin puitteissa on täysin mahdollista että logiikka on sinulla täydellisesti hallussa, mutta vaan sekoilet. Ja helpostihan sitä sekoaa noiden sulkujen kanssa. Erehtyminen on inhimillistä. Silti vähän epäkohteliasta väittää, että minä sekoilen, vaikka olet itse väärässä.

Eihän siinä rivillä tarvitse kuin siirtää se ensimmäinen huutomerkki yhden sulun verran enemmän oikealle, niin se tekee mitä pitäisi.

if (!(sanat10.includes(sana) && (sana!=valittuSana)))
// korjattu ==>
if ((!sanat10.includes(sana) && (sana!=valittuSana)))

PetriKeckman [18.06.2023 21:32:39]

#

Grez kirjoitti:

Tuossa lauseessanikin oli tai-sana,

Niin, sinun väärässsä lauseesasi "tai" sana mitä sitten? Sait sen aikaiseksi väärällä logiikalla.

sana!=valittuSana on ihan sama kuin !(sana=valittuSana).

Luovuta jo, tai saat turpiin jos tuut tänne.

Grez [18.06.2023 21:37:14]

#

PetriKeckman kirjoitti:

Niin, sinun väärässsä lauseesasi "tai" sana mitä sitten?

Viittasin siis tämän lauseen tai-sanaan:

PetriKeckman kirjoitti:

Sinähän se tässä sekoilet. Tai vähintäänkin boolen logiikan perusteet on hakusessa...

Mutta siis joo enpä tässä nyt jaksa enempää rautalangasta vääntää. Se on minulle aivan sama kuinka virheellisesti pelisi toimii, jos sinua ei kiinnosta kerran korjata.

PetriKeckman kirjoitti:

sana!=valittuSana on ihan sama kuin !(sana=valittuSana).

Tämä menee nyt jo aika pahasti aiheen ohi, mutta nuohan eivät ole yhtään samat. Ensimmäinen vertailee sana ja valittuSana muuttujia ja jälkimmäinen sijoittaa valittuSana muuttujan sisällön muuttujaan sana ja sitten palauttaa negaation sana -muuttujan arvosta.

Jos jälkimmäisessä olisi viimeisen = -merkin tilalla == niin ne olisivat sama asia, mutta edelleenkään ei ole olennaista asian kannalta.

PetriKeckman [18.06.2023 21:44:39]

#

Anna mulle empiirinen todiste: ota screengrabbi tilenteesta, nissä koodi toimii väärin.

PetriKeckman [18.06.2023 21:46:02]

#

Grez kirjoitti:

Jos jälkimmäisessä olisi viimeisen = -merkin tilalla == niin ne olisivat sama asia, mutta edelleenkään ei ole olennaista asian kannalta.

Se oli pseudokoodia.

PetriKeckman [18.06.2023 21:51:59]

#

Grez kirjoitti:

Mutta siis joo enpä tässä nyt jaksa enempää rautalangasta vääntää.

Tulkitsen tuon luovuttamiseksi ja väärässä olon tunnustamiseksi.

Grez [18.06.2023 21:55:31]

#

PetriKeckman kirjoitti:

Anna mulle empiirinen todiste: ota screengrabbi tilenteesta, nissä koodi toimii väärin.

Sinänsä hupaisasti ihan ensimmäisellä kerralla kun tuota peliä kokeilin, niin yksi viidestä sanasta oli appelsiini ja kymmenen vaihtoehdon joukossa oli kaksi kertaa appelsiini. Klikkasin ensimmäistä ja se sanoi että muistin väärin. Klikkasin toista ja se sanoi että muistin oikein. En valitettavasti silloin ottanut screenshotia. En siis todellakaan lähtenyt tonkimaan koodia ja etsimään sieltä bugeja, vaan ihan vaan käytännön testinä tuohon törmäsin.

Voisin toki pelata niin monta kertaa että vastaava tilanne tulee uudelleen, mutta luultavasti screenshot tilanteesta johtaisi vain väitteeseen että kuva on väärennetty jne.

PetriKeckman kirjoitti:

Tulkitsen tuon luovuttamiseksi ja väärässä olon tunnustamiseksi.

Sinä voit tulkita sen ihan miten haluat :D

Toisaalta jos haluat oppia jotain tänään, niin voit lukea nuo aikaisemmin kirjoittamani viestit uudelleen ajatuksella. Haastan löytämään yhdenkin viestin minulta tässä ketjussa, jossa on asiavirhe.

Grez [18.06.2023 22:06:26]

#

Tässä nyt vielä kuvankaappauskin, vaikka äsken epäilin ettei siitä ole hyötyä
https://ibb.co/3S0Q5tT

Tuossa siis esiintyy kukka kaksi kertaa.

PetriKeckman [18.06.2023 22:25:59]

#

OK! Huutomerkin kanssa! Olit oikeassa! Pyydän anteeksi kiivastumistani! Saanko?

Ehtolauseessani oli tosiaankin sulkuvirhe. Se olisi pitänyt olla:

(!(sanat10.includes(sana)) && (sana!=valittuSana))

Korjaa jos olen tässäkin! väärässä?

Yliopistokurssit suoritettu 80-luvulla.

Grez [18.06.2023 22:36:40]

#

Toki saat kiivastumisen anteeksi. Hyvä että vika korjaantui ja tuo korjattu versio näyttää ihan ok:lta.

Sitten tosiaan toinen ongelma oli että sieltä voi tulla muitakin kuin valittu sana 5 ensin näytetyn joukosta. Tämäkin korjaantuisi varmaankin seuraavalla muutoksella:

while (sanat10.length < 10) {
   var sana = sanat[Math.floor(Math.random() * sanat.length)];
   if (!(sanat10.includes(sana) || naytettavat.includes(sana))) {
     sanat10.push(sana);
   }
 }

PetriKeckman [18.06.2023 22:43:11]

#

Grez kirjoitti:

(18.06.2023 22:36:40): Toki saat kiivas­tu­misen anteeksi. Hyvä että...

Joo. Ehkä. Pitäis koodia korjata, mutten jaksa..ainakaan nyt. Paha bugihan tuo toinenkin oli, mutta sinänsä helpottaa vaan pelaajaa...kun siellä onkin mahdollisuus olla useampikin 5 joukosta.

jalski [18.06.2023 22:48:28]

#

Itse tekisin funktion mikä sekoittaisi taulukon sisällön. Sitten splittaisin sekoitetun sanataulukon kahdeksi uudeksi taulukoksi siten, että toisessa taulukossa olisi viisi sanaa ja toisessa taulukossa loput sanat. Nyt loppujen sanojen taulukosta ottaa yhdeksän sanan mittaisen siivun ja viiden sanan mittaisesta taulukosta työntää yhden sanan siihen ja sekoittaa.

PetriKeckman [18.06.2023 23:01:05]

#

jalski kirjoitti:

Itse tekisin funktion mikä sekoittaisi taulukon sisällön. Sitten splittaisin...

Joo. Kuulostaa paljon helpommalta. En vaan oo koskaan mitään splittiä käyttänyt ja näillä aivoilla ja tässä iässä voi uuden omaksuminen olla liian haastavaa :)

jlaire [18.06.2023 23:02:35]

#

Jalskin idean voisi myös toteuttaa niin, että arpoo 14 satunnaista sanaa joista näytetään ensin 5 ensimmäistä ja sitten 10 viimeistä.

Sanalistassa on kuitenkin muutama kahdesti esiintyvä sana, jotka pitäisi siivota pois, jotta tämä toimisi halutulla tavalla.

Lebe80 [19.06.2023 08:22:33]

#

Ja kun lapsukswt on korjattu, niin copy/paste -koodia voisi siistiä ja miettiä, miten tehdä rutiineja paljon toistuville asioille, joissa vain jokin merkkijonon numero muuttuu. Selkeyttäisi koodia ja vähentäisi kirjoitusvirheistä johtuvia mahdollisia ongelmia. Samalla pelistä saisi helposti sellaisen, että saisi "vaikeustasoa" vaihdettua vaihtamalla etsittävien sanojen määrää.


Sivun alkuun

Vastaus

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

Tietoa sivustosta