Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mrdcvlsc/minimax-tic-tac-toe
Minimax algorithm for an N x N tic-tac-toe game.
https://github.com/mrdcvlsc/minimax-tic-tac-toe
backtracking-algorithm board-game css dfs evaluation game-theory gametheory html javascript library minimax-algorithm nodejs searching-algorithms tic-tac-toe webapp
Last synced: 27 days ago
JSON representation
Minimax algorithm for an N x N tic-tac-toe game.
- Host: GitHub
- URL: https://github.com/mrdcvlsc/minimax-tic-tac-toe
- Owner: mrdcvlsc
- Created: 2023-06-28T16:36:28.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-09-08T03:22:33.000Z (about 1 year ago)
- Last Synced: 2024-05-07T12:23:21.517Z (6 months ago)
- Topics: backtracking-algorithm, board-game, css, dfs, evaluation, game-theory, gametheory, html, javascript, library, minimax-algorithm, nodejs, searching-algorithms, tic-tac-toe, webapp
- Language: JavaScript
- Homepage: https://minimax-tic-tac-toe-demo.vercel.app/
- Size: 109 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: readme.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# **MiniMax Tic-Tac-Toe**
![tests](https://github.com/mrdcvlsc/minimax-tic-tac-toe/actions/workflows/tests.yml/badge.svg)
![linter](https://github.com/mrdcvlsc/minimax-tic-tac-toe/actions/workflows/linter.yml/badge.svg)A simple project demonstrating my **naive** implementation of the [**minimax**](https://en.wikipedia.org/wiki/Minimax#Pseudocode) algorithm for a tic-tac-toe board with dimensions N x N. It includes a straightforward web application game of tic-tac-toe, allowing you to observe the minimax algorithm in action.
### Test it over the internet :
If you have an internet connection, you can try out my Tic-Tac-Toe web application that showcases my implementation of the minimax-tic-tac-toe algorithm. Here are the links where you can access and test it.
- [Click here to view the DEMO](https://minimax-tic-tac-toe-demo.vercel.app/)
- **Demo raw link** - https://minimax-tic-tac-toe-demo.vercel.app/### Run it locally :
You can also run the aforementioned Tic-Tac-Toe web application locally on your device. To do so, you will need to have Git and Node installed as prerequisites. Once you have them installed, simply enter the following commands in your terminal:
```shell
git clone https://github.com/mrdcvlsc/minimax-tic-tac-toe.git
cd minimax-tic-tac-toe
npm install
node dev
```Then open `localhost:3000` in your browser.
### Example search tree of the minimax algorithm
The minimax algorithm is a backtraking (DFS) searching algorithm. It determines the best move by recursively evaluating possible moves. The three important functions are:
1. **minimax**: Recursively evaluates game states by alternating between maximizing and minimizing players. Returns the best score found at each level.
2. **evaluation**: Assigns a numerical score to a game state based on factors like material advantage and positioning. Guides the algorithm towards favorable positions.
3. **moveGeneration**: Generates all possible legal moves from a given game state, allowing exploration of different possibilities.
The algorithm guarantees an optimal solution, assuming both players play optimally. However, it can be computationally expensive in large state spaces, leading to more efficient algorithms like alpha-beta pruning and/or adding depth limitations to the recursive minimax function.
```mermaid
graph TB
Description["Maximizing nodes will choose the child node that have the highest value.\nMinimizing nodes will choose the child node that have the lowest value."]Evaluation["if player 'X' wins: eval = 1\nif player 'O' wins: eval = -1\nelse: eval = 0"]
``````mermaid
graph LR
subgraph "depth = 3"
P1["Maximizing (X)"]A["X #nbsp; #nbsp; #nbsp; #nbsp; X\n #nbsp; #nbsp; #nbsp; X #nbsp; O\nO #nbsp; #nbsp; #nbsp; #nbsp; O"]
end
subgraph "depth = 2"
P2["Minimizing (O)"]
subgraph "score = depth * eval = 2"
B["X #nbsp; X #nbsp; X \n #nbsp; #nbsp; #nbsp; X #nbsp; O\nO #nbsp; #nbsp; #nbsp; #nbsp; O"]
end
C["X #nbsp; #nbsp; #nbsp; #nbsp; X\nX #nbsp; X #nbsp; O\nO #nbsp; #nbsp;#nbsp; #nbsp; O"]
D["X #nbsp; #nbsp; #nbsp; #nbsp; X\n #nbsp; #nbsp; #nbsp; X #nbsp; O\nO #nbsp; X #nbsp; O"]
endsubgraph "depth = 1"
P3["Maximizing (X)"]
E["X #nbsp; O #nbsp; X\nX #nbsp; X #nbsp; O\nO #nbsp; #nbsp;#nbsp; #nbsp; O"]subgraph "score = depth * eval = -1"
F["X #nbsp; #nbsp; #nbsp; #nbsp; X\nX #nbsp; X #nbsp; O\nO #nbsp; O #nbsp; O"]
end
G["X #nbsp; #nbsp; #nbsp; #nbsp; X\nO #nbsp; X #nbsp; O\nO #nbsp; X #nbsp; O"]
H["X #nbsp; O #nbsp; X\n #nbsp; #nbsp; #nbsp; X #nbsp; O\nO #nbsp; X #nbsp; O"]
endsubgraph "depth = 0 + 1 since last depth"
P4["Minimizing (O)"]
subgraph "score = depth * eval = 0"
I["X #nbsp; O #nbsp; X\nX #nbsp; X #nbsp; O\nO #nbsp; X #nbsp; O"]
end
subgraph "score = depth * eval = 1"
J["X #nbsp; X #nbsp; X\nO #nbsp; X #nbsp; O\nO #nbsp; X #nbsp; O"]
end
subgraph "score = depth * eval = 0"
K["X #nbsp; O #nbsp; X\nX #nbsp; X #nbsp; O\nO #nbsp; X #nbsp; O"]
end
endA <-- 2 --> B
A <-. "(-1)" .-> C
A <-. 0 .-> DC <-. "0" .-> E
C <-- "(-1)" --> F
D <-. 1 .-> G
D <-- 0 --> HE <-- 0 --> I
G <-- 1 --> J
H <-- 0 --> K
``````mermaid
graph TB
Description["Terminal/leaf nodes are the only ones that are evaluated.\nTerminal/leaf nodes are nodes that don't have a child due to the following reasons:\n- There is no possible moves left\n- A player already won\n- The max depth was reached)"]
```