PROMPT :
python tkinter create submarine with one circle wheel animation with 4 stokes rotate when for Movement press key W → up A → left S → down D → right, when space key is presss, launch missile to top and above there are 20 enemies of small rectangles with moving to a random positions
Got it ✅ — you want a Python Tkinter game where:
- A submarine moves with WASD keys.
- It has one rotating wheel with 4 spokes that spins when moving.
- Spacebar launches a missile upward.
- 20 enemies (small rectangles) move randomly at the top of the screen.
Here’s a complete runnable Tkinter program implementing this:
import tkinter as tk
import random
import math
# Game settings
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
SUBMARINE_SPEED = 5
WHEEL_RADIUS = 15
MISSILE_SPEED = 8
ENEMY_COUNT = 20
ENEMY_SPEED = 2
class SubmarineGame:
def __init__(self, root):
self.root = root
self.root.title("Submarine Game")
self.canvas = tk.Canvas(root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT,
bg="skyblue")
self.canvas.pack()
# Submarine position
self.sub_x = WINDOW_WIDTH // 2
self.sub_y = WINDOW_HEIGHT - 80
self.wheel_angle = 0
self.moving = False
# Create submarine body
self.submarine_body = self.canvas.create_rectangle(
self.sub_x - 40, self.sub_y - 20,
self.sub_x + 40, self.sub_y + 20,
fill="yellow"
)
# Create wheel
self.wheel_center = (self.sub_x, self.sub_y + 25)
self.wheel = self.canvas.create_oval(
self.wheel_center[0] - WHEEL_RADIUS, self.wheel_center[1] - WHEEL_RADIUS,
self.wheel_center[0] + WHEEL_RADIUS, self.wheel_center[1] + WHEEL_RADIUS,
fill="gray"
)
self.spokes = []
for _ in range(4):
self.spokes.append(self.canvas.create_line(0, 0, 0, 0, fill="black", width=2))
# Missiles
self.missiles = []
# Enemies
self.enemies = []
for _ in range(ENEMY_COUNT):
x = random.randint(20, WINDOW_WIDTH - 20)
y = random.randint(20, 100)
rect = self.canvas.create_rectangle(x - 10, y - 10, x + 10, y + 10, fill="red")
self.enemies.append({"id": rect, "dx": random.choice([-ENEMY_SPEED, ENEMY_SPEED]),
"dy": random.choice([-ENEMY_SPEED, ENEMY_SPEED])})
# Key bindings
self.keys = set()
self.root.bind("<KeyPress>", self.key_press)
self.root.bind("<KeyRelease>", self.key_release)
# Start game loop
self.update_game()
def key_press(self, event):
self.keys.add(event.keysym)
def key_release(self, event):
if event.keysym in self.keys:
self.keys.remove(event.keysym)
def move_submarine(self):
dx = dy = 0
self.moving = False
if "w" in self.keys or "W" in self.keys:
dy = -SUBMARINE_SPEED
self.moving = True
if "s" in self.keys or "S" in self.keys:
dy = SUBMARINE_SPEED
self.moving = True
if "a" in self.keys or "A" in self.keys:
dx = -SUBMARINE_SPEED
self.moving = True
if "d" in self.keys or "D" in self.keys:
dx = SUBMARINE_SPEED
self.moving = True
# Move submarine and wheel
self.canvas.move(self.submarine_body, dx, dy)
self.canvas.move(self.wheel, dx, dy)
for spoke in self.spokes:
self.canvas.move(spoke, dx, dy)
# Update wheel center
self.wheel_center = (
self.wheel_center[0] + dx,
self.wheel_center[1] + dy
)
# Rotate wheel if moving
if self.moving:
self.wheel_angle += 0.2
self.draw_spokes()
# Fire missile
if "space" in self.keys:
self.fire_missile()
def draw_spokes(self):
for i, spoke in enumerate(self.spokes):
angle = self.wheel_angle + (math.pi / 2) * i
x1 = self.wheel_center[0] + math.cos(angle) * WHEEL_RADIUS
y1 = self.wheel_center[1] + math.sin(angle) * WHEEL_RADIUS
x2 = self.wheel_center[0] - math.cos(angle) * WHEEL_RADIUS
y2 = self.wheel_center[1] - math.sin(angle) * WHEEL_RADIUS
self.canvas.coords(spoke, x1, y1, x2, y2)
def fire_missile(self):
if not self.missiles or self.canvas.coords(self.missiles[-1])[1] < self.sub_y - 50:
missile = self.canvas.create_rectangle(
self.wheel_center[0] - 2, self.sub_y - 25,
self.wheel_center[0] + 2, self.sub_y - 15,
fill="black"
)
self.missiles.append(missile)
def move_missiles(self):
for missile in self.missiles[:]:
self.canvas.move(missile, 0, -MISSILE_SPEED)
x1, y1, x2, y2 = self.canvas.coords(missile)
if y2 < 0:
self.canvas.delete(missile)
self.missiles.remove(missile)
else:
self.check_missile_collision(missile)
def check_missile_collision(self, missile):
mx1, my1, mx2, my2 = self.canvas.coords(missile)
for enemy in self.enemies[:]:
ex1, ey1, ex2, ey2 = self.canvas.coords(enemy["id"])
if mx1 < ex2 and mx2 > ex1 and my1 < ey2 and my2 > ey1:
self.canvas.delete(enemy["id"])
self.enemies.remove(enemy)
self.canvas.delete(missile)
if missile in self.missiles:
self.missiles.remove(missile)
break
def move_enemies(self):
for enemy in self.enemies:
self.canvas.move(enemy["id"], enemy["dx"], enemy["dy"])
x1, y1, x2, y2 = self.canvas.coords(enemy["id"])
if x1 <= 0 or x2 >= WINDOW_WIDTH:
enemy["dx"] *= -1
if y1 <= 0 or y2 >= 150:
enemy["dy"] *= -1
def update_game(self):
self.move_submarine()
self.move_missiles()
self.move_enemies()
self.root.after(30, self.update_game)
# Run the game
if __name__ == "__main__":
root = tk.Tk()
game = SubmarineGame(root)
root.mainloop()

Tidak ada komentar:
Posting Komentar