尝试在 JS 石头、剪刀、布游戏中将 span 元素设置为等于变量值
我正在编写一个玩石头、剪刀、布的程序。在我编写代码时,一切都很顺利,直到我添加了:
userScore_span.InnerHTML = userScore;
行。在测试 win 函数时,我添加了 console.log('you win'); 并且它运行良好,但是当我添加上面的行时,当我按下三个按钮中的任何一个时,我都会收到错误。
我试图将 userScore 的结果传递给 userScore_span,因为 userScore 在游戏获胜后会增加
userScore++;
userScore_span.innerHTML = userScore;
但是,当我按下任何按钮时,我都会收到错误:
Uncaught TypeError: Cannot set property 'innerHTML' of null
at lose (app.js:34)
at game (app.js:58)
我不确定 chrome Dev 工具的意思是什么。如何修复?
let userScore = 0;
let computerScore = 0;
const userScore_span = document.getElementById("user-score");
const computerScore_span = document.getElementById("computer-score");
const scoreBoard_div = document.querySelector(".score-board");
const result_p = document.querySelector(".result > p");
const rock_div = document.getElementById('r');
const paper_div = document.getElementById('p');
const scissors_div = document.getElementById('s');
function getComputerChoice() {
const choices = ['r', 'p', 's'];
const randomNumber = (Math.floor(Math.random() * 3));
return choices[randomNumber];
}
function convertToWord(letter) {
if (letter === "r") return "Rock";
if (letter === "p") return "Paper";
return "Scissors";
}
function win(userChoice, computerChoice) {
userScore++;
userScore_span.innerHTML = userScore;
computerScore_span.innerHTML = computerScore;
const smallUserWord = "user".fontsize(3).sub();
const smallCompWord = "comp".fontsize(3).sub();
result_p.innerHTML = `${convertToWord(userChoice)}${smallUserWord} beats ${convertToWord(computerChoice)}${smallCompWord}. You win!`;
}
function lose(userChoice, computerChoice) {
computerScore++;
userScore_span.innerHTML = userScore;
computerScore_span.innerHTML = computerScore;
const smallUserWord = "user".fontsize(3).sub();
const smallCompWord = "comp".fontsize(3).sub();
result_p.innerHTML = `${convertToWord(userChoice)}${smallUserWord} loses to ${convertToWord(computerChoice)}${smallCompWord}. You lost!`;
}
function draw(userChoice, computerChoice) {
const smallUserWord = "user".fontsize(3).sub();
const smallCompWord = "comp".fontsize(3).sub();
result_p.innerHTML = `${convertToWord(userChoice)}${smallUserWord} equals ${convertToWord(computerChoice)}${smallCompWord}. It's a draw`;
}
function game(userChoice) {
const computerChoice = getComputerChoice();
switch (userChoice + computerChoice) {
case "rs":
case "pr":
case "sp":
win(userChoice, computerChoice);
break;
case 'rp':
case 'ps':
case 'sr':
lose(userChoice, computerChoice);
break;
case 'rr':
case 'pp':
case 'ss':
draw(userChoice, computerChoice);
break;
}
}
function main() {
rock_div.addEventListener('click', function() {
game('r');
})
paper_div.addEventListener('click', function() {
game('p');
})
scissors_div.addEventListener('click', function() {
game('s');
})
};
main();
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #24272E;
font-family: avenir;
}
header {
background: white;
padding: 20px;
}
/*header each one*/
header>h1 {
color: #24272E;
text-align: center;
}
.score-board {
border: 3px solid white;
border-radius: 4px;
width: 200px;
margin: 20px auto;
/*20px (top/bottom) & center (left/right) */
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: 40px;
color: white;
}
.result>p {
text-align: center;
font-weight: bold;
}
.choices {
text-align: center;
margin-top: 50px;
}
.choice {
display: inline-block;
border: 4px solid white;
border-radius: 50%;
padding: 10px;
margin: 0 20px;
transition: all 0.3s ease;
}
.choice:hover {
cursor: pointer;
background: darkblue;
}
img {
height: 100px;
width: 100px;
}
#action-message {
text-align: center;
color: white;
font-weight: bold;
font-size: 20px;
margin-top: 20px
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Rock Paper Scissors</title>
<meta name="description" content="DESCRIPTION">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<h1>Rock Paper Scissors</h1>
</header>
<div class="score-board">
<div id="user-label" class="badge">user</div>
<div id="computer-label" class="badge">comp</div>
<span idea="user-score">0</span>:<span idea="computer-score">0</span>
</div>
<div class="result">
<p>Paper cover rock. You win!</p>
</div>
<div class="choices">
<div class="choice" id="r">
<img src="images/rock.png" alt="rock">
</div>
<div class="choice" id="p">
<img src="images/paper.png" alt="paper">
</div>
<div class="choice" id="s">
<img src="images/scissors.png" alt="scissors">
</div>
</div>
<p id="action-message">Make your move</p>
</body>
<script src="app.js"></script>
</html>
除了您的拼写错误
idea=
/
id=
...
您可以通过
使用索引
整数来大幅
缩小游戏逻辑
和代码。
整数游戏
-
对用户按钮使用
data-*
属性。这些属性应包含数值0、1、2
。点击后,值将代表玩家的选择。 -
AI 也应该玩数字:
const AI = ~~(Math.random() * 3) // 0, 1, 2
现在您知道 AI 和 Player 都
使用整数
(而不是奇怪的字母组合),您可以将
移动名称
存储到数组
const moves = ["Rock", "Paper", "Scissors"];
中(其中
0
为
Rock
... 等)
石头剪刀布逻辑
游戏有 三 个可能的 回合结果 , PL 获胜,AI 获胜,平局 。 让我们将这些 “人类” 值转换为整数,顺序相同:
-
0
= PL 获胜 -
1
= AI 获胜 -
2
= 平局
计算方法如下:
平局
计算平局是最简单的。当
AI
和
PL
整数相等时。
让我们返回
2
result = PL === AI ? 2
玩家获胜
要计算玩家获胜,只需
将 AI 选择增加 1 并取模 3
。如果此操作的结果等于玩家的选择,则玩家必定获胜!
让我们返回
0
AI 获胜
否则,由于我们的游戏只有 3 种可能的状态,所以不是平局,也不是​​玩家获胜,所以一定是 AI 获胜!
让我们返回
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!<​​/p>
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));
<button data-playermove="0">ROCK</button>
<button data-playermove="1">PAPER</button>
<button data-playermove="2">SCISSORS</button>
<br>
YOU | <span id="PLScore">0</span>:<span id="AIScore">0</span> | AI
<div id="result"></div>
拼写错误:
idea
<>
id
将此:
<span idea="user-score">0</span>:<span idea="computer-score">0</span>
更改为
<span id="user-score">0</span>:<span id="computer-score">0</span>
let userScore = 0;
let computerScore = 0;
const userScore_span = document.getElementById("user-score");
const computerScore_span = document.getElementById("computer-score");
const scoreBoard_div = document.querySelector(".score-board");
const result_p = document.querySelector(".result > p");
const rock_div = document.getElementById('r');
const paper_div = document.getElementById('p');
const scissors_div = document.getElementById('s');
function getComputerChoice() {
const choices = ['r', 'p', 's'];
const randomNumber = (Math.floor(Math.random() * 3));
return choices[randomNumber];
}
function convertToWord(letter) {
if (letter === "r") return "Rock";
if (letter === "p") return "Paper";
return "Scissors";
}
function win(userChoice, computerChoice) {
userScore++;
userScore_span.innerHTML = userScore;
computerScore_span.innerHTML = computerScore;
const smallUserWord = "user".fontsize(3).sub();
const smallCompWord = "comp".fontsize(3).sub();
result_p.innerHTML = `${convertToWord(userChoice)}${smallUserWord} beats ${convertToWord(computerChoice)}${smallCompWord}. You win!`;
}
function lose(userChoice, computerChoice) {
computerScore++;
userScore_span.innerHTML = userScore;
computerScore_span.innerHTML = computerScore;
const smallUserWord = "user".fontsize(3).sub();
const smallCompWord = "comp".fontsize(3).sub();
result_p.innerHTML = `${convertToWord(userChoice)}${smallUserWord} loses to ${convertToWord(computerChoice)}${smallCompWord}. You lost!`;
}
function draw(userChoice, computerChoice) {
const smallUserWord = "user".fontsize(3).sub();
const smallCompWord = "comp".fontsize(3).sub();
result_p.innerHTML = `${convertToWord(userChoice)}${smallUserWord} equals ${convertToWord(computerChoice)}${smallCompWord}. It's a draw`;
}
function game(userChoice) {
const computerChoice = getComputerChoice();
switch (userChoice + computerChoice) {
case "rs":
case "pr":
case "sp":
win(userChoice, computerChoice);
break;
case 'rp':
case 'ps':
case 'sr':
lose(userChoice, computerChoice);
break;
case 'rr':
case 'pp':
case 'ss':
draw(userChoice, computerChoice);
break;
}
}
function main() {
rock_div.addEventListener('click', function() {
game('r');
})
paper_div.addEventListener('click', function() {
game('p');
})
scissors_div.addEventListener('click', function() {
game('s');
})
};
main();
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #24272E;
font-family: avenir;
}
header {
background: white;
padding: 20px;
}
/*header each one*/
header>h1 {
color: #24272E;
text-align: center;
}
.score-board {
border: 3px solid white;
border-radius: 4px;
width: 200px;
margin: 20px auto;
/*20px (top/bottom) & center (left/right) */
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: 40px;
color: white;
}
.result>p {
text-align: center;
font-weight: bold;
}
.choices {
text-align: center;
margin-top: 50px;
}
.choice {
display: inline-block;
border: 4px solid white;
border-radius: 50%;
padding: 10px;
margin: 0 20px;
transition: all 0.3s ease;
}
.choice:hover {
cursor: pointer;
background: darkblue;
}
img {
height: 100px;
width: 100px;
}
#action-message {
text-align: center;
color: white;
font-weight: bold;
font-size: 20px;
margin-top: 20px
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Rock Paper Scissors</title>
<meta name="description" content="DESCRIPTION">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<h1>Rock Paper Scissors</h1>
</header>
<div class="score-board">
<div id="user-label" class="badge">user</div>
<div id="computer-label" class="badge">comp</div>
<span id="user-score">0</span>:<span id="computer-score">0</span>
</div>
<div class="result">
<p>Paper cover rock. You win!</p>
</div>
<div class="choices">
<div class="choice" id="r">
<img src="images/rock.png" alt="rock">
</div>
<div class="choice" id="p">
<img src="images/paper.png" alt="paper">
</div>
<div class="choice" id="s">
<img src="images/scissors.png" alt="scissors">
</div>
</div>
<p id="action-message">Make your move</p>
</body>
<script src="app.js"></script>
</html>