Создать игру "камень-ножницы-бумага" 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 шт):

Автор решения: Daniil Loban

Виталий, желаю вам удачи в освоении программирования. Игры вполне для этого годятся. Что касается вашего кода в нем есть недочеты - поэтому он и не работал в частности проблема с условиями (лишний заход).

Предлагаю другое решение в плане кода, будет хорошо если вы в нем разберетесь, если что-то не будет понятно я отвечу в комментариях.

Итак у нас есть игра. У игры есть правила давайте их запишем. Это своеобразная таблица подстановки:

камень ножницы бумага
камень 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)
→ Ссылка
Автор решения: webDev_

как можно этот код сократить

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]);
→ Ссылка
Автор решения: Andrew

       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;}

→ Ссылка