This Chess AI is under development and built entirely with Python for a focus on readability and code clarity. Despite the limitations of the language in performance speed when compared to compiled languages, the core algorithms have been optimized for maximum speed within Python's capabilities.
The user interface and media controls are powered by the Pygame library, offering a customizable experience. The AI currently understands and utilizes FEN (Forsyth-Edwards Notation) for game state import and export, including castling using FEN support. Further support features are actively being developed.
To get started Clone the repository to a convenient location on your local machine.
You can use the following command in your terminal:
git clone https://github.com/a2ys/chess-ai.git
Even though the program uses a single library, Pygame
, going by the Python conventions is always recommended. So in the main program directory, run the following command:
python -m pip install -r requirements.txt
This command will install the requisite libraries for you.
All set! Now let's bring this program to life. Run the main.py
file using this command in your terminal:
python main.py
While a dedicated settings screen is still under development, you can customize the program's behavior by editing the Constants.py
file. Here's how to make changes:
- Locate the file: Navigate to the
defs
folder within your project directory and openConstants.py
. - Adjust settings: The file contains comments explaining each setting and its current value. You can modify these values directly in the code.
The Game Mode, by default, is set to AI vs AI. If you want to play against an opponenet be it AI or a friend, follow these steps to modify the game mode
-
Locate the
Constants.py
file in the directory containing the game codes and look for the variableGAME_MODE
.
It will look like the block shown below:GAME_MODE = GameModes.AI_VS_AI
-
The
GAME_MODE
variable determines the different modes of playing the game.It can take the following value:GameModes.PLAYER_VS_PLAYER
GameModes.PLAYER_VS_AI
(you play as white, and the computer plays as black)GameModes.AI_VS_PLAYER
(you play as black, and the computer plays as white)GameModes.AI_VS_AI
(default).
The initial board in the game, by default, is set to the standard initial board. To be able to understand and edit the initial board arrangement, you should be familiar with the FEN notation in chess. In case you are familiar, and want to change the inital arrangement, you must do it in the following way:
-
First of all, go to the
Constants.py
file, and search for the variableinitial_board
, which can be found in the beginning of the Python file. It will look like the block shown below:initial_board = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
-
After getting to the variable, set it to the board arrangement of your choice.
The depth to which the AI can think, by default, is set to
-
First of all, go the
Constants.py
file, and search for the variable,DEPTH
. It will look like the block shown below:DEPTH = 2
-
A depth of
$n$ means the AI looks$n$ moves in the future. The time-complexity of the move searching algorithm (negamax with alpha-beta pruning) is$O(b^{n/2})$ in most cases, and the space-complexity is$O(bn)$ ; where$b$ is the number of legal moves available in the position. -
Changing the
DEPTH
with change the number of moves the AI will look forward. Change this variable accoring to the processing power of your machine's processor, or just leave it unchanged.
The Colors, by default, are set to a visually pleasing and less noisy palette but if you wish to customize it, here's how to do it using FEN notataion.
-
Locate the
Constants.py
file and look for the following block of code:# Colors format - [LIGHT, DARK] colors = [(238, 216, 192), (171, 122, 101)] highlight_colors = [(207, 172, 106), (197, 173, 96)] legal_move_colors = [(221, 89, 89), (197, 68, 79)]
-
All the colors are formatted as
RGB
in the order(R, G, B)
. The firsttuple
in everylist
applies color settings to the white squares while the secondtuple
does the same for the black squares. -
The instructions below provide the steps to configure these settings:
- To change the color of the squares when the board is in
idle
state, change the values in thecolors
variable; - To change the color of the square of a piece which is clicked upon by the user, change the values in the
highlight_colors
variable; - To change the colors with which the
legal_move
squares are filled, change the values in thelegal_move_colors
.
- To change the color of the squares when the board is in
The default settings for the WIDTH
, HEIGHT
and FPS
variables are carefully chosen for a seamless experience, but you can customize them if absolutely necessary.
-
Locate the
Constants.py
file, and look for these lines:WIDTH = HEIGHT = 720 FPS = 60
-
Change the values of
WIDTH
andHEIGHT
variables, keeping both equal to each other, and a multiple of$8$ , to avoid any visual inconsistencies. -
The FPS variable controls the game's update rate (frames per second) and is highly dependent on your display's capabilities. You can change the
FPS
to any value supported by your display.
All the other variables/functions in the Constants.py
file, or any other files not mentioned above are not supposed to be edited, and are important in providing necessary functionality to the program.Comments have been added wherever necessary to help understand the program better.
The program currently uses only one library, Pygame
.
Pygame
provides the necessary working GUI for the program, and connects it to the logic of the program. It also facilitates easy rendering of the images, as well as timely production of appropriate sounds.
-
OS: Any operating system with Python 3.x and the required libraries installed.
-
Processor: Any dual-core processor
The program makes an extensive use of your machine's processing power, so it is recommended to use a quad-core processor, for a seamless experience, even though the minimum requirement is dual-core.
-
RAM: At least 2GB or above, DDR3 or above
The program extensively uses hashing and rapid storage and access of information from the machine's primary memory, so it is recommended to have a DDR4 memory to have a hassle-free experience.
-
Permanent storage: Any storage type (SSD recommended)
If you'd like to make changes or contribute to the project, consider the following options:
- Fork the Repository: Fork the repository to create a copy of it on your local machine which you can later modify.
- Make Modifications: Make your desired changes while following coding conventions and best practices.
- Create a Pull Request: Create a pull request to propose your changes for review and potential inclusion in the main project.
Your contributions are wholeheartedly welcome.
If you need further assistance with configuration, or any other topic related to this project, you can create an issue, or mail me at oreus@duck.com. Happy experimenting. :)
The project abides by the GNU GPL Version 3, which can be found here.
In short:
It is a copyleft license, meaning that anyone who distributes software under this license must also provide the source code and make it available to others under the same license terms. The license also includes specific provisions to protect users from patents held by licensors, and is compatible with many other free software licenses. Additionally, the GPL Version 3 includes provisions to prevent "tivoization," which is the use of digital rights management to restrict the use of GPL-licensed software on certain hardware. The license also includes provisions for termination in the event of a violation of its terms, and for ensuring that any downstream recipients are also bound by the same terms.
The license summary above was generated by ChatGPT, and is prone to errors; you should always refer to the original document for a better perspective.