Jumat, 17 April 2026

Python Game - Submarine 5

 



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: