Jumat, 17 April 2026

Python Game - Submarine 6

 




import tkinter as tk

import math

import random

import time


# Game constants

WIDTH, HEIGHT = 800, 600

DRONE_SPEED = 5

TORPEDO_SPEED = 8

ENEMY_TORPEDO_SPEED = 4

ENEMY_COUNT = 5

ENEMY_FIRE_INTERVAL = 3000  # milliseconds


class Game:

    def __init__(self, root):

        self.root = root

        self.root.title("Undersea Drone Animation")

        self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="deep sky blue")

        self.canvas.pack()


        # Player drone position

        self.drone_x, self.drone_y = WIDTH // 2, 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, WIDTH - 50)

            ey = random.randint(50, HEIGHT - 50)

            self.enemies.append([ex, ey])

            self.enemy_angles.append(0)


        # Key bindings

        self.keys = set()

        self.root.bind("<KeyPress>", self.key_press)

        self.root.bind("<KeyRelease>", self.key_release)


        # Start enemy firing loop

        self.root.after(ENEMY_FIRE_INTERVAL, self.enemy_fire)


        # Start animation

        self.animate()


    def key_press(self, event):

        self.keys.add(event.keysym)

        if event.keysym == "space":

            self.fire_torpedo()


    def key_release(self, event):

        self.keys.discard(event.keysym)


    def fire_torpedo(self):

        self.torpedoes.append([self.drone_x, self.drone_y, self.drone_angle])


    def enemy_fire(self):

        for ex, ey in self.enemies:

            if ex != -9999:  # alive enemy

                angle = math.atan2(self.drone_y - ey, self.drone_x - ex)

                self.enemy_torpedoes.append([ex, ey, angle])

        self.root.after(ENEMY_FIRE_INTERVAL, self.enemy_fire)


    def draw_propeller(self, x, y, angle, size=15):

        for i in range(4):

            a = math.radians(angle + i * 90)

            x1 = x + size * math.cos(a)

            y1 = y + size * math.sin(a)

            self.canvas.create_line(x, y, x1, y1, fill="black", width=2)


    def move_objects(self):

        # Player movement

        if "w" in self.keys:

            self.drone_y -= DRONE_SPEED

        if "s" in self.keys:

            self.drone_y += DRONE_SPEED

        if "a" in self.keys:

            self.drone_x -= DRONE_SPEED

        if "d" in self.keys:

            self.drone_x += DRONE_SPEED


        # Keep inside bounds

        self.drone_x = max(20, min(WIDTH - 20, self.drone_x))

        self.drone_y = max(20, min(HEIGHT - 20, self.drone_y))


        # Move player torpedoes

        for t in self.torpedoes:

            t[0] += TORPEDO_SPEED * math.cos(math.radians(t[2]))

            t[1] += TORPEDO_SPEED * math.sin(math.radians(t[2]))


        # Move enemy torpedoes

        for et in self.enemy_torpedoes:

            et[0] += ENEMY_TORPEDO_SPEED * math.cos(et[2])

            et[1] += ENEMY_TORPEDO_SPEED * math.sin(et[2])


    def check_collisions(self):

        # Player torpedo hits enemy

        for t in self.torpedoes:

            for i, (ex, ey) in enumerate(self.enemies):

                if ex != -9999 and math.hypot(t[0] - ex, t[1] - ey) < 20:

                    self.enemies[i] = [-9999, -9999]  # remove enemy

                    t[0] = -9999  # remove torpedo


    def animate(self):

        self.canvas.delete("all")


        # Update angles

        self.drone_angle = (self.drone_angle + 10) % 360

        for i in range(len(self.enemy_angles)):

            self.enemy_angles[i] = (self.enemy_angles[i] + 10) % 360


        # Move objects

        self.move_objects()


        # Check collisions

        self.check_collisions()


        # 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 + 25, self.drone_y, self.drone_angle)


        # Draw enemies

        for (ex, ey), angle in zip(self.enemies, self.enemy_angles):

            if ex != -9999:

                self.canvas.create_oval(ex - 20, ey - 10, ex + 20, ey + 10, fill="red")

                self.draw_propeller(ex - 25, ey, angle)


        # Draw torpedoes

        for t in self.torpedoes:

            self.canvas.create_oval(t[0] - 3, t[1] - 3, t[0] + 3, t[1] + 3, fill="yellow")


        for et in self.enemy_torpedoes:

            self.canvas.create_oval(et[0] - 3, et[1] - 3, et[0] + 3, et[1] + 3, fill="orange")


        # Remove off-screen torpedoes

        self.torpedoes = [t for t in self.torpedoes if 0 < t[0] < WIDTH and 0 < t[1] < HEIGHT]

        self.enemy_torpedoes = [et for et in self.enemy_torpedoes if 0 < et[0] < WIDTH and 0 < et[1] < HEIGHT]


        # Loop animation

        self.root.after(50, self.animate)


if __name__ == "__main__":

    root = tk.Tk()

    Game(root)

    root.mainloop()

Tidak ada komentar: