Skip to content

Instantly share code, notes, and snippets.

@dewomser
Last active July 14, 2025 20:33
Show Gist options
  • Save dewomser/fd3bd23746d0dc5bab645e738ef90083 to your computer and use it in GitHub Desktop.
Save dewomser/fd3bd23746d0dc5bab645e738ef90083 to your computer and use it in GitHub Desktop.
einfaches Spiel UFO abschießen mit Kanone . Dieses Python wurde von Copilot nch meinem Prompt erstellt erstellt
Mach mir einfaches Spiel mit Python ond tkinter oder besser
Die Spielfläche ist Länge 800px*600px
In der linken unteren Ecke ist eine kleine Kanone
Es gibt 2 Eingabefelder Winkel uns Abschussgeschwindigkeit die vom Spieler eingestellt werden.
Die maximale Reichweite ist die rechte obere Ecke.
Per random wird ein UFO auf der Spielfläche erzeugt. Abstand zum Rand ist 20 px .
Ziel des Spieles ist die Kanone so einzustellen ,dass sie das UFO abschießt
Berechne einen idealen schiefen Wurf für das Geschoss
Zähle die Treffer ! Das Spiel endet wenn das UFO nicht getroffen wird.
import tkinter as tk
from tkinter import messagebox
import math
import random
WIDTH = 800
HEIGHT = 600
RADIUS_UFO = 20
RADIUS_PROJECTILE = 5
GRAVITY = 9.81
class Game:
def __init__(self, root):
self.root = root
self.root.title("Kanone vs UFO")
self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="skyblue")
self.canvas.pack()
# Eingabefelder
control_frame = tk.Frame(root)
control_frame.pack()
tk.Label(control_frame, text="Winkel (°):").grid(row=0, column=0)
self.angle_entry = tk.Entry(control_frame, width=5)
self.angle_entry.grid(row=0, column=1)
tk.Label(control_frame, text="Geschwindigkeit (px/s):").grid(row=0, column=2)
self.speed_entry = tk.Entry(control_frame, width=5)
self.speed_entry.grid(row=0, column=3)
self.shoot_button = tk.Button(control_frame, text="Abschießen!", command=self.shoot)
self.shoot_button.grid(row=0, column=4)
self.treffer = 0
self.treffer_label = tk.Label(control_frame, text="Treffer: 0")
self.treffer_label.grid(row=0, column=5)
# Kanonenposition
self.cannon_x = 20
self.cannon_y = HEIGHT - 20
self.projectile = None
self.ufo = None
self.ufo_x, self.ufo_y = 0, 0
self.create_cannon()
self.spawn_ufo()
def create_cannon(self):
# Zeichne die Kanone (als Rechteck)
self.canvas.create_rectangle(self.cannon_x-10, self.cannon_y-10, self.cannon_x+10, self.cannon_y+10, fill="grey", outline="black")
self.canvas.create_oval(self.cannon_x-6, self.cannon_y-6, self.cannon_x+6, self.cannon_y+6, fill="red")
def spawn_ufo(self):
# Zufällige UFO-Position (mind. 20px Abstand zu jedem Rand)
self.ufo_x = random.randint(RADIUS_UFO+20, WIDTH-RADIUS_UFO-20)
self.ufo_y = random.randint(RADIUS_UFO+20, HEIGHT-RADIUS_UFO-20)
if self.ufo:
self.canvas.delete(self.ufo)
self.ufo = self.canvas.create_oval(
self.ufo_x - RADIUS_UFO, self.ufo_y - RADIUS_UFO,
self.ufo_x + RADIUS_UFO, self.ufo_y + RADIUS_UFO,
fill="green", outline="black", width=3
)
def shoot(self):
try:
angle_deg = float(self.angle_entry.get())
speed = float(self.speed_entry.get())
except ValueError:
messagebox.showerror("Fehler", "Bitte gültige Werte für Winkel und Geschwindigkeit eingeben.")
return
angle_rad = math.radians(angle_deg)
vx = speed * math.cos(angle_rad)
vy = -speed * math.sin(angle_rad) # y nach unten positiv
# Lösche altes Projektil
if self.projectile:
self.canvas.delete(self.projectile)
self.projectile = None
self.animate_projectile(self.cannon_x, self.cannon_y, vx, vy, 0)
def animate_projectile(self, x, y, vx, vy, t):
# t in Sekunden
dt = 0.03
t += dt
# Berechne neue Position
new_x = self.cannon_x + vx * t
new_y = self.cannon_y + vy * t + 0.5 * GRAVITY * (t**2)
# Check: außerhalb Spielfeld?
if new_x < 0 or new_x > WIDTH or new_y < 0 or new_y > HEIGHT:
self.game_over()
return
# Zeichne Projektil
if self.projectile:
self.canvas.delete(self.projectile)
self.projectile = self.canvas.create_oval(
new_x - RADIUS_PROJECTILE, new_y - RADIUS_PROJECTILE,
new_x + RADIUS_PROJECTILE, new_y + RADIUS_PROJECTILE,
fill="black"
)
# Kollision mit UFO prüfen
dist = math.hypot(new_x - self.ufo_x, new_y - self.ufo_y)
if dist <= RADIUS_UFO + RADIUS_PROJECTILE:
self.treffer += 1
self.treffer_label.config(text=f"Treffer: {self.treffer}")
self.canvas.delete(self.projectile)
self.projectile = None
self.spawn_ufo()
return
# Weiter animieren
self.root.after(int(dt*1000), lambda: self.animate_projectile(x, y, vx, vy, t))
def game_over(self):
messagebox.showinfo("Spiel beendet", f"Du hast {self.treffer} UFO(s) getroffen!")
self.root.destroy()
if __name__ == "__main__":
root = tk.Tk()
game = Game(root)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment