Jumat, 17 April 2026

Python Game - Submarine 7

 





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: