Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Угадай число (https://javascript.ru/forum/misc/37441-ugadajj-chislo.html)

GTG 19.04.2013 20:22

Угадай число
 
Привет! Я начал изучать JS только вчера, вот попытался написать простой скрипт "Угадай число". Однако, проблема в том, что он даже не начинается... Проверял - не понял, в чем может быть дело (аналогичные скрипты работали, вроде).

<script language="JavaScript">
function randomNumber(m,n) { return Math.random() * (n-m+1) + m }
alert("Добро пожаловать в шоу \"Угадай число!\"");
var m = parseInt(prompt("Введите нижнюю границу диапазона чисел", ""));
var n = parseInt(prompt("Введите верхнюю границу диапазона чисел", ""));
var number = randomNumber(m,n);
if (confirm("Число сгенерировано. Хотите попробовать его отгадать?")) {
	if (prompt("Введите число", "")==number) {
		if ((m-n)>=10 && (m-n)<=100)
			alert("Верно! Вы получаете 10 очков!");
		if((m-n)>100)
			alert("Верно! Вы получаете 100 очков!");
		if ((m-n)<10)
			alert("Верно! Вы получаете 1 очко!");
			}
	else
		alert("Неверно! Вы теряете 10 очков!");
	}
else {
	 if (confirm("Вы прощаетесь с нами?"))
		window.close();
	}
</script>

GTG 19.04.2013 20:25

UPD:
Проблема решена. Не нашел, как удалить тему.

megaupload 19.04.2013 20:34

Цитата:

Сообщение от GTG
Не нашел, как удалить тему.

привыкай бро

GTG 19.04.2013 22:05

Хорошо. Собственно, всё равно возник вопрос по данному скрипту.
Дело в том, что Math.random работает как-то не так...
Я использую вот что:
var x = Math.floor(Math.random() * (max-min+1) + max);

но при, допустим, параметрах min = 10, max = 20 генерируемое число x получается равным 7. Как такое может быть?

rgl 19.04.2013 22:54

Во-первых,
var x = Math.floor(Math.random() * (max-min+1) + min);
а во-вторых, что-то вы напутали, т.к. по-вашему генерятся числа больше не менше 20

GTG 20.04.2013 07:41

Цитата:

Сообщение от rgl (Сообщение 247273)
Во-первых,
var x = Math.floor(Math.random() * (max-min+1) + min);
а во-вторых, что-то вы напутали, т.к. по-вашему генерятся числа больше не менше 20

Прошу прощения, +min, да. Генерируются числа меньше min. Проверено.
Если же я напишу даже var x = Math.floor(Math.random() * (max-min+1) + max), то генерируются числа меньше 20! А именно только что сгенерировалось 10!

GTG 21.04.2013 14:54

В общем, было обнаружено следующее:
Если в явном виде инициализировать переменные max и min, например, так:
var min = 10;
var max = 25;

то число генерируется правильно - в диапазоне от min до max.
Однако, если задать их таким образом:
var min = prompt("Enter min", "");
var max = prompt("Enter max", "");

то генерируемое число может получиться меньше min.
В чем проблема?

P.S. Есть ли замена циклу while с возможностью контактирования с пользователем во время выполнения?

Hekumok 21.04.2013 15:39

Цитата:

Сообщение от GTG
Однако, если задать их таким образом:
var min = prompt("Enter min", "");
var max = prompt("Enter max", "");

то генерируемое число может получиться меньше min.
В чем проблема?

Потому что нужно делать так
var min = *!*+*/!*prompt("Enter min", "");
var max = *!*+*/!*prompt("Enter max", "");
alert([typeof min, typeof max]);

Так нужно делать, чтобы преобразовать введенную пользователем строку в число
Цитата:

Сообщение от GTG
P.S. Есть ли замена циклу while с возможностью контактирования с пользователем во время выполнения?

Цикл for есть. Или что вы имеете ввиду?

GTG 21.04.2013 15:56

Цитата:

Сообщение от Hekumok (Сообщение 247414)
Потому что нужно делать так
var min = *!*+*/!*prompt("Enter min", "");
var max = *!*+*/!*prompt("Enter max", "");
alert([typeof min, typeof max]);

Так нужно делать, чтобы преобразовать введенную пользователем строку в число

Спасибо, все уяснил.

А насчёт цикла for, я думаю, это немного не то, что нужно. В цикле у меня переменная score может как увеличиваться, так и уменьшаться. Цикл же необходимо закончить, как только score становится >= 100. Собственно, с for не очень соображаю, как это можно реализовать...

Hekumok 21.04.2013 16:07

GTG, а, ну в вашем случае лучше с while

GTG 21.04.2013 16:58

Цитата:

Сообщение от Hekumok (Сообщение 247419)
GTG, а, ну в вашем случае лучше с while

Да, но дело в том, что все алерты и так далее, что прописаны внутри while, не выскакивают.
Неужели это никак нельзя обойти?

Hekumok 21.04.2013 21:50

Цитата:

Сообщение от GTG
Да, но дело в том, что все алерты и так далее, что прописаны внутри while, не выскакивают.

Да ладно? :blink:
var i = 5 ;
while(--i)
 alert(i) ;

Всё работает. Похоже, проблема в вашем коде

GTG 21.04.2013 22:33

Цитата:

Сообщение от Hekumok (Сообщение 247448)
Всё работает. Похоже, проблема в вашем коде

Вот такой код сразу выдает сообщение "Поздравляем! Вы прошли первый уровень сложности!" без всяких там "Вы выиграли! Ваш счет: " и т.д.:
while (score<10) {
var text = prompt("К - камень, Н - ножницы, Б - бумага", "");
var UserChoice = text.toUpperCase();
var rnd = Math.random();
if (rnd<=0.33)
	CompChoice = "К";
if (rnd>0.33 && rnd<=0.66)
	CompChoice = "Н";
if (rnd>0.66)
	CompChoice = "Б";
if (UserChoice == CompChoice) {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
else {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
}
alert("Поздравляем! Вы прошли первый уровень сложности!");

Hekumok 21.04.2013 22:51

GTG, конечно, ведь у вас переменная score не определена
var score = 0 ;
while (score<10) {
var text = prompt("К - камень, Н - ножницы, Б - бумага", "");
var UserChoice = text.toUpperCase();
var rnd = Math.random();
if (rnd<=0.33)
	CompChoice = "К";
if (rnd>0.33 && rnd<=0.66)
	CompChoice = "Н";
if (rnd>0.66)
	CompChoice = "Б";
if (UserChoice == CompChoice) {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
else {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
}
alert("Поздравляем! Вы прошли первый уровень сложности!");

GTG 21.04.2013 22:56

Цитата:

Сообщение от Hekumok (Сообщение 247460)
GTG, конечно, ведь у вас переменная score не определена
var score = 0 ;
while (score<10) {
var text = prompt("К - камень, Н - ножницы, Б - бумага", "");
var UserChoice = text.toUpperCase();
var rnd = Math.random();
if (rnd<=0.33)
	CompChoice = "К";
if (rnd>0.33 && rnd<=0.66)
	CompChoice = "Н";
if (rnd>0.66)
	CompChoice = "Б";
if (UserChoice == CompChoice) {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
else {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
}
alert("Поздравляем! Вы прошли первый уровень сложности!");

Спасибо большое, не замечаю никогда таких дурацких ошибок((

GTG 22.04.2013 08:17

Заметил такую проблему - иногда при вводе буквы в поле ввода от prompt, никаких алертов не выдается, и снова появляется поле prompt. На мой взгляд, я рассмотрел все ситуации - никак не пойму в чём дело.
var CompChoice;
var score=0;
while (score<10) {
var text = prompt("К - камень, Н - ножницы, Б - бумага", "");
var UserChoice = text.toUpperCase();
var rnd = Math.floor(Math.random() * 27 + 1);
if (rnd<10)
	CompChoice = "К";
if (rnd>=10 && rnd<19)
	CompChoice = "Н";
if (rnd>=19)
	CompChoice = "Б";
if (UserChoice == CompChoice) {
	score+=0;
	alert("Ничья! Ваш счёт: " + score);
	}
else {
if (UserChoice == "K" && CompChoice == "Н") {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
if (UserChoice == "K" && CompChoice == "Б") {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Н" && CompChoice == "Б") {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Н" && CompChoice == "К") {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Б" && CompChoice == "К") {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Б" && CompChoice == "Н") {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
if (UserChoice == null || UserChoice == "" || (UserChoice != "К" && UserChoice != "Н" && UserChoice != "Б")) {
	score-=1;
	alert("Ваш счёт: " + score);
	}
}
}
alert("Поздравляем! Вы прошли игру!");


P.S. Простите, если я совсем дурак((
P.P.S. Знаю, что конструкция else лишняя, это я вставил её на всякий случай - но всё равно всё аналогично.

skrudjmakdak 22.04.2013 16:19

возможно вы вводите символы не одно из этих трех: к, н, б. вот из за этого скорей всего и не работает

Hekumok 22.04.2013 17:23

var CompChoice;
var score=0;
while (score<10) {
var text = prompt("К - камень, Н - ножницы, Б - бумага", "");
if(text == null) {
	score -= 1 ;
	alert("Ваш счёт: " + score) ;
	continue ;
	} ;
var UserChoice = text.toUpperCase();
var rnd = Math.floor(Math.random() * 27 + 1);
if (rnd<10)
	CompChoice = "К";
if (rnd>=10 && rnd<19)
	CompChoice = "Н";
if (rnd>=19)
	CompChoice = "Б";
if (UserChoice == CompChoice) {
	score+=0;
	alert("Ничья! Ваш счёт: " + score);
	}
else {
if (UserChoice == "K" && CompChoice == "Н") {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
if (UserChoice == "K" && CompChoice == "Б") {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Н" && CompChoice == "Б") {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score)
	}
if (UserChoice == "Н" && CompChoice == "К") {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Б" && CompChoice == "К") {
	score+=1;
	alert("Вы выиграли! Ваш счёт: " + score);
	}
if (UserChoice == "Б" && CompChoice == "Н") {
	score-=1;
	alert("Вы проиграли! Ваш счёт: " + score);
	}
if(UserChoice == "" || (UserChoice != "К" && UserChoice != "Н" && UserChoice != "Б")) {
	score-=1;
	alert("Ваш счёт: " + score);
	}
}
}
alert("Поздравляем! Вы прошли игру!");


Часовой пояс GMT +3, время: 20:23.