Skip to content

Instantly share code, notes, and snippets.

@horstjens
Last active February 28, 2025 15:56
Show Gist options
  • Save horstjens/5388997b03ffc360348733038e2e63a4 to your computer and use it in GitHub Desktop.
Save horstjens/5388997b03ffc360348733038e2e63a4 to your computer and use it in GitHub Desktop.
freesimplegui cannon game
import FreeSimpleGUI as sg
import math
import random
col_player_1_r=sg.Column(layout=[
[sg.Multiline(default_text="history:\n",
autoscroll=True,
key="history",
disabled=True,
size=(50,10))]
])
col_player_1_l=sg.Column(layout=[
[sg.Text("Kanonenspiel")],
[sg.Text("Winkel"),
sg.Slider(range=(1,90),
orientation="h",
size=(25,20),
key="angle")],
[sg.Text("Geschwindigkeit"),
sg.Slider(range=(1,250),
orientation="h",
size=(25,20),
key="speed")],
[sg.Button("Feuer"), sg.Button("clear")],
])
col_player_2_r=sg.Column(layout=[
[sg.Text("Kanonenspiel")],
[sg.Text("Winkel"),
sg.Slider(range=(1,90),
orientation="h",
size=(25,20),
key="angle2")],
[sg.Text("Geschwindigkeit"),
sg.Slider(range=(1,250),
orientation="h",
size=(25,20),
key="speed2")],
[sg.Button("Feuer2"), sg.Button("clear2")],
])
col_player_2_l=sg.Column(layout=[
[sg.Multiline(default_text="history:\n",
autoscroll=True,
key="history2",
disabled=True,
size=(50,10))]
])
MAXX = 1200
layout=[
[col_player_1_l,
col_player_1_r,
col_player_2_l,
col_player_2_r,
],
[sg.Graph((1200,400),(0,0),(MAXX,400),key="canvas", background_color="#FFFFFF")],
[sg.Button("exit")],
]
window=sg.Window("Kanonenspiel", layout)
window.finalize()
figures=[]
schuss_figures = {}
schuss = 0
figures2 = []
schuss_figures2 = {}
schuss2 = 0
kanone1_x = random.uniform(0.1*MAXX, 0.3*MAXX)
kanone2_x = random.uniform(0.7*MAXX, 0.9*MAXX)
kanone1 = window["canvas"].draw_circle((kanone1_x,0),
10,
"#0000ff",
)
kanone2 = window["canvas"].draw_circle((kanone2_x,0),
10,
"#ff0000",
)
game_over = False
while True:
event, values=window.read()
if event in ("exit", sg.WIN_CLOSED):
break
if event=="clear":
for fig in figures:
window["canvas"].delete_figure(fig)
figures=[]
if event=="clear2":
for fig in figures2:
window["canvas"].delete_figure(fig)
figures2=[]
if event=="Feuer2":
schuss2 += 1
schuss_figures2[schuss2] = []
# alte schüsse immer mehr löschen
for alter_schuss_nummer in range(1, schuss2):
to_delete = []
for fig_nr in schuss_figures2[alter_schuss_nummer]:
if random.random() < 0.6:
to_delete.append(fig_nr)
for fnr in to_delete:
window["canvas"].delete_figure(fnr)
schuss_figures2[alter_schuss_nummer].remove(fnr)
try:
figures2.remove(fnr)
except ValueError:
pass
# print(f"Schuss mit Winkel {values['angle']} und Geschwindigkeit {values['speed']}")
y0 = 1 # anfangs h
x0 = MAXX - kanone2_x # start x
# vx=20 #x speed
# vy=20 #y speed
vx = math.cos(math.radians(values["angle2"])) * values['speed2']
vy = math.sin(math.radians(values["angle2"])) * values['speed2']
x = x0 # x pos Kugel
y = y0 # y pos Kugel
t = 0 # time
g = -9.81
while y > 0:
x = x0 + vx * t
y = y0 + vy * t + 0.5 + g * t * t
# fig ist eine nummer
fig = window["canvas"].draw_point((MAXX - x, y), size=2, color='#FF0000')
figures2.append(fig)
schuss_figures2[schuss2].append(fig)
t += 0.01
# multiline feld updaten
txt = values["history2"]
txt += f"\n# {schuss2} winkel: {values['angle2']} speed: {values['speed2']} ergebnis: {x:.2f} {x-MAXX+kanone1_x:.1f} {'zu kurz' if x-MAXX+kanone1_x < 0 else 'zu weit'}"
window["history2"].update(txt)
if abs(x-MAXX+kanone1_x) < 10:
sg.popup_ok("rote Spieler hat gewonnen")
game_over = True
if event == "Feuer":
schuss += 1
schuss_figures[schuss] = []
# alte schüsse immer mehr löschen
for alter_schuss_nummer in range(1, schuss):
to_delete = []
for fig_nr in schuss_figures[alter_schuss_nummer]:
if random.random() < 0.6:
to_delete.append(fig_nr)
for fnr in to_delete:
window["canvas"].delete_figure(fnr)
schuss_figures[alter_schuss_nummer].remove(fnr)
try:
figures.remove(fnr)
except ValueError:
pass
# print(f"Schuss mit Winkel {values['angle']} und Geschwindigkeit {values['speed']}")
y0 = 1 # anfangs h
x0 = kanone1_x # start x
# vx=20 #x speed
# vy=20 #y speed
vx = math.cos(math.radians(values["angle"])) * values['speed']
vy = math.sin(math.radians(values["angle"])) * values['speed']
x = x0 # x pos Kugel
y = y0 # y pos Kugel
t = 0 # time
g = -9.81
while y > 0:
x = x0 + vx * t
y = y0 + vy * t + 0.5 + g * t * t
# fig ist eine nummer
fig = window["canvas"].draw_point((x, y), size=2, color='#0000FF')
figures.append(fig)
schuss_figures[schuss].append(fig)
t += 0.01
# multiline feld updaten
txt = values["history"]
txt += f"\n# {schuss} winkel: {values['angle']} speed: {values['speed']} ergebnis: {x:.2f} {x-kanone2_x:.1f} {'zu kurz' if x-kanone2_x<0 else 'zu weit'} "
window["history"].update(txt)
# treffer?
if abs(x-kanone2_x) < 10:
sg.popup_ok("blauer Spieler hat gewonnen")
game_over = True
if game_over:
window["canvas"].erase()
figures = []
schuss_figures = {}
schuss = 0
figures2 = []
schuss_figures2 = {}
schuss2 = 0
kanone1_x = random.uniform(0.1 * MAXX, 0.3 * MAXX)
kanone2_x = random.uniform(0.7 * MAXX, 0.9 * MAXX)
kanone1 = window["canvas"].draw_circle((kanone1_x, 0),
10,
"#0000ff",
)
kanone2 = window["canvas"].draw_circle((kanone2_x, 0),
10,
"#ff0000",
)
game_over = False
window.close()
#self.pos.x = self.startpos.x + self.startspeed.x * self.t
# self.pos.z = self.startpos.z + self.startspeed.z * self.t
#self.pos.y = self.startpos.y + self.startspeed.y * self.t + 0.5 * gravity.y * self.t * self.t
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment