Sabtu, 25 April 2026

Python Submarine Game - Submarine Shooting Random Moving Enemies (Bing.com - Copilot AI)

 





PROMPT :

python tkinter create submarine with one circle wheel animation with 4 stokes rotate when for Movement press key W → up A → left S → down D → right, when space key is presss, launch missile to top and above there are 20 enemies of small rectangles with moving to a random positions



Got it ✅ — you want a Python Tkinter game where:

  • submarine moves with WASD keys.
  • It has one rotating wheel with 4 spokes that spins when moving.
  • Spacebar launches a missile upward.
  • 20 enemies (small rectangles) move randomly at the top of the screen.

Here’s a complete runnable Tkinter program implementing this:

import tkinter as tk

import random

import math


# Game settings

WINDOW_WIDTH = 800

WINDOW_HEIGHT = 600

SUBMARINE_SPEED = 5

WHEEL_RADIUS = 15

MISSILE_SPEED = 8

ENEMY_COUNT = 20

ENEMY_SPEED = 2


class SubmarineGame:

    def __init__(self, root):

        self.root = root

        self.root.title("Submarine Game")

        self.canvas = tk.Canvas(root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT, 


bg="skyblue")

        self.canvas.pack()


        # Submarine position

        self.sub_x = WINDOW_WIDTH // 2

        self.sub_y = WINDOW_HEIGHT - 80

        self.wheel_angle = 0

        self.moving = False


        # Create submarine body

        self.submarine_body = self.canvas.create_rectangle(

            self.sub_x - 40, self.sub_y - 20,

            self.sub_x + 40, self.sub_y + 20,

            fill="yellow"

        )


        # Create wheel

        self.wheel_center = (self.sub_x, self.sub_y + 25)

        self.wheel = self.canvas.create_oval(

            self.wheel_center[0] - WHEEL_RADIUS, self.wheel_center[1] - WHEEL_RADIUS,

            self.wheel_center[0] + WHEEL_RADIUS, self.wheel_center[1] + WHEEL_RADIUS,

            fill="gray"

        )

        self.spokes = []

        for _ in range(4):

            self.spokes.append(self.canvas.create_line(0, 0, 0, 0, fill="black", width=2))


        # Missiles

        self.missiles = []


        # Enemies

        self.enemies = []

        for _ in range(ENEMY_COUNT):

            x = random.randint(20, WINDOW_WIDTH - 20)

            y = random.randint(20, 100)

            rect = self.canvas.create_rectangle(x - 10, y - 10, x + 10, y + 10, fill="red")

            self.enemies.append({"id": rect, "dx": random.choice([-ENEMY_SPEED, ENEMY_SPEED]),

                                 "dy": random.choice([-ENEMY_SPEED, ENEMY_SPEED])})


        # Key bindings

        self.keys = set()

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

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


        # Start game loop

        self.update_game()


    def key_press(self, event):

        self.keys.add(event.keysym)


    def key_release(self, event):

        if event.keysym in self.keys:

            self.keys.remove(event.keysym)


    def move_submarine(self):

        dx = dy = 0

        self.moving = False

        if "w" in self.keys or "W" in self.keys:

            dy = -SUBMARINE_SPEED

            self.moving = True

        if "s" in self.keys or "S" in self.keys:

            dy = SUBMARINE_SPEED

            self.moving = True

        if "a" in self.keys or "A" in self.keys:

            dx = -SUBMARINE_SPEED

            self.moving = True

        if "d" in self.keys or "D" in self.keys:

            dx = SUBMARINE_SPEED

            self.moving = True


        # Move submarine and wheel

        self.canvas.move(self.submarine_body, dx, dy)

        self.canvas.move(self.wheel, dx, dy)

        for spoke in self.spokes:

            self.canvas.move(spoke, dx, dy)


        # Update wheel center

        self.wheel_center = (

            self.wheel_center[0] + dx,

            self.wheel_center[1] + dy

        )


        # Rotate wheel if moving

        if self.moving:

            self.wheel_angle += 0.2

            self.draw_spokes()


        # Fire missile

        if "space" in self.keys:

            self.fire_missile()


    def draw_spokes(self):

        for i, spoke in enumerate(self.spokes):

            angle = self.wheel_angle + (math.pi / 2) * i

            x1 = self.wheel_center[0] + math.cos(angle) * WHEEL_RADIUS

            y1 = self.wheel_center[1] + math.sin(angle) * WHEEL_RADIUS

            x2 = self.wheel_center[0] - math.cos(angle) * WHEEL_RADIUS

            y2 = self.wheel_center[1] - math.sin(angle) * WHEEL_RADIUS

            self.canvas.coords(spoke, x1, y1, x2, y2)


    def fire_missile(self):

        if not self.missiles or self.canvas.coords(self.missiles[-1])[1] < self.sub_y - 50:

            missile = self.canvas.create_rectangle(

                self.wheel_center[0] - 2, self.sub_y - 25,

                self.wheel_center[0] + 2, self.sub_y - 15,

                fill="black"

            )

            self.missiles.append(missile)


    def move_missiles(self):

        for missile in self.missiles[:]:

            self.canvas.move(missile, 0, -MISSILE_SPEED)

            x1, y1, x2, y2 = self.canvas.coords(missile)

            if y2 < 0:

                self.canvas.delete(missile)

                self.missiles.remove(missile)

            else:

                self.check_missile_collision(missile)


    def check_missile_collision(self, missile):

        mx1, my1, mx2, my2 = self.canvas.coords(missile)

        for enemy in self.enemies[:]:

            ex1, ey1, ex2, ey2 = self.canvas.coords(enemy["id"])

            if mx1 < ex2 and mx2 > ex1 and my1 < ey2 and my2 > ey1:

                self.canvas.delete(enemy["id"])

                self.enemies.remove(enemy)

                self.canvas.delete(missile)

                if missile in self.missiles:

                    self.missiles.remove(missile)

                break


    def move_enemies(self):

        for enemy in self.enemies:

            self.canvas.move(enemy["id"], enemy["dx"], enemy["dy"])

            x1, y1, x2, y2 = self.canvas.coords(enemy["id"])

            if x1 <= 0 or x2 >= WINDOW_WIDTH:

                enemy["dx"] *= -1

            if y1 <= 0 or y2 >= 150:

                enemy["dy"] *= -1


    def update_game(self):

        self.move_submarine()

        self.move_missiles()

        self.move_enemies()

        self.root.after(30, self.update_game)


# Run the game

if __name__ == "__main__":

    root = tk.Tk()

    game = SubmarineGame(root)

    root.mainloop()


Tidak ada komentar: