Javascript Tic-tac-toe中的Minimax算法
我正试图用一个基于编码序列的discord机器人重新创建Tic-tac-toe游戏。主要的区别是我希望玩家开始,而且对于3x3网格,我使用了一系列表情符号Javascript Tic-tac-toe中的Minimax算法,javascript,discord.js,bots,artificial-intelligence,Javascript,Discord.js,Bots,Artificial Intelligence,我正试图用一个基于编码序列的discord机器人重新创建Tic-tac-toe游戏。主要的区别是我希望玩家开始,而且对于3x3网格,我使用了一系列表情符号 let tictactoe = [':white_square_button:', ':white_square_button:', ':white_square_button:', ':white_square_button:', ':white_square_button:', ':white_square_button:',
let tictactoe =
[':white_square_button:',
':white_square_button:',
':white_square_button:',
':white_square_button:',
':white_square_button:',
':white_square_button:',
':white_square_button:',
':white_square_button:',
':white_square_button:'];
然后这样写出来:(是的,最初我用的是ScratchForDiscord)
在我第一次移动之后,机器人根本没有响应。但是,如果我重写minimax函数,使其始终返回10(这意味着它将转到第一个可用的单元格),它就可以正常工作。所以问题应该出在minimax函数(或checkWinner)上,但我无法发现错误
(部分)守则:
function bestMove(tictactoe) {
let bestScore = -Infinity;
let z;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
tictactoe[i] = ':x:';
score = minimax(tictactoe, 0, false);
tictactoe[i] = ':white_square_button:';
if (score > bestScore) {
bestScore = score;
z = i;
}
}
}
tictactoe[z] = ':x:';
return tictactoe;
}
function minimax(tictactoe, depth, isMaximizing) {
let result = checkWinner();
if (result !== null) {
if (result == ':x:') {
return 10;
}
else if (result == ':radio_button:') {
return -10;
}
else if (result == 'tie') {
return 0;
}
}
if (isMaximizing == true) {
let bestScore = -Infinity;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
tictactoe[i] = ':x:';
let score = minimax(tictactoe, depth + 1, false);
tictactoe[i] = ':white_square_button:';
bestScore = max(score, bestScore);
}
}
return bestScore;
}
else if (isMaximizing == false) {
let bestScore = Infinity;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
tictactoe[i] = ':radio_button:';
let score = minimax(tictactoe, depth + 1, true);
tictactoe[i] = ':white_square_button:';
bestScore = min(score, bestScore);
}
}
return bestScore;
}
}
function equals3(a, b, c) {
return a == b && b == c && a != ':white_square_button:';
}
function checkWinner() {
let winner = null;
for (let i = 0; i <= 6; i += 3) {
if (equals3(tictactoe[i], tictactoe[i+1], tictactoe[i+2])) {
winner = tictactoe[i];
}
}
for (let i = 0; i <= 2; i++) {
if (equals3(tictactoe[i], tictactoe[i+3], tictactoe[i+6])) {
winner = tictactoe[i];
}
}
if (equals3(tictactoe[0], tictactoe[4], tictactoe[8])) {
winner = tictactoe[0];
}
if (equals3(tictactoe[2], tictactoe[4], tictactoe[6])) {
winner = tictactoe[2];
}
let openSpots = 0;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
openSpots++;
}
}
if (winner == null && openSpots == 0) {
return 'tie';
}
else {
return winner;
}
}
功能最佳移动(tictactoe){
让bestScore=-无穷大;
让z;
for(设i=0;i最佳分数){
最佳分数=分数;
z=i;
}
}
}
tictactoe[z]=':x:';
返回蒂克塔克托;
}
函数minimax(tictactoe,深度,isMaximizing){
让结果=checkWinner();
如果(结果!==null){
如果(结果==':x:'){
返回10;
}
else if(结果=':单选按钮:'){
返回-10;
}
否则,如果(结果='tie'){
返回0;
}
}
如果(isMaximizing==true){
让bestScore=-无穷大;
for(设i=0;i
function bestMove(tictactoe) {
let bestScore = -Infinity;
let z;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
tictactoe[i] = ':x:';
score = minimax(tictactoe, 0, false);
tictactoe[i] = ':white_square_button:';
if (score > bestScore) {
bestScore = score;
z = i;
}
}
}
tictactoe[z] = ':x:';
return tictactoe;
}
function minimax(tictactoe, depth, isMaximizing) {
let result = checkWinner();
if (result !== null) {
if (result == ':x:') {
return 10;
}
else if (result == ':radio_button:') {
return -10;
}
else if (result == 'tie') {
return 0;
}
}
if (isMaximizing == true) {
let bestScore = -Infinity;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
tictactoe[i] = ':x:';
let score = minimax(tictactoe, depth + 1, false);
tictactoe[i] = ':white_square_button:';
bestScore = max(score, bestScore);
}
}
return bestScore;
}
else if (isMaximizing == false) {
let bestScore = Infinity;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
tictactoe[i] = ':radio_button:';
let score = minimax(tictactoe, depth + 1, true);
tictactoe[i] = ':white_square_button:';
bestScore = min(score, bestScore);
}
}
return bestScore;
}
}
function equals3(a, b, c) {
return a == b && b == c && a != ':white_square_button:';
}
function checkWinner() {
let winner = null;
for (let i = 0; i <= 6; i += 3) {
if (equals3(tictactoe[i], tictactoe[i+1], tictactoe[i+2])) {
winner = tictactoe[i];
}
}
for (let i = 0; i <= 2; i++) {
if (equals3(tictactoe[i], tictactoe[i+3], tictactoe[i+6])) {
winner = tictactoe[i];
}
}
if (equals3(tictactoe[0], tictactoe[4], tictactoe[8])) {
winner = tictactoe[0];
}
if (equals3(tictactoe[2], tictactoe[4], tictactoe[6])) {
winner = tictactoe[2];
}
let openSpots = 0;
for (let i = 0; i <= 8; i++) {
if (tictactoe[i] == ':white_square_button:') {
openSpots++;
}
}
if (winner == null && openSpots == 0) {
return 'tie';
}
else {
return winner;
}
}