A Python script that creates and plays the classic "2048" game by itself for a maximum high score during 20 rounds (max 1000 moves each).
Author: Aleksi Bovellan
Technologies: Python 3, Numpy, Math
Algorithms: Expectimax Algorithm with Heuristics
Python Extensions: None (uses standard libraries)
To run the AI-powered 2048 game simulation, simply execute the main script:
python3 2048_ai.py
The script will automatically start simulating the game using the AI. It will display the game board after each move and provide a summary of the results at the end.
2048_ai.py
- The main game script with AI implementationREADME.md
- This file containing instructions and project details
For an optimal experience, Mac users can utilize the Terminal application instead of code editors. Follow these steps to create a virtual environment:
python3 -m venv myenv
source myenv/bin/activate
Since the script only uses standard Python libraries, no additional installations are required. When you're done experimenting, exit the virtual environment by typing deactivate
. To reactivate it later, use source myenv/bin/activate
.
No external packages are required. Ensure you have Python 3 installed on your system.
Optional: if you want to use 'numba' for GPU performance benefits on CUDA, type: pip install numba
The AI utilizes several heuristics and the Expectimax algorithm to make decisions during the game.
- Empty Tile Heuristic: Aims to maximize the number of empty tiles, providing more opportunities for tile merging.
- Smoothness Heuristic: Encourages the arrangement of tiles so that adjacent tiles have similar values, facilitating future merges.
- Monotonicity Heuristic: Promotes keeping the tiles in a specific order (either increasing or decreasing), which helps in creating higher-value tiles.
- Max Tile Heuristic: Favors moves that keep the highest-value tile on the board, pushing towards achieving larger tiles like 2048 or higher.
- Player and Chance Nodes: The algorithm considers both the player's moves and the randomness of new tiles (2 or 4) appearing on the board.
- Search Depth: The depth of the search tree is adjustable (default is 3), providing a balance between foresight and computational efficiency.
- Decision Making: At each move, the AI evaluates possible moves using the heuristics and chooses the one with the highest expected score.
- The game is simulated multiple times (default is 20 runs).
- After each run, the script reports the highest tile achieved.
- At the end, it summarizes the results and highlights the highest tile reached across all simulations.
- Purpose: Entry point of the program.
- Functionality: Initiates the game simulation loop for the specified number of runs.
- Outcome: After each game, displays the maximum tile reached and, at the end, reports the highest tile achieved across all games.
- Manages Game Flow:
- Initializes a blank 4x4 grid.
- Adds random tiles (2 or 4) to start the game.
- AI Decision Making:
- Uses the Expectimax algorithm to select the best move.
- Continues the game until no more moves are possible.
- Result:
- Returns the highest tile achieved in that game.
- Purpose: Core of the AI decision-making process.
- Mechanism:
- Explores possible future moves up to a certain depth.
- Evaluates board states using the combined heuristics.
- Determines the move with the maximum expected utility.
empty_tile_heuristic
: Encourages maintaining empty spaces on the board.smoothness_heuristic
: Rewards arrangements where adjacent tiles have similar values.monotonicity_heuristic
: Favors keeping the tile values in order, either increasing or decreasing.max_tile_heuristic
: Focuses on achieving and maintaining high-value tiles.
These heuristics guide the AI to make strategic decisions that increase the likelihood of achieving higher tiles during the game.
The script is designed to run efficiently on both Macs and PCs without requiring GPU support. It relies solely on standard Python libraries and does not need any specialized hardware. However, if you're using a MacBook (such as an M1 Air), the system may automatically utilize its GPU to enhance performance.
- Adjusting Simulation Runs:
- You can change the number of game simulations by modifying the
num_runs
variable in the script.
- You can change the number of game simulations by modifying the
- Changing Search Depth:
- The AI's lookahead depth can be adjusted by changing the
max_depth
parameter in theplay_game
function. Be aware that increasing the depth may impact runtime performance.
- The AI's lookahead depth can be adjusted by changing the
- Tweaking Heuristic Weights:
- The weights of the heuristics in the
combined_heuristic
function can be modified to experiment with different AI behaviors.
- The weights of the heuristics in the