Diskuze: Random Number - hádej číslo
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.


Zapoměl jsem ještě dodat
#hraj {
visibility: hidden;
}
Co jsi nasel google? Nasel sis priklady? google = js random example
function rnd(n) { return Math.floor(Math.random() * n); }
...
a = rnd(5);
var $, $$;
$ = document.querySelector.bind(document);
$$ = document.querySelectorAll.bind(document);
...
//document.getElementById("napoveda").innerHTML
$("#napoveda").innerHTML // musi se pak pridat krizek, protoze id pro queryselektor pouziva krizek
var $;
$ = document.getElementById; // nebo function $ (id) { return document.getElementById(id); }
//document.getElementById("napoveda").innerHTML
$("napoveda").innerHTML
google = Misli si cislo -- About 51,500 results (0.39 seconds)
google = Mysli si cislo -- About 12,300,000 results (0.41 seconds)
google = Mysly si cislo -- About 18,100,000 results (0.53 seconds)
Urcite ta prvni moznost je podezrela.
Mysly si cislo sice pise 18,100,000 vysledku, ale mezi prvnimi vysledky je text
"Myslím si číslo"
Mysli si cislo, mezi prvnimi vysledky je text "Mysli si číslo", zdroj: kosmas
› knihy , kosmas je zrovna pomerne zname knihkupectvi, takze ti by mohli mit
pravopis asi spravne
Jaky je zaver? Prinejmensim jsem nahodnym okem objevil alespon 1 hrubku
A mozna by bylo jeste zajimave napsat to spis takhle:
function getFormValue(name) { return ocument.forms["form_hadej"][name].value; }
function printScreen(id, str) {document.getElementById(id).innerHTML = str;}
Děkuji, že jsi mi našel velmi velkou hrubku. Myslím to upřímně. Jinak pravopisných hrubek tam vidím více.
Problém je, že tato oprava mi nepomohla v řešení mého úkolu.
Jinak ano na google jsem našel spousty příkladů. Jen jsem si vše musel
upravit stejně tak jako na youtube jsem našel informaci, abych nekopíroval
stejné řádky a dal je do funkce. Což jsem učinil.
Nikde se mi ale nedaří zjistit informaci jak zprovoznit ten random. I když
jsem provedl funkci, jak jsi mi radil tak to nejede.
function rnd(n1) {
let n1 = nacti();
return Math.floor(Math.random() * n1) +1;
}
rndcislo = rnd(n1);
navíc mi vyskočí, že proměnná n1 není deklarována. Chybu mi označuje v ["form_hadej"]["cislo1"].
function nacti() {
let c1 = document.forms["form_hadej"]["cislo1"].value;
let n1 = parseInt(c1);
return n1;
};
Stále nevím co s tímto. Generuji náhodné číslo, ale místo čísla mi po volání do konzole vyjede tato hláška. Zadaná čísla do input jsou 3 a 2.
const cislo1 = document.getElementById('c1');
const cislo2 = document.getElementById('c2');
let rndcislo = () => {
return Math.floor(Math.random() * parseInt(cislo1.value) +1);
}
function tipuj() {
console.log(cislo1.value);
console.log(cislo2.value);
console.log(rndcislo);
}
<button type="button" id="hadej" onclick="tipuj(this);" name="hadej" disabled>Hádej</button>
Výpis konzole
3 main.js:49
2 main.js:50
() => { main.js:51
return Math.floor(Math.random() * parseInt(cislo1.value) +1);
}
Zkoušel jsem i standardní funkci
function nahodne_cislo() {
let rndcislo = Math.floor(Math.random() * parseInt(cislo1.value)) + 1;
console.log(rndcislo);
return rndcislo;
}
Ale tu mi nelze vyvolat napíše mi to že rndcislo není deklarováno
main.js:50 Uncaught ReferenceError: rndcislo is not defined
at tipuj (main.js:50)
at HTMLButtonElement.onclick (index.html:22)
Neaktivní uživatel:16.2.2020 8:59
Nemohl bys to dát v nějaké poslední verzi na jsfiddle.net? Ať to tu nemusíme procházet a hledat změny napříč příspěvky.
https://jsfiddle.net/…7kvgt5jm/16/
Skvělé by bylo dostat ten random do funkce hraj, aby se při uhodnutí a resetování value generovalo nové číslo po stisku button Spusť, které se zobrazí po uhádnutí. Je to i logické tím uživatel odešle zahájení hry a načte se cislo1.value, které nastavuje rozsah generovaného čísla.
snad se to načte takto s online nastroji pro programovaní pracuji poprvé používám VS Code.
Neaktivní uživatel:16.2.2020 14:21
Teď jsem si ten dotaz ještě pořádně přečetl v kontextu celku. Asi se zamotáváš do těch arrow funkcí a deklarací proměnných. První výpis konzole ti vrací rndcislo jako funkci, protože to voláš jako proměnnou a ne funkci.
console.log(rndcislo); // vrátí, že rndcislo je funkce
console.log(rndcislo()); // vrátí return hodnotu z funkce
Druhá chyba vzniká tak, že máš rndcislo deklarováno jako let uvnitř nahodne_cislo(). Deklarace let platí jen ve složených závorkách, takže z jiné funkce tipuj() se nemůžeš dotazovat na rndcislo ani kdybys tu funkci napřed zavolal někde jinde. Musíš zavolat tu konkrétní funkci nahodne_cislo(), která vrací svou vnitřní hodnotu rndcislo.
Snad to dává smysl
+20 Zkušeností
+2,50 Kč

Rada byla na místě a přiklad řešení s tím že v odevzdané verzi
nebude ten výpis konzolí. To tam mám jen pro ladění řešení.
Hotové řešení online: https://jsfiddle.net/…7kvgt5jm/31/
Přikládám i kód aby bylo vidět celé řešení, věřím, že by to šlo
napsat lépe. A určitě to nebude celé dle normy ES6.
Ale funguje. Děkuji všem, co pomohli a poradili hlavně
Neaktivní uživatel, který pomohl s řešením a psal smysluplné
rady, které vedly k cíli.
HTML
<!DOCTYPE html>
<html lang="cs_CZ" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<form class="form_hadej" name="form_hadej" action="index.html" method="post">
<legend><strong><em>Hádej číslo</em></strong></legend>
<div class="nastav">
<label for="c1">Vlož rozsah</label>
<input type="number" id="c1" class="cislo" onkeyup="aktivuj(this);" onchange="aktivuj(this);" name="cislo1" value="">
<button type="button" id="spust" onclick="hraj(this);" name="spust" disabled>Spusť</button>
</div>
<div id="rozsah">
</div>
<div id="hraj">
<label for="c1">Hádej</label>
<input type="number" id="c2" class="cislo" onkeyup="aktivuj(this, 'hadej');" onchange="aktivuj(this, 'hadej');" name="cislo2" value="">
<button type="button" id="hadej" onclick="tipuj(this);" name="hadej" disabled>Hádej</button>
</div>
<div id="vysledky">
</div>
</form>
<script type="text/javascript"src="main.js"></script>
</body>
</html>
CSS
#hraj, #rozsah, #vysledky {
visibility: hidden;
}
Javascript
'use strict'
const cislo1 = document.getElementById('c1');
const cislo2 = document.getElementById('c2');
const spust = document.getElementById('spust');
const hadej = document.getElementById('hadej');
const hrajem = document.getElementById('hraj');
const napoveda = document.getElementById('vysledky');
const rozsah = document.getElementById('rozsah');
const nova_hra = '<div><button type="button" id="nova_hra" onclick="reset_hry();" name="nova_hra">Hrát znova</button></div>';
let rndcislo;
let pokusy = 0;
let aktivuj = (element, buttonid) => {
let val = parseFloat(element.value);
let btn = buttonid !== undefined ? document.getElementById(buttonid) : element.nextElementSibling;
btn.disabled = isNaN(val) ? true : false;
}
function skryt() {
hrajem.style.visibility = 'hidden';
rozsah.style.visibility = 'hidden';
napoveda.style.visibility = 'hidden';
spust.disabled = true;
}
function hraj() {
hrajem.style.visibility = 'visible';
rozsah.style.visibility = 'visible';
rndcislo = Math.floor(Math.random() * parseInt(cislo1.value) +1);
if ((parseInt(cislo1.value)) <= 1) {
skryt();
alert('Zadané číslo musí být kladné a větší než jedna');
} else if ((parseInt(cislo1.value)) !='' || (parseInt(cislo1.value)) != 0) {
spust.disabled = true;
rozsah.innerHTML = '<p>Rozsah hledaného čísla je od 1 do ' + (parseInt(cislo1.value)) + '.</p>';
} else {
skryt();
alert('Vyplňte hodnotu rozsahu hledaného čísla.');
}
return rndcislo;
}
function reset_hry() {
cislo1.value = '';
cislo2.value = '';
pokusy = 0;
rozsah.innerHTML = '';
}
function tipuj() {
console.log(cislo1.value);
console.log(cislo2.value);
console.log(rndcislo);
const mensi = cislo2.value > rndcislo && cislo2.value <= cislo1.value;
const vetsi = cislo2.value < rndcislo && cislo2.value <= cislo1.value;
const uhodnuto = cislo2.value == rndcislo;
napoveda.style.visibility = 'visible';
pokusy++
if (mensi) {
napoveda.innerHTML = '<p>Hledané číslo je menší.</p><p>Pokus: ' + pokusy;
alert('Hledané číslo je menší');
hadej.disabled = true;
} else if (vetsi) {
napoveda.innerHTML = '<p>Hledané číslo je větší</p><p>Pokus: ' + pokusy;
alert('Hledané číslo je větší');
hadej.disabled = true;
} else if (uhodnuto) {
rozsah.innerHTML = '<p>Gratuluji! Uhodli jste hledané číslo:' + rndcislo + '. Pokusů k uhádnutí ' + pokusy + '.</p>' + nova_hra;
alert('Gratuluji! Uhodli jste hledané číslo. Pokusů k uhádnutí ' + pokusy);
skryt();
rozsah.style.visibility = 'visible';
} else {
napoveda.innerHTML = '<p>Nepodváděj číslo je větší než uvedený rozsah!</p><p>Pokus: ' + pokusy;
alert('Nepodváděj číslo je větší než uvedený rozsah');
hadej.disabled = true;
}
}
Do funkce rnd jsi nemel zasahovat, tu jsi mel pouzit pak v kodu.
// rndcislo = Math.floor(Math.random() * parseInt(cislo1.value) +1);
rndcislo = rnd(5) +1;
/*
const cislo1 = document.getElementById('c1');
const cislo2 = document.getElementById('c2');
const spust = document.getElementById('spust');
const hadej = document.getElementById('hadej');
const hrajem = document.getElementById('hraj');
const napoveda = document.getElementById('vysledky');
const rozsah = document.getElementById('rozsah');
*/
var i, id_list, el_list; // a nebo rovnou si to nazvy global; global={}; global.el_list = {};
id_list = [
'cislo1',
'cislo2',
'spust',
'hadej',
'hraj',
'vysledky',
'rozsah'
];
el_list = {};
for (i in id_list)
{
el_list[id_list[i]] = document.getElementById(id_list[i]);
}
alert(el_list.cislo1)
Mno, a cele bych to schoval do nejake function inicialize() {...}
Petře přijde mi že jsi nepochopil Petře přijde mi, že jsi nepochopil, co jsem požadoval ta funkce náhodného čísla, musí být takto.
rndcislo = Math.floor(Math.random() * parseInt(cislo1.value) +1);
Generuji náhodné číslo v rozsahu 1 až (zadáno uživatelem), proto
načítám hodnotu cislo1.value, a protože se načte jako řetězec tak jej
přeložím na číslo (celé číslo).
Tvá funkce mi generuje přesně dané číslo od 1 do 5 a navíc i jako
desetinné číslo, což se da pak ošetřit zaokrouhlením.
rndcislo = rnd(5) +1;
V prvním příspěvku, kdy žádám o pomoc je i screen zadaného úkolu. To je nad tím co jsi mi vytkl tu hrubku s „i“ ve slově myslím.
Vzhledem k tomu že je to úkol do školy, tak jej již dále nebudu
upravovat.
Snad jen, kdybych to musel předělat na základě požadavku učitele.
Teď řeším jiné úkoly, kde pracuji již v OOP třídy konstruktory a metody
a jsem si jistý, že budu žádat zase o pomoc, ale až se prokoušu nějakým
základem, první se pokusím vytvořit kód sám, teprve když to nepůjde tak
poprosím.
Zobrazeno 13 zpráv z 13.