对不起,标题很抱歉,我不确定如何正确地用措辞
这是我正在尝试制作的Tic Tac Toe游戏-
我试图在我的reset()内部调用我的set(),以便每次单击#reset按钮时,容器上的下一次单击将显示“ X”。
现在,它适用于前两次单击,当我将该函数传递给HTML button标记时,它可以运行3次,但是接下来的单击将显示“ O”。我需要它每次都能正常工作,因为当您重置游戏时,它应该是“ Player 1轮到”,它在容器上显示“ X”
#heads {
padding-top: 30px;
text-align: center;
font-size: 30px;
color: rgb(46, 46, 46);
}
#container {
text-align: center;
margin-top: 20px;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
width: 300px;
height: 300px;
background-color: rgb(46, 46, 46);
border: 1px solid rgb(255, 255, 255);
}
#container div {
font-size: 25px;
border: 2px solid rgb(255, 255, 255);
color: white;
text-align: center;
padding-top: 35px;
}
#container div:hover {
background-color:rgb(58, 58, 58);
}
#reset {
margin-top: 10px;
background-color: rgb(46, 46, 46);
color: white;
border-radius: 3px;
outline: none;
}
#reset:hover {
background-color: rgb(58, 58, 58);
}
#divone {
font-size: 18px;
margin-top: 15px;
color: rgb(46, 46, 46);
}
#divtwo {
display: none;
font-size: 18px;
margin-top: 15px;
color: rgb(46, 46, 46);
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link href="./style.css" type="text/css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <title>Tic Tac Toe </title>
</head>
<body>
<header id="heads">TIC TAC TOE</header>
<center>
<div id="divone">PLAYER 1's TURN</div>
<div id="divtwo">PLAYER 2's TURN</div>
</center>
<center>
<div id="container">
</div>
</center>
<center>
<button id="reset">RESET GAME</button>
</center>
</body>
<script>
const container = document.querySelector('#container')
gameBoard = ['', '', '', '', '', '', '', '', '']
// creates divs for gameboard
let html = '';
for (var i = 0; i <= 8; i++) {
html += '<div class="letters">' + gameBoard[i] + '</div>';
}
container.innerHTML += html;
// object constructors
function Player1(name) {
this.name = name
this.one = function () {
event.target.textContent = 'X'
let x = document.getElementById('playertwo')
}
}
function Player2(name) {
this.name = name
this.two = function () {
event.target.textContent = 'O'
}
}
let bop = new Player1('bop')
let bob = new Player2('bob')
// toggles between player 1 and player 2 functions to mark the table
function set() {
$('#container').click(function () {
var clicks = $(this).data('clicks');
if (clicks) {
bob.two()
} else {
bop.one()
}
$(this).data("clicks", !clicks);
});
}
set()
// 'reset game' button, clears table, sets 'player 1's turn', and makes the next click 'X'
function reset(){
document.querySelector('#reset').addEventListener("click", () => {
set()
container.innerHTML = html;
document.querySelector('#divone').style.display = 'block'
document.querySelector('#divtwo').style.display = 'none'
})
}
reset()
// display whos turn it is
container.addEventListener('click', () => {
if (document.getElementById('divone')) {
if (document.getElementById('divone').style.display == 'none') {
document.getElementById('divone').style.display = 'block';
document.getElementById('divtwo').style.display = 'none';
}
else {
document.getElementById('divone').style.display = 'none';
document.getElementById('divtwo').style.display = 'block';
}
}
})
</script>
</html>
谢谢您的帮助!
答案 0 :(得分:1)
问题在于set函数本身。当您继续调用set函数时,它将继续向容器添加多个事件侦听器。因此,当您单击该框时,单击一次将触发多个事件。而是一次附加一个事件侦听器,然后像下面的代码片段一样在重置时设置正确的数据属性
#heads {
padding-top: 30px;
text-align: center;
font-size: 30px;
color: rgb(46, 46, 46);
}
#container {
text-align: center;
margin-top: 20px;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
width: 300px;
height: 300px;
background-color: rgb(46, 46, 46);
border: 1px solid rgb(255, 255, 255);
}
#container div {
font-size: 25px;
border: 2px solid rgb(255, 255, 255);
color: white;
text-align: center;
padding-top: 35px;
}
#container div:hover {
background-color:rgb(58, 58, 58);
}
#reset {
margin-top: 10px;
background-color: rgb(46, 46, 46);
color: white;
border-radius: 3px;
outline: none;
}
#reset:hover {
background-color: rgb(58, 58, 58);
}
#divone {
font-size: 18px;
margin-top: 15px;
color: rgb(46, 46, 46);
}
#divtwo {
display: none;
font-size: 18px;
margin-top: 15px;
color: rgb(46, 46, 46);
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link href="./style.css" type="text/css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <title>Tic Tac Toe </title>
</head>
<body>
<header id="heads">TIC TAC TOE</header>
<center>
<div id="divone">PLAYER 1's TURN</div>
<div id="divtwo">PLAYER 2's TURN</div>
</center>
<center>
<div id="container">
</div>
</center>
<center>
<button id="reset">RESET GAME</button>
</center>
</body>
<script>
const container = document.querySelector('#container')
gameBoard = ['', '', '', '', '', '', '', '', '']
// creates divs for gameboard
let html = '';
for (var i = 0; i <= 8; i++) {
html += '<div class="letters">' + gameBoard[i] + '</div>';
}
container.innerHTML += html;
// object constructors
function Player1(name) {
this.name = name
this.one = function () {
event.target.textContent = 'X'
let x = document.getElementById('playertwo')
}
}
function Player2(name) {
this.name = name
this.two = function () {
event.target.textContent = 'O'
}
}
let bop = new Player1('bop')
let bob = new Player2('bob')
// toggles between player 1 and player 2 functions to mark the table
$('#container').click(function () {
var clicks = $(this).data('clicks');
console.log(this, $(this).data("clicks"));
if (clicks) {
console.log('two called');
bob.two()
} else {
console.log('one called');
bop.one()
}
$(this).data("clicks", !clicks);
});
// 'reset game' button, clears table, sets 'player 1's turn', and makes the next click 'X'
function reset(){
document.querySelector('#reset').addEventListener("click", () => {
$('#container').data("clicks", false);
container.innerHTML = html;
document.querySelector('#divone').style.display = 'block'
document.querySelector('#divtwo').style.display = 'none'
})
}
reset()
// display whos turn it is
container.addEventListener('click', () => {
if (document.getElementById('divone')) {
if (document.getElementById('divone').style.display == 'none') {
document.getElementById('divone').style.display = 'block';
document.getElementById('divtwo').style.display = 'none';
}
else {
document.getElementById('divone').style.display = 'none';
document.getElementById('divtwo').style.display = 'block';
}
}
})
</script>
</html>