Skip to content

Commit d5b3eeb

Browse files
Merge pull request #2523 from Shikhar9425/patch-7
Tron.py
2 parents 101d3a4 + 9e01fc4 commit d5b3eeb

File tree

2 files changed

+180
-0
lines changed

2 files changed

+180
-0
lines changed

AI-driven AI Tron/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
Package/Script Name: AI-driven AI Tron
2+
3+
Short Description: AI-driven AI Tron is a Python script that implements an AI player for the game "AI Tron," also known as Snake or Light Cycles. The AI player uses the Alpha-Beta Pruning algorithm to make intelligent moves and maximize its chances of winning.
4+
5+
Functionalities/Script:
6+
7+
TronGame class: Represents the AI Tron game and handles game logic.
8+
AI_move(): Implements the AI's move using the Alpha-Beta Pruning algorithm.
9+
Heuristic evaluation function: Calculates the heuristic value for a given game state.
10+
Board representation: Displays the game board, paddles, and puck.
11+
Setup Instructions:
12+
13+
Make sure you have Python installed on your system (Python 3.6 or higher).
14+
Install the required libraries using pip:
15+
bash
16+
Copy code
17+
pip install pygame
18+
Download the AI_tron.py file from the repository or package.
19+
Explanation of Script:
20+
The AI-driven AI Tron script implements a simple version of the Tron game, where two AI players compete against each other. The AI players use the Alpha-Beta Pruning algorithm to calculate their moves and avoid collisions while trying to eliminate the opponent.
21+
22+
Usage:
23+
24+
Run the AI_tron.py script.
25+
bash
26+
Copy code
27+
python AI_tron.py
28+
The game window will open, showing the AI players (paddles) and the puck (Tron bike).
29+
The AI players will automatically start moving and try to eliminate the opponent.
30+
Output:
31+
The AI-driven AI Tron script will display a window with the game board, AI players, and the puck. The AI players will move automatically based on the calculated moves using the Alpha-Beta Pruning algorithm.
32+
33+
Author:
34+
Shikhar9425

AI-driven AI Tron/Tron.py

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import pygame
2+
import sys
3+
4+
# Define the game window size
5+
WINDOW_WIDTH = 800
6+
WINDOW_HEIGHT = 600
7+
8+
# Define colors
9+
WHITE = (255, 255, 255)
10+
BLACK = (0, 0, 0)
11+
RED = (255, 0, 0)
12+
GREEN = (0, 255, 0)
13+
BLUE = (0, 0, 255)
14+
15+
# Define tile size and number of tiles
16+
TILE_SIZE = 20
17+
NUM_TILES_X = WINDOW_WIDTH // TILE_SIZE
18+
NUM_TILES_Y = WINDOW_HEIGHT // TILE_SIZE
19+
20+
# Define directions
21+
UP = (0, -1)
22+
DOWN = (0, 1)
23+
LEFT = (-1, 0)
24+
RIGHT = (1, 0)
25+
26+
27+
class TronGame:
28+
def __init__(self):
29+
pygame.init()
30+
self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
31+
pygame.display.set_caption("AI-driven AI Tron")
32+
self.clock = pygame.time.Clock()
33+
self.running = True
34+
self.board = [[BLACK for _ in range(NUM_TILES_X)] for _ in range(NUM_TILES_Y)]
35+
self.player1_pos = (NUM_TILES_X // 4, NUM_TILES_Y // 2)
36+
self.player2_pos = (NUM_TILES_X * 3 // 4, NUM_TILES_Y // 2)
37+
self.player1_direction = RIGHT
38+
self.player2_direction = LEFT
39+
40+
def draw_board(self):
41+
for y in range(NUM_TILES_Y):
42+
for x in range(NUM_TILES_X):
43+
pygame.draw.rect(self.screen, self.board[y][x], (x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE))
44+
45+
def move_player(self, player_pos, player_direction, player_color):
46+
x, y = player_pos
47+
dx, dy = player_direction
48+
new_x, new_y = x + dx, y + dy
49+
50+
if not (0 <= new_x < NUM_TILES_X) or not (0 <= new_y < NUM_TILES_Y):
51+
return False
52+
53+
if self.board[new_y][new_x] == BLACK:
54+
self.board[new_y][new_x] = player_color
55+
return (new_x, new_y)
56+
return False
57+
58+
def update(self):
59+
new_player1_pos = self.move_player(self.player1_pos, self.player1_direction, BLUE)
60+
new_player2_pos = self.move_player(self.player2_pos, self.player2_direction, RED)
61+
62+
if not new_player1_pos or not new_player2_pos:
63+
self.running = False
64+
return
65+
66+
self.player1_pos = new_player1_pos
67+
self.player2_pos = new_player2_pos
68+
69+
def ai_move(self, player_pos, player_direction, opponent_pos):
70+
def is_valid_move(new_pos):
71+
x, y = new_pos
72+
return (0 <= x < NUM_TILES_X) and (0 <= y < NUM_TILES_Y) and self.board[y][x] == BLACK
73+
74+
def simulate_move(pos, direction):
75+
x, y = pos
76+
dx, dy = direction
77+
return (x + dx, y + dy)
78+
79+
def alpha_beta_search(pos, direction, opponent_pos, depth, alpha, beta, max_player):
80+
if depth == 0:
81+
return self.heuristic_evaluation(pos, opponent_pos)
82+
83+
if max_player:
84+
value = -float('inf')
85+
for d in [UP, DOWN, LEFT, RIGHT]:
86+
new_pos = simulate_move(pos, d)
87+
if is_valid_move(new_pos):
88+
value = max(value, alpha_beta_search(new_pos, d, opponent_pos, depth - 1, alpha, beta, False))
89+
alpha = max(alpha, value)
90+
if beta <= alpha:
91+
break
92+
return value
93+
else:
94+
value = float('inf')
95+
for d in [UP, DOWN, LEFT, RIGHT]:
96+
new_pos = simulate_move(opponent_pos, d)
97+
if is_valid_move(new_pos):
98+
value = min(value, alpha_beta_search(pos, direction, new_pos, depth - 1, alpha, beta, True))
99+
beta = min(beta, value)
100+
if beta <= alpha:
101+
break
102+
return value
103+
104+
best_score = -float('inf')
105+
best_move = None
106+
for d in [UP, DOWN, LEFT, RIGHT]:
107+
new_pos = simulate_move(player_pos, d)
108+
if is_valid_move(new_pos):
109+
score = alpha_beta_search(new_pos, d, opponent_pos, depth=3, alpha=-float('inf'), beta=float('inf'), max_player=False)
110+
if score > best_score:
111+
best_score = score
112+
best_move = d
113+
return best_move
114+
115+
def heuristic_evaluation(self, player_pos, opponent_pos):
116+
# The heuristic evaluation function calculates the manhattan distance between the player's position and the opponent's position
117+
return -(abs(player_pos[0] - opponent_pos[0]) + abs(player_pos[1] - opponent_pos[1]))
118+
119+
def run(self):
120+
while self.running:
121+
for event in pygame.event.get():
122+
if event.type == pygame.QUIT:
123+
self.running = False
124+
elif event.type == pygame.KEYDOWN:
125+
if event.key == pygame.K_w and self.player1_direction != DOWN:
126+
self.player1_direction = UP
127+
elif event.key == pygame.K_s and self.player1_direction != UP:
128+
self.player1_direction = DOWN
129+
elif event.key == pygame.K_a and self.player1_direction != RIGHT:
130+
self.player1_direction = LEFT
131+
elif event.key == pygame.K_d and self.player1_direction != LEFT:
132+
self.player1_direction = RIGHT
133+
134+
self.screen.fill(WHITE)
135+
self.update()
136+
self.draw_board()
137+
pygame.display.flip()
138+
self.clock.tick(10)
139+
140+
pygame.quit()
141+
142+
143+
if __name__ == "__main__":
144+
game = TronGame()
145+
game.run()
146+

0 commit comments

Comments
 (0)