import tkinter as tk
import math
import random
import time
# Game constants
CANVAS_WIDTH = 800
CANVAS_HEIGHT = 600
DRONE_SPEED = 5
TORPEDO_SPEED = 8
ENEMY_TORPEDO_SPEED = 4
ENEMY_COUNT = 5
ENEMY_FIRE_INTERVAL = 3000 # milliseconds
PROPELLER_RADIUS = 15
PROPELLER_SPOKES = 4
class UnderseaGame:
def __init__(self, root):
self.root = root
self.root.title("Undersea Drone Battle")
self.canvas = tk.Canvas(root, width=CANVAS_WIDTH, height=CANVAS_HEIGHT, bg="deep sky blue")
self.canvas.pack()
self.score = 0
self.score_text = self.canvas.create_text(10, 10, anchor="nw", font=("Arial", 16), fill="white", text="Score: 0")
# Player drone position
self.drone_x = CANVAS_WIDTH // 2
self.drone_y = CANVAS_HEIGHT // 2
self.drone_angle = 0
# Lists for torpedoes and enemies
self.torpedoes = []
self.enemy_torpedoes = []
self.enemies = []
self.enemy_angles = []
# Create enemies
for _ in range(ENEMY_COUNT):
ex = random.randint(50, CANVAS_WIDTH - 50)
ey = random.randint(50, CANVAS_HEIGHT - 50)
self.enemies.append([ex, ey])
self.enemy_angles.append(0)
# Key bindings
self.root.bind("<KeyPress>", self.key_press)
# Start animations
self.animate()
# Schedule enemy firing
self.root.after(ENEMY_FIRE_INTERVAL, self.enemy_fire)
def key_press(self, event):
if event.keysym.lower() == 'w':
self.drone_y -= DRONE_SPEED
elif event.keysym.lower() == 's':
self.drone_y += DRONE_SPEED
elif event.keysym.lower() == 'a':
self.drone_x -= DRONE_SPEED
elif event.keysym.lower() == 'd':
self.drone_x += DRONE_SPEED
elif event.keysym == 'space':
self.fire_torpedo()
def fire_torpedo(self):
self.torpedoes.append([self.drone_x, self.drone_y - 20])
def enemy_fire(self):
for ex, ey in self.enemies:
self.enemy_torpedoes.append([ex, ey])
self.root.after(ENEMY_FIRE_INTERVAL, self.enemy_fire)
def draw_propeller(self, x, y, angle):
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 animate(self):
self.canvas.delete("all")
self.canvas.create_text(10, 10, anchor="nw", font=("Arial", 16), fill="white", text=f"Score: {self.score}")
# Draw player drone
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, self.drone_y, self.drone_angle)
# Update and draw torpedoes
for t in self.torpedoes[:]:
t[1] -= TORPEDO_SPEED
self.canvas.create_rectangle(t[0] - 2, t[1] - 5, t[0] + 2, t[1] + 5, fill="yellow")
# Check collision with enemies
for e in self.enemies[:]:
if abs(t[0] - e[0]) < 20 and abs(t[1] - e[1]) < 10:
self.enemies.remove(e)
self.torpedoes.remove(t)
self.score += 100
break
if t[1] < 0:
self.torpedoes.remove(t)
# Draw enemies
for idx, e in enumerate(self.enemies):
self.canvas.create_oval(e[0] - 20, e[1] - 10, e[0] + 20, e[1] + 10, fill="red")
self.draw_propeller(e[0], e[1], self.enemy_angles[idx])
self.enemy_angles[idx] = (self.enemy_angles[idx] + 15) % 360
# Update and draw enemy torpedoes
for et in self.enemy_torpedoes[:]:
dx = self.drone_x - et[0]
dy = self.drone_y - et[1]
dist = math.hypot(dx, dy)
if dist != 0:
et[0] += (dx / dist) * ENEMY_TORPEDO_SPEED
et[1] += (dy / dist) * ENEMY_TORPEDO_SPEED
self.canvas.create_rectangle(et[0] - 2, et[1] - 5, et[0] + 2, et[1] + 5, fill="orange")
# Check collision with player
if abs(et[0] - self.drone_x) < 20 and abs(et[1] - self.drone_y) < 10:
self.canvas.create_text(CANVAS_WIDTH//2, CANVAS_HEIGHT//2, text="GAME OVER", font=("Arial", 30), fill="white")
self.root.update()
time.sleep(2)
self.root.destroy()
return
# Rotate propellers
self.drone_angle = (self.drone_angle + 15) % 360
self.root.after(50, self.animate)
if __name__ == "__main__":
root = tk.Tk()
game = UnderseaGame(root)
root.mainloop()

Tidak ada komentar:
Posting Komentar