Last active
July 14, 2025 20:33
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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