Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Chess AI with Pygame

This project is a chess game implemented in Python using Pygame for the graphical user interface (GUI) and includes a basic AI opponent (depth can be adjusted). The AI uses a decision-making algorithm for move prediction, running in a separate process from the user interface to keep the UI responsive during gameplay.

Screenshot

Table of Contents

Features

  • Multiprocessing: The UI is implemented as a separate process where
  • Play against AI: Users can play a game of chess against an AI opponent.
  • AI vs AI: We can set both the players to be AI
  • AI Algorithm: The AI is implemented using a basic algorithm for predicting moves, Nega Max alpha beta pruning is being used.
  • Responsive UI: The user interface runs in a separate process, ensuring smooth gameplay without freezing during AI decision-making.
  • Chess Rules: The game enforces standard chess rules, including legal moves and special moves like castling and en passant, undo move, check for pins and checks, animated moves, move log, high squares
  • Game State Management: The current state of the game is maintained, allowing for features like undoing moves.

Technologies

  • Language: Python
  • Library: Pygame for the graphical user interface
  • Multiprocessing: Python's multiprocessing module to separate the UI and AI logic processes

Project Structure

  • assets: Directory containing sample recording and screenshot of the game
  • Chess/images: Directory containing all images of chess pieces
  • Chess/ChessEngine.py: Implemented the chess game by maintaining the game state, implements various features such as undo move, en passant, etc.
  • Chess/SmartMoveFinder.py: Implemented the logic for predicting moves, tried various algorithms such as greedy, min-max, nega max, nega max with alpha beta pruning
  • Chess/ChessMain.py: Integrated the ChessEngine.py and SmartMoveFinder.py files and created the UI using pygame, multiprocessing.

How to run

Development

  • Clone the github repository
git clone git@github.com:MSVelan/Chess_AI.git
  • Ensure dependencies are installed
pipenv shell

Creating the binary/executable:

git clone git@github.com:MSVelan/Chess_AI.git
pip install pyinstaller
pyinstaller --onefile --add-data "Chess/images:Chess/images" --name ChessMain Chess/ChessMain.py
./dist/ChessMain

Installing as a library

Download dist/chess_bot-1.0-py3-none-any.whl or dist/chess_bot-1.0.tar.gz

cd /path/to/downloaded/files
pip install chess_bot-1.0-py3-none-any.whl

or

pip install chess_bot-1.0.tar.gz

Run by:

chess-bot

How the AI works

The AI uses a basic decision-making algorithm to evaluate possible moves and select the best one. It analyzes the current board state and computes valid moves based on the rules of chess. The AI operates in a separate process to ensure that the UI remains responsive while the AI is thinking.

How the AI Finds the Best Move

The Chess AI in this project can find the best move using different algorithms, ranging from simple greedy methods to more advanced techniques like Minimax, NegaMax, and NegaMax with Alpha-Beta Pruning.

1. Simple Greedy Method

The greedy approach evaluates only the next immediate move and the opponent's best response. It does not look beyond the immediate consequences of the current turn.

  • The AI examines all the possible moves the player can make and temporarily makes one.
  • It then evaluates the possible responses the opponent can make, scoring each move based on material advantage (piece values).
  • The AI selects the move that minimizes the advantage the opponent can gain in their next move, assuming the opponent makes the best possible move.

This approach is fast but short-sighted, as it doesn’t consider future moves beyond one response from the opponent.

2. Minimax Algorithm

The Minimax algorithm is a recursive method that simulates all possible moves, not just the immediate ones, looking ahead multiple turns.

  • The algorithm assumes that both players are playing optimally.
  • It alternates between minimizing the opponent's advantage (for the AI's move) and maximizing the AI’s advantage (for the opponent’s move).
  • Each move is given a score based on the game outcome at the end of the possible series of moves.
    • Maximizer (the AI) tries to get the highest score.
    • Minimizer (the opponent) tries to minimize the score.
  • The algorithm chooses the move that leads to the best possible worst-case scenario.

Minimax is a deeper approach, exploring all possible game states up to a certain depth. However, it can be slow because it evaluates every possible move.

3. NegaMax Algorithm

The NegaMax algorithm is a simplified version of Minimax, where instead of alternating between minimizing and maximizing, it negates the evaluation scores based on whose turn it is.

  • The game state is scored from the perspective of the player to move. If it's the AI's turn, the score is positive; if it's the opponent's turn, the score is negative.
  • Instead of maintaining two functions (maximize and minimize), NegaMax uses a single function and negates the score at each level of recursion.

This approach reduces the complexity of the Minimax implementation, making it easier to write and debug while producing the same results.

4. NegaMax Algorithm with Alpha-Beta Pruning

Alpha-Beta Pruning is an optimization technique that improves the NegaMax algorithm by eliminating branches in the decision tree that don’t need to be explored.

  • It keeps track of two values:
    • Alpha: The best value the maximizing player (AI) can guarantee.
    • Beta: The best value the minimizing player (opponent) can guarantee.
  • During the search, if the AI finds a move that leads to a worse outcome than a previously explored move, it stops evaluating further (this is called pruning).
  • This reduces the number of moves that need to be evaluated, significantly speeding up the decision-making process.

Alpha-Beta Pruning doesn’t affect the result of the NegaMax algorithm; it just makes it faster by ignoring unpromising branches.

Summary of Algorithms

AlgorithmDescriptionProsCons
Simple GreedyEvaluates only immediate moves and responsesFastShort-sighted, no depth
MinimaxRecursively evaluates all future movesAccounts for future turnsSlow, explores all branches
NegaMaxSimplified Minimax, negates scores for opponentEasier to implementStill slow without pruning
NegaMax with Alpha-Beta PruningOptimized NegaMax with branch pruningFast, deep lookaheadComplex to implement

These algorithms provide progressively more sophisticated ways of finding the best move, with NegaMax and Alpha-Beta Pruning offering a balance between decision depth and computational efficiency.

Future improvements

  • Use cython to make the app faster.
  • Convert python files to mojo files which will also drastically reduce the runtime.
  • Add multiprocessing for valid move generation to make the app faster.
  • Improve the AI by adding more algorithms
  • Benchmark the app based on nodes per second(nps), time per move, memory usage, depth per second(dps)
  • Add time control formats
  • Measure elo rating of the chess bot.

Optional (Web interface)

  • Convert this app into a website where the UI is handled by the client and the server handles the move generation for the AI bot.
  • Allow User to save their game progress and add authentication for each user if adding the web functionality.
  • Introduce difficulty mode by adjusting depth values and add an UI for this functionality in both the current version of app and web functionality.

Project Recording

You can watch the project recording on here.

About

This project involves creating an AI chess bot in python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages