1111from Koenig import Koenig
1212from Dialog import Dialog , TextInputDialog
1313from time import time
14+ from resource_path import resource_path
1415
1516class Brett (pygame .sprite .Sprite ):
1617 '''
@@ -80,7 +81,6 @@ def __setupNetzwerkVars(self):
8081 self .__netzVerbundenEvent = threading .Event ()
8182 self .__netzEmpfangThread :threading .Thread | None = None
8283 self .__netzListenerThread :threading .Thread | None = None
83- self .__netzSucheThread :threading .Thread | None = None
8484 self .__spielerName :str = ""
8585 self .__meinTeam :int = 0
8686 self .__wendeRemoteZugAn :bool = False
@@ -120,7 +120,7 @@ def __zeigeNameDialog(self):
120120 Vor.: Die Startdialoggruppe ist initialisiert.
121121 Eff.: Der Dialog zur Namenseingabe ist erstellt und aktiv gesetzt.
122122 Inform einer weißen Box, welche sich ueber das Schachbrett streckt und die Ueberschrift "Name eingeben" traegt.
123- Mit den Unterueberschriften "Weiter", welche Interaktionsmoeglichkeiten darstellen im Bezug zur Ueberschrift.
123+ Mit den Unterueberschriften "Zurück" und " Weiter", welche Interaktionsmoeglichkeiten darstellen im Bezug zur Ueberschrift.
124124 Texteingaben sind in einem Eingabeberreich dargestellt.
125125 Erg.: -
126126 '''
@@ -135,7 +135,9 @@ def __zeigeNameDialog(self):
135135 onVoidClick = self .__generateImage ,
136136 posOffset = self .rect .topleft ,
137137 onSurfaceChange = self .__generateImage ,
138- maxInputLength = 24
138+ maxInputLength = 24 ,
139+ zweiterKnopfText = "Zurück" ,
140+ wennZweiterButton = self .__setupStartDialogs
139141 )
140142 self .__startDialogGruppe .empty ()
141143 self .__startDialogGruppe .add (self .__nameDialog )
@@ -144,16 +146,17 @@ def __zeigeNameDialog(self):
144146 def __zeigeNetzStatusDialog (self , headline :str ):
145147 '''
146148 Vor.: -headline- ist ein String und beschreibt die anzuzeigende Ueberschrift.
147- Eff.: Der Dialog zur Netzwerkinit und Suche ist erstellt und angezeigt.
149+ Eff.: Der Dialog zur Netzwerkinit ist erstellt und angezeigt.
148150 Inform einer weißen Box, welche sich ueber das Schachbrett streckt und die Ueberschrift -headline- mittig traegt.
149- Mit den Unterueberschriften "Erneut suchen", welche eine Interaktionsmoeglichkeit darstellen im Bezug zur Ueberschrift .
151+ Mit den Unterueberschriften zur Anzeige der eigenen IP und zum manuellen Verbinden per IP .
150152 Erg.: -
151153 '''
154+ lokaleIp = self .__holeLokaleIp ()
152155 self .__netzStatusDialog = Dialog (
153156 self .rect .width , self .rect .height ,
154157 (self .rect .width // 2 , self .rect .height // 2 ),
155158 headline , self .rect .height // 14 ,
156- [["Erneut suchen" , self . __starteNetzSuche ], ["IP eingeben" , self .__zeigeIpDialog ]],
159+ [["Eigene IP: " + lokaleIp , None ], ["IP eingeben" , self .__zeigeIpDialog ], [ "Zurück" , self . __zeigeNameDialog ]],
157160 self .rect .height // 10 , 0.7 , False ,
158161 onVoidClick = self .__generateImage ,
159162 posOffset = self .rect .topleft ,
@@ -175,7 +178,9 @@ def __zeigeIpDialog(self):
175178 onVoidClick = self .__generateImage ,
176179 posOffset = self .rect .topleft ,
177180 onSurfaceChange = self .__generateImage ,
178- maxInputLength = 15
181+ maxInputLength = 15 ,
182+ zweiterKnopfText = "Zurück" ,
183+ wennZweiterButton = lambda : self .__zeigeNetzStatusDialog ("Warte auf Verbindung" )
179184 )
180185 self .__startDialogGruppe .empty ()
181186 self .__startDialogGruppe .add (self .__ipDialog )
@@ -257,29 +262,16 @@ def __uebernehmeSpielerName(self, playerName:str):
257262 def __starteMultiplayer (self ):
258263 '''
259264 Vor.: Ein gueltiger Spielername ist gesetzt.
260- Eff.: Multiplayer ist aktiviert, Listener gestartet und Suche wird gestartet .
261- Mittels einen bereits in der optik Beschriebenden Dialogfensters ist der Suchstatus mittels der Ueberschrift "Suche im Netzwerk nach Spiel " abzulesen.
265+ Eff.: Multiplayer ist aktiviert, Listener gestartet und die eigene IP wird zur manuellen Verbindungsaufnahme angezeigt .
266+ Mittels einen bereits in der optik Beschriebenden Dialogfensters ist der Status mittels der Ueberschrift "Warte auf Verbindung " abzulesen.
262267 Erg.: -
263268 '''
264269 self .__netzAktiv = True
265270 print ("Netzwerkstart auf Host:" , socket .gethostname (), "IP:" , self .__holeLokaleIp ())
266- self .__zeigeNetzStatusDialog ("Suche im Netzwerk nach Spiel " )
271+ self .__zeigeNetzStatusDialog ("Warte auf Verbindung " )
267272 if self .__netzListenerThread == None or not (self .__netzListenerThread .is_alive ()):
268273 self .__netzListenerThread = threading .Thread (target = self .__listenerWorker , daemon = True )
269274 self .__netzListenerThread .start ()
270- self .__starteNetzSuche ()
271-
272- def __starteNetzSuche (self ):
273- '''
274- Vor.: -
275- Eff.: Ein Suchthread ist gestartet, falls dieser nicht bereits läuft.
276- Erg.: -
277- '''
278- if self .__netzVerbundenEvent .is_set ():
279- return
280- self .__zeigeNetzStatusDialog ("Suche im Netzwerk nach Spiel" )
281- self .__netzSucheThread = threading .Thread (target = self .__discoveryWorker , daemon = True )
282- self .__netzSucheThread .start ()
283275
284276 def __holeLokaleIp (self )-> str :
285277 '''
@@ -328,47 +320,6 @@ def __listenerWorker(self):
328320 self .__setzeNetzSocket (conn , 1 )
329321 return
330322
331- def __discoveryWorker (self ):
332- '''
333- Vor.: Netzwerkmodus ist aktiv.
334- Eff.: Sucht im lokalen Netz nach Gegenstellen und fuehrt ggf. Handshake aus. Bei Fehlern ist der Fehler im Dialogfenster "LAN-Suche fehlgeschlagen" oder "Kein Spiel gefunden, warte auf Anfrage" ablesbar.
335- Erg.: -
336- '''
337- localIp = self .__holeLokaleIp ()
338- chunks = localIp .split ("." )
339- if len (chunks ) != 4 :
340- self .__zeigeNetzStatusDialog ("LAN-Suche fehlgeschlagen" )
341- return
342- prefix = f"{ chunks [0 ]} .{ chunks [1 ]} .{ chunks [2 ]} "
343- own = int (chunks [3 ])
344- print ("Starte Suche in" , prefix + ".1-254" , "eigene IP-Endung:" , own )
345- for host in range (1 , 255 ):
346- if not (self .__netzAktiv ) or self .__netzVerbundenEvent .is_set ():
347- return
348- if host == own :
349- continue
350- target = f"{ prefix } .{ host } "
351- sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
352- if sock .connect_ex ((target , self .__netzPort )) != 0 :
353- sock .close ()
354- continue
355- print ("Port offen auf" , target )
356- sock .sendall (("ASK;" + self .__spielerName + "\n " ).encode ("utf-8" ))
357- print ("Gesendet an" , target , ": ASK;" + self .__spielerName )
358- raw = sock .recv (2048 )
359- if len (raw ) == 0 :
360- sock .close ()
361- continue
362- responseText = raw .decode ("utf-8" ).strip ()
363- print ("Antwort von" , target , ":" , responseText )
364- if responseText .startswith ("OK;" ):
365- self .__setzeNetzSocket (sock , 0 )
366- return
367- sock .close ()
368- if not (self .__netzVerbundenEvent .is_set ()):
369- print ("Suche fertig, kein Spiel gefunden" )
370- self .__zeigeNetzStatusDialog ("Kein Spiel gefunden, warte auf Anfrage" )
371-
372323 def __setzeNetzSocket (self , sock :socket .socket , localTeam :int ):
373324 '''
374325 Vor.: -sock- ist ein offener Socket, -localTeam- ist eine Team-ID.
@@ -548,14 +499,23 @@ def setupDialogGroup(self):
548499 self .rect .width , self .rect .height ,
549500 (self .rect .width // 2 , self .rect .height // 2 ),
550501 "Was möchtest du tun?" , self .rect .height // 8 ,
551- [["Neues Spiel!" , self .restartGame ]],
502+ [["Neues Spiel!" , self .restartGame ], [ "Zurück" , self . __resignDialogAusblenden ] ],
552503 self .rect .height // 5 , 0.4 , True ,
553504 onVoidClick = self .__generateImage ,
554505 posOffset = self .rect .topleft ,
555506 onSurfaceChange = self .__generateImage
556507 )
557508 self .__DialogGroup .add (self .__resignDialog )
558509
510+ def __resignDialogAusblenden (self ):
511+ '''
512+ Vor.: Der Aufgabedialog ist initialisiert.
513+ Eff.: Der Aufgabedialog ist ausgeblendet und das Brettbild aktualisiert.
514+ Erg.: -
515+ '''
516+ self .__resignDialog .hideSurface ()
517+ self .__generateImage ()
518+
559519 def __reset_game_state (self ):
560520 '''
561521 Vor.: -
@@ -1725,7 +1685,7 @@ def getFieldByCords(self, pos:tuple[int, int])->Feld|None:
17251685
17261686if __name__ == "__main__" :
17271687 pygame .init ()
1728- icon = pygame .image .load ("assets/graphics/icon.png" )
1688+ icon = pygame .image .load (resource_path ( "assets/graphics/icon.png" ) )
17291689 width = 800
17301690 height = width
17311691 screen = pygame .display .set_mode ((width , height ))
0 commit comments