我正在开发一个井字游戏,各种组合可能会产生赢家。我创建了一个包含获胜组合的数组(我使用的是jquery,因此我将它们存储为与HTML中的ID对应的字符串):
var winningCombos = [
["#0", "#1", "#2"],
["#0", "#4", "#8"],
["#0", "#3", "#6"],
["#1", "#4", "#7"],
["#2", "#4", "#6"],
["#2", "#5", "#8"],
["#3", "#4", "#5"],
["#5", "#6", "#7"]
]
我已经编写了一些代码,可以成功地检查这些组合中的任何一个是否包含所有“ x”或全部“ y”,并且当它们组合在一起时,就可以确定赢家。但是,我现在要尝试的是找到一种方法来测试任何3个组合中的2个是否包含“ x”或“ y”。如果他们这样做,则计算机应尝试通过填充将给出获胜的剩余正方形来“阻止”获胜组合。
例如:我要检查每个组合,如果#0和#1都等于“ X”,则计算机应在#2中放置“ O”以阻止获胜。
我在概念上很难做到这一点。我知道其他人已经为这类事情实现了minimax算法,但是我仍然是一个初学者,真的不了解它们如何工作。
更多信息
有人问我如何代表董事会,以及我目前如何检查胜利。
游戏板:
<div class="row" id="row1">
<div class="square" id="0"></div>
<div class="square" id="1"></div>
<div class="square" id="2"></div>
</div>
<div class="row" id="row2">
<div class="square" id="3"></div>
<div class="square" id="4"></div>
<div class="square" id="5"></div>
</div>
<div class="row" id="row3">
<div class="square" id="6"></div>
<div class="square" id="7"></div>
<div class="square" id="8"></div>
</div>
检查胜利
function checkForWin() {
for (var i = 0; i < winningCombos.length; i++) {
//console.log($(winningCombos[i][0]).text().indexOf("X"));
if ($(winningCombos[i][0]).text().indexOf("X") >= 0 && $(winningCombos[i][1]).text().indexOf("X") >= 0 && $(winningCombos[i][2]).text().indexOf("X") >= 0) {
gameOver("x")
} else if ($(winningCombos[i][0]).text().indexOf("O") >= 0 && $(winningCombos[i][1]).text().indexOf("O") >= 0 && $(winningCombos[i][2]).text().indexOf("O") >= 0) {
gameOver("o");
}
}
}
最佳答案
我将创建两个循环:
在第一次循环中,您的阵列计算机将检查用户是否具有三个可能选项中的两个,如果有,则阻止第三个字段。
第二个循环-如果第一个循环没有移动而结束。在第二台计算机中,尝试通过完成阵列中未阻止的获胜可能性之一来取胜(在选择行完成计算机之后,应将其保留在其上,直到它将被阻止或计算机获胜)。
为了获得更好的性能,我将创建两个额外的结构:
对于计算机获胜-结构将删除用户赢得比赛的行,并且计算机不再可能获得该行的获胜
对于用户胜利-结构将删除计算机已占用任何字段的行,并且用户无法再通过该行赢得胜利
多亏了额外的结构可以同时检查这两项内容-阻止用户,并找到可能的获胜行,从而减少了循环次数。
我的解决方案基于您的原始想法-胜利组合阵列。