import tkinter as tk
import math
import random
# --- CONFIG ---
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
DRONE_SPEED = 5
TORPEDO_SPEED = 10
ENEMY_COUNT = 5
PROPELLER_RADIUS = 15
PROPELLER_SPOKES = 4
class UnderseaGame:
def __init__(self, root):
self.root = root
self.root.title("Undersea Drone Animation")
self.canvas = tk.Canvas(root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT, bg="deep sky blue")
self.canvas.pack()
# Drone position
self.drone_x = WINDOW_WIDTH // 2
self.drone_y = WINDOW_HEIGHT // 2
self.drone_angle = 0 # For propeller rotation
# Torpedoes list
self.torpedoes = []
# Enemies list
self.enemies = []
self.spawn_enemies()
# Key states
self.keys = {"w": False, "a": False, "s": False, "d": False}
# Bind keys
self.root.bind("<KeyPress>", self.key_press)
self.root.bind("<KeyRelease>", self.key_release)
self.root.bind("<space>", self.fire_torpedo)
# Start animation
self.animate()
def spawn_enemies(self):
"""Spawn enemy submarines at random positions."""
for _ in range(ENEMY_COUNT):
x = random.randint(50, WINDOW_WIDTH - 50)
y = random.randint(50, WINDOW_HEIGHT - 50)
self.enemies.append({"x": x, "y": y, "alive": True, "angle": 0})
def key_press(self, event):
if event.keysym.lower() in self.keys:
self.keys[event.keysym.lower()] = True
def key_release(self, event):
if event.keysym.lower() in self.keys:
self.keys[event.keysym.lower()] = False
def fire_torpedo(self, event):
"""Launch a torpedo from the drone."""
self.torpedoes.append({"x": self.drone_x, "y": self.drone_y})
def move_drone(self):
"""Move drone based on key states."""
if self.keys["w"] and self.drone_y > 0:
self.drone_y -= DRONE_SPEED
if self.keys["s"] and self.drone_y < WINDOW_HEIGHT:
self.drone_y += DRONE_SPEED
if self.keys["a"] and self.drone_x > 0:
self.drone_x -= DRONE_SPEED
if self.keys["d"] and self.drone_x < WINDOW_WIDTH:
self.drone_x += DRONE_SPEED
def move_torpedoes(self):
"""Move torpedoes upward and check collisions."""
for torpedo in self.torpedoes[:]:
torpedo["y"] -= TORPEDO_SPEED
if torpedo["y"] < 0:
self.torpedoes.remove(torpedo)
else:
# Collision check with enemies
for enemy in self.enemies:
if enemy["alive"] and abs(torpedo["x"] - enemy["x"]) < 20 and abs(torpedo["y"] - enemy["y"]) < 20:
enemy["alive"] = False
if torpedo in self.torpedoes:
self.torpedoes.remove(torpedo)
break
def draw_propeller(self, x, y, angle):
"""Draw a rotating propeller with 4 spokes."""
for i in range(PROPELLER_SPOKES):
spoke_angle = math.radians(angle + (360 / PROPELLER_SPOKES) * i)
x_end = x + PROPELLER_RADIUS * math.cos(spoke_angle)
y_end = y + PROPELLER_RADIUS * math.sin(spoke_angle)
self.canvas.create_line(x, y, x_end, y_end, fill="black", width=2)
def draw_drone(self):
"""Draw the drone body and propeller."""
self.canvas.create_oval(self.drone_x - 20, self.drone_y - 10,
self.drone_x + 20, self.drone_y + 10,
fill="gray")
self.draw_propeller(self.drone_x + 25, self.drone_y, self.drone_angle)
def draw_enemies(self):
"""Draw enemy submarines."""
for enemy in self.enemies:
if enemy["alive"]:
self.canvas.create_oval(enemy["x"] - 20, enemy["y"] - 10,
enemy["x"] + 20, enemy["y"] + 10,
fill="red")
self.draw_propeller(enemy["x"] - 25, enemy["y"], enemy["angle"])
def draw_torpedoes(self):
"""Draw all torpedoes."""
for torpedo in self.torpedoes:
self.canvas.create_rectangle(torpedo["x"] - 2, torpedo["y"] - 5,
torpedo["x"] + 2, torpedo["y"] + 5,
fill="yellow")
def animate(self):
"""Main animation loop."""
self.canvas.delete("all")
self.move_drone()
self.move_torpedoes()
# Rotate propellers
self.drone_angle = (self.drone_angle + 15) % 360
for enemy in self.enemies:
enemy["angle"] = (enemy["angle"] + 15) % 360
# Draw everything
self.draw_drone()
self.draw_enemies()
self.draw_torpedoes()
self.root.after(50, self.animate) # ~20 FPS
# --- RUN GAME ---
if __name__ == "__main__":
root = tk.Tk()
game = UnderseaGame(root)
root.mainloop()

Tidak ada komentar:
Posting Komentar