tic-tac-toe-ai | HTML5 Canvas Bitwise Neural networks | Game Engine library
kandi X-RAY | tic-tac-toe-ai Summary
kandi X-RAY | tic-tac-toe-ai Summary
HTML5 Canvas + Bitwise + Neural networks learning how to play tic tac toe
Support
Quality
Security
License
Reuse
Top functions reviewed by kandi - BETA
Currently covering the most popular Java, JavaScript and Python libraries. See a Sample of tic-tac-toe-ai
tic-tac-toe-ai Key Features
tic-tac-toe-ai Examples and Code Snippets
Community Discussions
Trending Discussions on tic-tac-toe-ai
QUESTION
const grabEmptySquares = (array) => {
var emptyGameSquares = [];
for (i = 0; i < 9; i++) {
if (!array[i]) emptyGameSquares.push(i);
}
return emptyGameSquares;
};
function findBestMove(board) {
var bestMove = {
index: null,
evaluation: null,
};
var availableMoves = grabEmptySquares(board);
availableMoves.forEach((move) => {
const simulGameboard = JSON.parse(JSON.stringify(board));
simulGameboard[move] = "o";
const evaluation = minimax(simulGameboard, 1, false);
const moveDetails = {
index: move,
evaluation: evaluation,
};
console.log(moveDetails)
if (evaluation > bestMove.evaluation || bestMove.evaluation === null) {
bestMove.index = move;
bestMove.evaluation = evaluation;
}
});
return bestMove.index;
}
function evaluate(board, isMaximizingPlayer, depth) {
var gameStatus = isGameOver(board);
if (gameStatus[0] != true) return;
if (gameStatus[1] === "win")
return isMaximizingPlayer ? +10 - depth : -10 + depth;
if (gameStatus[1] === "tie") return 0;
}
function minimax(board, depth, isMaximizingPlayer) {
var gameStatus = isGameOver(board);
if (gameStatus[0] == true) {
const evaluation = evaluate(board, !isMaximizingPlayer, depth);
return evaluation;
}
var simulGameboard = JSON.parse(JSON.stringify(board));
var availableMoves = grabEmptySquares(simulGameboard);
if (isMaximizingPlayer) {
bestVal = -Infinity;
availableMoves.forEach((move) => {
depth % 2 === 0
? (simulGameboard[move] = "o")
: (simulGameboard[move] = "x");
value = minimax(simulGameboard, depth + 1, false);
bestVal = Math.max(bestVal, value);
const moveDetails = {
index: move,
evaluation: bestVal,
depth: depth,
};
console.log(moveDetails);
});
return bestVal;
} else {
bestVal = Infinity;
availableMoves.forEach((move) => {
depth % 2 === 0
? (simulGameboard[move] = "o")
: (simulGameboard[move] = "x");
value = minimax(simulGameboard, depth + 1, true);
bestVal = Math.min(bestVal, value);
const moveDetails = {
index: move,
evaluation: bestVal,
depth: depth,
};
console.log(moveDetails);
});
return bestVal;
}
}
function isGameOver(array) {
var gameOver = false;
if (
(array[0] && array[0] === array[1] && array[0] === array[2]) ||
(array[3] && array[3] === array[4] && array[3] === array[5]) ||
(array[6] && array[6] === array[7] && array[6] === array[8])
) {
return (gameOver = [true, "win"]);
}
if (
(array[0] && array[0] === array[4] && array[0] === array[8]) ||
(array[2] && array[2] === array[4] && array[2] === array[6])
) {
return (gameOver = [true, "win"]);
}
if (
(array[1] && array[1] === array[4] && array[4] === array[7]) ||
(array[0] && array[0] === array[3] && array[3] === array[6]) ||
(array[2] && array[2] === array[5] && array[5] === array[8])
) {
return (gameOver = [true, "win"]);
}
if ([...array].every((index) => index)) {
return (gameOver = [true, "tie"]);
}
return (gameOver = [false, null]);
}
...ANSWER
Answered 2021-Apr-08 at 01:07This isn't the easist code to read, but AFAICT the minimax
function copies the game board state once and then loops through possible moves with availableMoves.forEach
. This means that when evaluating each possible move, it acts as if each previously considered move had been made. Move the copy inside the forEach and things should make somewhat more sense.
You already have this in the findBestMove
function. I'd strongly suggest unifying findBestMove
and minimax
(and the sides of the isMaximizingPlayer
branch inside minimax
). Having very similar code in multiple places makes it hard to remember where you have and haven't fixed things.
I'd also suggest replacing the isMaximizingPlayer
and depth%2
logic with a player
variable that can be either "x" or "o", and multiplying goodness scores by -1 as needed. It'll be easier to keep track of.
QUESTION
I have implemented Minimax Algorithm for Tic Tac Toe Game from GeeksForGeeks. I know how the Minimax Algorithm works but my code here doesn't work according to it. I have checked and checked for the things I might be doing wrong and also have debugged it. But it seems, I am not able to find it.
Please look into the algorithm, it would be much thankful for extra set of eyes and to find the incorrect part which I can't seem to find.
I have commented every part of the code that is helpful with Minimax Algorithm. I think it would be easy to catch up.
Please help me out here.
Thank you.
...ANSWER
Answered 2020-Sep-15 at 13:23There a mismatch between your function checkForSpace()
and its use in minimax()
. If there is space left you return false
and if you get a false
in minimax()
you stop the search as if there is a tie. You need to invert the boolean in checkForSpace()
or remove the logical not in minimax()
.
You should propably rename checkForSpace()
and other function that return a boolean. From The Art of Readable Code (Dustin Boswell and Trevor Foucher):
When picking a name for a boolean variable or a function that returns a boolean, be sure it’s clear what
true
andfalse
really mean.Here’s a dangerous example:
QUESTION
i'm trying to make a unbeatable tic tac toe for a side project and i can't make it right (i can actually beat it ironically). It's actually a implementation of the MiniMax algorithm; i came with this code
...ANSWER
Answered 2020-Aug-24 at 13:11There are multiple bugs in your code:
- You are checking the value of
grid[0][0]
ingrid[0][2] == grid[1][1] && grid[0][2] == grid[2][0]
case of the functionevaluateBoard
. It should begrid[0][2]
. playerMov(grid);
in the functionplayerMov
should bereturn playerMov(grid);
. Otherwise, the re-entered "correct" values will be dropped and (partly) uninitalizedplayerMov
will be returned.- You should update
best
tomoveValue
whenmoveValue > best
in the functionfindMove
. (this should be the cause of the issue on your question)
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
Vulnerabilities
No vulnerabilities reported
Install tic-tac-toe-ai
Support
Reuse Trending Solutions
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
Find more librariesStay Updated
Subscribe to our newsletter for trending solutions and developer bootcamps
Share this Page