javascript - 在 JavaScript 中检查当前玩家是否赢得了 Tic Tac Toe 游戏

标签 javascript html css web tic-tac-toe

我正在使用 html CSS 和 JavaScript 制作一个简单的 Tic Tac Toe。没有实现计算机 AL 播放器。只有两个玩家轮流进行。我的 checkWinner 功能不起作用,我不知道如何确定获胜者。有人建议我创建二维数组来存储获胜组合,这是我在名为 winCombos 的变量中所做的。我正在循环遍历所有这些,并与单元格数组不同位置的 currentPlayer 进行比较,但它不起作用。也许我做的完全错误。有人能帮帮我吗。谢谢

var player1 = "X";
var player2 = "O";
var cells = Array.from(document.querySelectorAll(".cell"));
var currentPlayer = player1;
var winner = "";
var winCombos = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];

function checkWinner(arr, curPlayer){
    arr.forEach(function(subArr){
      var counter = 0;
      subArr.forEach(function(elem){
        if(cells[elem] === curPlayer){
          counter++;
          if(counter == 2 ){
            winner = curPlayer;
            alert(winner);
          }
        }
      });
    });
}

function move(e){
  if(e.target.className === "cell" && e.target.textContent === ""){
    e.target.textContent = currentPlayer;
    checkWinner(winCombos, currentPlayer);
    currentPlayer = (currentPlayer === player1)?player2:player1;
  }
  
}

document.querySelector(".board").addEventListener("click", move);
.container{
  width: 400px;
  height: 480px;
  background: tomato;
  margin: 50px auto;
  text-align: center;
  padding: 10px;
}

.board{
  width: 90%;
  margin: 20px auto;
}

.board .cell{
  width: 118px;
  height: 100px;
  float: left;
  text-align: center;
  line-height: 80px;
  font-size: 80px;
  font-weight: bold;
  border: 1px solid #fff;
  color: #fff;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div class="container">
    
   <div class="board">
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
   </div>
  </div>
</body>
</html>

最佳答案

有两件事:使用 innerHTML 获取 div 的内容,而不是包含整个 div 的字符串。还要检查是否实际上有 3 个连续,而不仅仅是 2 个。(或者您可以将 counter++; 移至检查之后,并将其保留为 counter == 2)

if(cells[elem].innerHTML === curPlayer){
  counter++;
  if(counter == 3 ){
    winner = curPlayer;
    alert(winner);
  }
}

var player1 = "X";
var player2 = "O";
var cells = Array.from(document.querySelectorAll(".cell"));
var currentPlayer = player1;
var winner = "";
var winCombos = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];

function checkWinner(arr, curPlayer){
    arr.forEach(function(subArr){
      var counter = 0;
      subArr.forEach(function(elem){
        if(cells[elem].innerHTML === curPlayer){
          counter++;
          if(counter == 3 ){
            winner = curPlayer;
            alert(winner);
          }
        }
      });
    });
}

function move(e){
  if(e.target.className === "cell" && e.target.textContent === ""){
    e.target.textContent = currentPlayer;
    checkWinner(winCombos, currentPlayer);
    currentPlayer = (currentPlayer === player1)?player2:player1;
  }
  
}

document.querySelector(".board").addEventListener("click", move);
.container{
  width: 400px;
  height: 480px;
  background: tomato;
  margin: 50px auto;
  text-align: center;
  padding: 10px;
}

.board{
  width: 90%;
  margin: 20px auto;
}

.board .cell{
  width: 118px;
  height: 100px;
  float: left;
  text-align: center;
  line-height: 80px;
  font-size: 80px;
  font-weight: bold;
  border: 1px solid #fff;
  color: #fff;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div class="container">
    
   <div class="board">
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
     <div class="cell"></div>
   </div>
  </div>
</body>
</html>

关于javascript - 在 JavaScript 中检查当前玩家是否赢得了 Tic Tac Toe 游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009639/

相关文章:

javascript - 如何像 Excel 舍入函数那样以负精度舍入 js 中的数字

php - 具有固定高度的 HTML 可变图像宽度

html - 使用 CSS 在选择器的内容之前插入 HTML

jquery - 我如何使这种 css 样式和 jquery 像 Doctor div 一样与 Clinic div 一起工作?

html - PrimeNG 组件菜单步骤,我如何使用 ui-steps-incomplete

javascript - 根据标签选择id

javascript - 覆盖 html.js 在 GatsbyJS 中不起作用

javascript - 动态悬停链接时如何显示div?

javascript - 向此 href 添加类..不起作用?

javascript - HTML 更改图像与过渡?