Создать игру "камень-ножницы-бумага" js
Здраствуйте! есть вот такой код, комп выбирает одно из слов рандом, user выбирает свой вариант цифрой 1, 2 или 3. Мне надо правильно сравнить. не могу понять как это сделать. при таком. что не так ?
<script type="text/javascript">
let user1 = 0;
let comp = 0;
let computer = Math.random();
if (computer <= 0.33){
computer = 'камень';
}else if (computer <= 0.64){
computer = 'ножницы';
}else {
computer = 'бумага';
}
console.log(computer);
while (true){
const user = prompt('Введите один из вариантов\n1. камень \n2. ножницы\n3. бумага');
const number = parseInt(user);
if (user === null){
console.log('Пользователь '+ user1 +'\nКомпьютер '+ comp)
break;
}
if(computer === 'камень'){
if (user === 3){
user1++;
continue
}
}else {
comp++;
}
if(computer === 'ножницы'){
if (user === 1){
user1++;
continue
}
}else {
comp++;
}
if(computer === 'бумага'){
if (user === 2){
user1++;
}
}else {
comp++;
}
}
</script>
Ответы (4 шт):
Виталий, желаю вам удачи в освоении программирования. Игры вполне для этого годятся. Что касается вашего кода в нем есть недочеты - поэтому он и не работал в частности проблема с условиями (лишний заход).
Предлагаю другое решение в плане кода, будет хорошо если вы в нем разберетесь, если что-то не будет понятно я отвечу в комментариях.
Итак у нас есть игра. У игры есть правила давайте их запишем. Это своеобразная таблица подстановки:
| камень | ножницы | бумага | |
|---|---|---|---|
| камень | 0 | 1 | -1 |
| ножницы | -1 | 0 | 1 |
| бумага | 1 | -1 | 0 |
Такие таблицы используются в программировании, и документации, они реально могут приносить пользу. Чтобы было удобно читать можно записать ее в коде в виде объекта. Очень важно чтобы код был читаем - Вы это позже оцените, всегда старайтесь писать так чтобы было меньше сложностей при чтении. Вложенные if достаточно сложны для восприятия.
Вот правила игры:
const gameRules = {
"камень" : {
"камень" : 0,
"ножницы" : 1,
"бумага" : 0, //-1,
},
"ножницы" : {
"камень" : 0,//-1,
"ножницы" : 0,
"бумага" : 1,
},
"бумага" : {
"камень" : 1,
"ножницы" : 0, //-1,
"бумага" : 0,
}
}
это запись нашей таблицы истинности, для того чтобы вычислить результат мы пишем gameRules['камень']['бумага'] т.е. если у нас камень а у соперника бумага то мы ничего не заработаем (или -1 бал - смотря как считать) тоже самое делаем со стороны компьютера.
В итоге остальной код выглядит так:
function getComputer() {
const random = Math.random();
if (random <= 0.33){
computer = 'камень';
} else if (random <= 0.64){
computer = 'ножницы';
} else {
computer = 'бумага';
}
return computer;
}
while (true){
const number = prompt('Введите один из вариантов\n1. камень \n2. ножницы\n3. бумага');
if (!number) {
break;
}
const user = ['камень', 'ножницы', 'бумага'][parseInt(number)-1];
computer = getComputer();
compScore += gameRules[computer][user] // считаем баллы компьютера
userScore += gameRules[user][computer] // считаем баллы пользователя
console.log(`Пользователь ${user} (${userScore})\nКомпьютер ${computer}(${compScore})`)
}
По объему строк практически то же самое, но такой код при определенной практике читается проще, легче контролируется и меняется. Конечно этот код не идеален и его тоже можно улучшить, в частности слова в коде обычно подменяют константами чтобы не наделать опечаток, и получение рандомного числа можно записать гораздо короче.
По поводу возможных улучшений вашего последнего варианта (разумеется нужно еще ввести проверку ввода пользователя, ну и это не предел улучшений):
const STONE = 0;
const SCISSORS = 1;
const PAPER = 2;
let userScore = 0;
let computerScore = 0;
function getComputerChoise() {
return Math.floor(Math.random() * 3);
}
function getUserChoise (){
const userChoise = prompt('Введите один из вариантов\n1. камень \n2. ножницы\n3. бумага');
if (userChoise === null) {
return userChoise;
}
return parseInt(userChoise) - 1; /* от 0 до 2*/
}
function gameStep() {
const computerChoise = getComputerChoise();
const userChoise = getUserChoise();
if (!userChoise) return false;
if (computerChoise === STONE && userChoise === PAPER
|| computerChoise === SCISSORS && userChoise === STONE
|| computerChoise === PAPER && userChoise === SCISSORS)
{
userScore++
} else if (computerChoise === STONE && userChoise === SCISSORS
|| computerChoise === SCISSORS && userChoise === PAPER
|| computerChoise === PAPER && userChoise === STONE){
computerScore++
}
return true;
}
function showResults() {
let result = 'Счет равен';
if (userScore > computerScore){
result ='Пользователь выиграл'
}else if(userScore < computerScore){
result = 'Компьютер выиграл';
}
console.log('Пользователь ' + userScore + '\nКомпьютер ' + computerScore + '\n' + result);
}
while (gameStep()) {}
showResults();
Daniil Loban спасибо за ваш код, но мне надо было разобраться самому) Вот к чему пришел. чувствую что здесь что то не то, как то он не правильно считает. Подскажите пожалуйста что тут не так и как можно этот код сократить
let user1 = 0;
let comp = 0;
const getComputer = function () {
let computer = Math.random();
if (computer <= 0.33){
computer = 'камень';
}else if (computer <= 0.64){
computer = 'ножницы';
}else {
computer = 'бумага';
}
return computer;
}
const random = function (computer, number) {
if (computer === 'камень' && number === 3 || computer === 'ножницы' && number === 1 || computer === 'бумага' && number === 2){
user1++
}else if (computer === 'камень' && number === 2 || computer === 'ножницы' && number === 3 || computer === 'бумага' && number === 1){
comp++
}else {
}
}
while (true) {
const user = prompt('Введите один из вариантов\n1. камень \n2. ножницы\n3. бумага');
const number = parseInt(user);
if (user === null) {
break
}
random(getComputer(),number);
}
console.log(user1);
console.log(comp);
if (user1 > comp){
result ='Пользователь выиграл'
}else if(user1 === comp){
result = 'Счет равен'
}else {
result = 'Компьютер выиграл'
}
console.log('Пользователь ' + user1 + '\nКомпьютер ' + comp + '\n' + result)
как можно этот код сократить
const p1 = Number(prompt('1. Камень \n2. Ножницы\n3. Бумага')) - 1,
p2 = Math.floor(Math.random() * 2),
p1win = [1,2,0][p1] === p2,
Enum = ['Камень', 'Ножницы', 'Бумага'],
result = p1 === p2 ? 'Ничья' : 'Выиграл ' + (p1win ? 'Игрок 1' : 'Игрок 2');
console.log("Результат: " + result, '|', "Игрок: " + Enum[p1], '|', "Компьютер: " + Enum[p2]);
+ Бонус
const p1 = Number(prompt('1. Камень \n2. Ножницы\n3. Бумага\n4. Ящерица\n5. Спок')) - 1,
p2 = Math.floor(Math.random() * 2),
p1win = [[1,3],[2,3],[0,4],[4,2],[0,1]][p1].includes(p2),
Enum = ['Камень', 'Ножницы', 'Бумага', 'Ящерица', 'Спок'],
result = p1 === p2 ? 'Ничья' : 'Выиграл ' + (p1win ? 'Игрок 1' : 'Игрок 2');
console.log("Результат: " + result, '|', "Игрок: " + Enum[p1], '|', "Компьютер: " + Enum[p2]);
const select = prompt("Что хотите? Бумага , Ножницы, Камень")
const items = ['Бумага', 'Ножницы', 'Камень']
if (!select) {
location.reload()
} else {
document.write(`<p>Вы: ${select}</p>`)
}
let selectComputer = items[Math.floor(Math.random()*items.length)];
document.write(`<p>Робот: ${selectComputer}</p>`);
const compare = (choice1,choice2) => {
if (choice1 === choice2) {
return "Ничья";
}
if (choice1 === "камень") {
if (choice2 === "ножницы") {
return "Вы выиграли!";
} else {
return "Вы проиграли!";
}
}
if (choice1 === "бумага") {
if (choice2 === "камень") {
return "Вы выиграли!";
} else {
return "Вы проиграли!";
}
}
if (choice1 === "ножницы") {
if (choice2 === "камень") {
return "Вы проиграли!";
} else {
return "Вы выиграли";
}
}
return 'Начните игру заново!'
};
const result = compare(select.toLowerCase(),selectComputer.toLowerCase());
document.write(`<br><hr><br> ${result}`);
*{margin:0;padding:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}::selection{background:#fb9fe5;text-shadow:none}a{color:#0088CC;text-decoration:none;outline:0}a:hover{color:#005580}a img{border:none}img{max-width:100%}html{font-size:100%}body{padding:5%;font:300 1.25em/1.6 monospace;background:#eee;color:#000;}h1{font-family:"Helvetica Neue",sans-serif;line-height:1;font-weight:300;margin-bottom:1em;}