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.
@@ -381,6 +332,10 @@ def __setzeNetzSocket(self, sock:socket.socket, localTeam:int):
381332 return
382333 self .__netzSock = sock
383334 self .__meinTeam = localTeam
335+ if self .__meinTeam == 0 :
336+ self .setRotation (180 )
337+ else :
338+ self .setRotation (0 )
384339 self .__netzVerbundenEvent .set ()
385340 print ("Verbindung hergestellt. Eigenes Team:" , localTeam )
386341 if self .__modusDialog != None :
@@ -548,14 +503,23 @@ def setupDialogGroup(self):
548503 self .rect .width , self .rect .height ,
549504 (self .rect .width // 2 , self .rect .height // 2 ),
550505 "Was möchtest du tun?" , self .rect .height // 8 ,
551- [["Neues Spiel!" , self .restartGame ]],
506+ [["Neues Spiel!" , self .restartGame ], [ "Zurück" , self . __resignDialogAusblenden ] ],
552507 self .rect .height // 5 , 0.4 , True ,
553508 onVoidClick = self .__generateImage ,
554509 posOffset = self .rect .topleft ,
555510 onSurfaceChange = self .__generateImage
556511 )
557512 self .__DialogGroup .add (self .__resignDialog )
558513
514+ def __resignDialogAusblenden (self ):
515+ '''
516+ Vor.: Der Aufgabedialog ist initialisiert.
517+ Eff.: Der Aufgabedialog ist ausgeblendet und das Brettbild aktualisiert.
518+ Erg.: -
519+ '''
520+ self .__resignDialog .hideSurface ()
521+ self .__generateImage ()
522+
559523 def __reset_game_state (self ):
560524 '''
561525 Vor.: -
@@ -1725,7 +1689,7 @@ def getFieldByCords(self, pos:tuple[int, int])->Feld|None:
17251689
17261690if __name__ == "__main__" :
17271691 pygame .init ()
1728- icon = pygame .image .load ("assets/graphics/icon.png" )
1692+ icon = pygame .image .load (resource_path ( "assets/graphics/icon.png" ) )
17291693 width = 800
17301694 height = width
17311695 screen = pygame .display .set_mode ((width , height ))
@@ -1764,4 +1728,5 @@ def getFieldByCords(self, pos:tuple[int, int])->Feld|None:
17641728 TestBrettGroup .draw (screen )
17651729 TestBrettGroup .update ()
17661730 pygame .display .update ()
1767- clock .tick (60 )
1731+
1732+ clock .tick (60 )
0 commit comments