Da steckt bestimmt einiges an Zeit drin, also nimm folgendes als konstrucktive Kritik auf und nicht als Versuch dich runter zu "putzen"
1. OOP wäre vieleicht angebracht gewesen, gerade wenn man mit Pygame arbeitet. Vorallem stören die relativ unübersichtlichen Listen.
2. Sieh dir mal deine ganzen globals an, aus meiner Sicht wird das echt widerlich das ganze bei einem Fehler zu debuggen, zudem man globals nach möglichkeit
nie aufgerufen werden sollten. (Was du aber gut 40 mal tust)
3. Deutsche Variablen und Funktionnamen halte ich zwar nicht besonders schön, aber habe Prinzipiell nichts dagegen, solange sie nicht mit englischen gemischt werden, dennoch kann man sich an die PEP8 halten und Funktionsnamen klein und mit Unterstrichen schreiben. Einige bevorzugen da zwar das von dir verwendete CamelCase, aber man sollte diese (zB bei "Wert_testen") nicht mischen.
4. Bei normalen Modul importen, sollte man sich schon für jeden import eine Zeile gönnen.
5. Was sollten immer diese "while any == false:" Geschichten, nutze doch einfach "while not any:" und bei deinen "while test = ...", kann man auch getrost "while True" nehmen und dann bei der korrekten Eingabe ein "break" benutzen. Dann sparst du dir dieses ständige "test = True; test = False; test=....."
6. Du solltest, gerade bei so einem großen Script, deine Main mal richtig Kennzeichnen, dies tut man in Python für gewöhnlich mit "if __name__ == '__main__':", zudem sollte wohl "pygame.init()" auch im Main-Bereich liegen.
7. Für deine Zahlen- und Buchstaben- und Richtungsabfragen würde sich eine Dictionary doch Ideal eignen, wieso machst du daraus einen ganzen if-Stapel. Wobei sich mir auch gleich die Frage gestellt hat, warum man eine GUI nimmt, wenn man dann doch mit der Tastatur die Kästchen auswählt, ich bin mir sicher, das das in Pygame auch die Maus ohne weiteres hierfür nutzen kann.
8. Hast du auch schonmal davon gehört, das man die GUI von der Logik trennen sollte (ich weiß das fällt schwer, auch mir, aber dennoch sollte man es wenigstens Versuchen)
9. Zur Info, das "alphabeet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'", exisitiert im Modul "string", als "string.ascii_uppercase".
10. Irgendwie erschließt sich bei mir nicht der Sinn der ganzen Zähler in "ZeichneSpielfeld", überhaupt, sind deine Funktionen alle ziemlich aufgebläht, vieleicht solltes du mal darüber Nachdenken, die Funktionen in mehrere kleinere Teilaufgaben zu zerlegen.
11. "time.sleep"s mitten im Programm(bzw mitten in Funktionen), können für ein ziemlich Irre führend sein, zumal die meisten GUIs dies nicht vertragen, da ihre Haupt-Schleife nicht mehr aufgerufen wird und damit sich die GUI "einfriert".
12. Sofort raus mit dem "sys.exit" das hat hier nichts verloren, du musst die Hauptschleife der GUI an der Stelle "töten", leider weiß ich nicht was man in Pygame normaler weise dafür nutzt, aber "sys.exit" wird es bestimmt nicht sein.
13. Du solltest dringend deine Abfragen prüfen, ob verschiedene Sachen nicht einfacher gehen, zB lässt sich die Abfrage ob die x- und y-Werte in einem bestimmten Rahmen sind, sehr einfach so abfragen
Code: Alles auswählen
def test_value(x, y, size=10):
return 0 < x < size and 0 < y < size
Deine Methode, packt diese ja noch in einen String, was wiie du vileicht gemerkt hast, nicht gerade eine Sinnvolle Lösung war, da bei 999 Schluß ist. Aber selbst wenn du es so machen willst, wäre es hierfür besser die Sachen getrennt zu machen.
14. Strings kannst du gleich als Listen nutzen, nur verändern geht nicht, so kann man sich aber zB.: "random.choice(['H', 'D', 'L', 'R'])" auf "random.choice('HDLR')" kürzen.
#---------
15. Die Auswahl zu Beginn des Spieles ist sehr verwirrend, zum einen ist dies im Terminal, was ja nicht wild wäre(wirk aber in einer GUI unbequem), aber wieso muss man erst eine Anzahl der Schiffe definieren und dann die einzelnen Schiffe? Es würde doch reichen die Anzahl der einzelnen Schiffe anzugeben, die gesamt Zahl ergibt sich doch daraus.
16. Weiterhin wäre es schön eine Liste mit Schiffen am Rand gelistet zu haben, um diese immer schön im Blick zu haben.
Mir würde noch mehr einfallen, aber ich belasse es erstmal dabei.