=== car.py ===
from turtle import Turtle
import random
class Car(Turtle):
def __init__(
self,
screen,
controls=None,
max_speed=8,
acceleration=0.3,
steering=4,
friction=0.95,
):
super().__init__("triangle")
self.screen = screen
# Physics
self.speed = 0.0
self.max_speed = max_speed
self.acceleration = acceleration
self.steering = steering
self.friction = friction
# Input state
self.forward_pressed = False
self.backward_pressed = False
self.left_pressed = False
self.right_pressed = False
# Keyboard control or AI?
self.controls = controls
self.ai = controls is None
if controls:
self._bind_controls()
def _bind_controls(self):
keys = self.controls
self.screen.onkeypress(
lambda: setattr(self, "forward_pressed", True), keys["forward"]
)
self.screen.onkeyrelease(
lambda: setattr(self, "forward_pressed", False), keys["forward"]
)
self.screen.onkeypress(
lambda: setattr(self, "backward_pressed", True), keys["backward"]
)
self.screen.onkeyrelease(
lambda: setattr(self, "backward_pressed", False), keys["backward"]
)
self.screen.onkeypress(
lambda: setattr(self, "left_pressed", True), keys["left"]
)
self.screen.onkeyrelease(
lambda: setattr(self, "left_pressed", False), keys["left"]
)
self.screen.onkeypress(
lambda: setattr(self, "right_pressed", True), keys["right"]
)
self.screen.onkeyrelease(
lambda: setattr(self, "right_pressed", False), keys["right"]
)
def update(self):
"""Update one frame."""
if self.ai:
self._random_driver()
# Acceleration
if self.forward_pressed:
self.speed += self.acceleration
if self.backward_pressed:
self.speed -= self.acceleration
# Clamp speed
self.speed = max(-self.max_speed / 2, min(self.speed, self.max_speed))
# Friction
self.speed *= self.friction
# Steering depends on speed
turn = self.steering * (abs(self.speed) / self.max_speed)
if self.left_pressed:
self.left(turn)
if self.right_pressed:
self.right(turn)
self.forward(self.speed)
def _random_driver(self):
"""Simple random AI."""
self.forward_pressed = random.random() < 0.85
self.backward_pressed = random.random() < 0.02
self.left_pressed = random.random() < 0.05
self.right_pressed = random.random() < 0.05
=== main.py ===
from turtle import Screen
from car import Car
screen = Screen()
screen.setup(700, 700)
screen.tracer(False)
player = Car(
screen,
controls={
"forward": "w",
"backward": "s",
"left": "a",
"right": "d",
},
)
enemy = Car(screen) # Random driver
enemy.color("red")
enemy.goto(100, 100)
screen.listen()
def game_loop():
player.update()
enemy.update()
screen.update()
screen.ontimer(game_loop, 16) # ~60 FPS
game_loop()
screen.mainloop()