Кроме вашей опечатки idea=
/ id=
...
вы можете радикально минимизировать игровую логику и кодировать , используя индексы целых чисел.
Игра целых чисел
- Используйте атрибут
data-*
для пользовательских кнопок.Атрибуты должны содержать числовые значения 0, 1, 2
.При щелчке значение будет представлять выбор игрока. - ИИ должен также играть числами:
const AI = ~~(Math.random() * 3) // 0, 1, 2
Теперь, когда вы знаете, что ИИ и Игрок оба используют целые числа (вместо странных буквенных комбинаций) вы можете хранить Move names в массиве const moves = ["Rock", "Paper", "Scissors"];
(где 0
равно Rock ... и т. Д.)
Rock Paper Scissors Logic
В игре три возможных круглых разрешения , PL побед, AI побед, ничьих .Давайте преобразуем эти "человеческие" значения в целые числа в том же порядке:
0
= выигрыш PL 1
= выигрыш AI 2
= Draw
Вот как их вычислить:
Draw
Вычислить ничью проще всего.Это когда оба AI
и PL
целые числа равны. Давайте вернемся 2
result = PL === AI ? 2
Игрок выигрывает
Чтобы рассчитать выигрыш игрока, просто увеличьте выбор AI на 1 и сделайте по модулю 3 ,Если результат этой операции равен выбору игрока, значит, игрок должен был выиграть! Давайте вернемся 0
AI выигрывает
Иначе, так как наша игра имеет только 3 возможных состояния, это не ничья, и это не выигрыш игрока, чем долженбудь ИИ победить! И давайте вернемся 1
const result = PL===AI ? 2 : (AI+1)%3 === PL? 0 : 1; // Possible results: 0, 1, 2
Крутая вещь в том, что индекс производительности игры тоже основан на том, что теперь вы можете использовать также массив сообщений, таких как messages = ["You won!", "AI won", "it's a draw!", ]
и получить желаемое сообщение по индексу результата! .И бонус!Вы также можете увеличить значения массива score
, 0
- индекс игрока, а 1
- AI!
const moves = ["Rock", "Paper", "Scissors"],
messages = ["You won!", "AI won", "It's a draw!"], // [PL, AI, draw]
score = [0, 0, 0], // [PL, AI, draw]
EL = sel => document.querySelector(sel),
EL_result = EL("#result"),
EL_PLScore = EL("#PLScore"),
EL_AIScore = EL("#AIScore");
function game() {
const PL = +this.dataset.playermove; // Get dataset value as integer
const AI = ~~(Math.random() * 3); // All you need: 0, 1, 2
const result = PL === AI ? 2 : (AI + 1) % 3 === PL ? 0 : 1; // 0=PLwins 1=AIwins 2=draw
score[result]++; // Increment PL or AI's score (Increments number of draws too ;) )
EL_result.innerHTML = `You: ${moves[PL]}<br>AI: ${moves[AI]}<br>${messages[result]}`;
EL_PLScore.textContent = score[0];
EL_AIScore.textContent = score[1];
}
// EVENTS:
[...document.querySelectorAll("[data-playermove]")]
.forEach(el => el.addEventListener("click", game));
*{margin:0;padding:0;box-sizing:border-box;}body{background-color:#24272E;font-family:avenir;}header {background:white;padding:20px;}header>h1{color:#24272E;text-align:center;}.score-board{border:3px solid white;border-radius:4px;width:200px;margin:20px auto;color:white;padding:15px 20px;text-align:center;font-size:46px;position:relative;}.badge{background:#E2584D;font-size:14px;padding:2px 10px;}#user-label{position:absolute;top:30px;left:-25px;}#computer-label{position:absolute;top:30px;right:-30px;}#result{font-size:1.4em;color:white;text-align:center;font-weight: bold;}.choices{text-align:center;margin-top:50px;}[data-playermove]{display:inline-block;border:4px solid white;border-radius:50%;padding:10px;margin:0 20px;transition:all 0.3s ease;}[data-playermove]:hover{cursor:pointer;background:darkblue;}img{height:100px;width:100px;}
<div class="score-board">
<div id="user-label" class="badge">user</div>
<div id="computer-label" class="badge">comp</div>
<span id="PLScore">0</span>:<span id="AIScore">0</span>
</div>
<div id="result"></div>
<div class="choices">
<div data-playermove="0">ROCK</div>
<div data-playermove="1">PAPER</div>
<div data-playermove="2">SCISSORS</div>
</div>