Hallo Pythoner,
hier ist wieder ein Schiffe Versenken Spiel von Pygame von mir.
Nach dem starten des Spiels durch start.py öffnet sich das Menufenster. Alternativ kann man das Spiel direkt über schiffeversenken.py starten (ohne Einstellmöglichkeiten).
Das neue Spiel besitzt vielfältige Einstellungsmöglichkeiten im Pygamemenu:
-Feldgröße
-Anzahl Schiffe
-Einstellung für automatische Schiffserstellung beim Spieler
-Zweispielermodus
Das Menu wird mit den Pfeiltasten, Nummerntasten (leider nur für Ziffern 0-9) und der Enter-Taste zum starten oder beenden des Spiels.
Danach kann man, wenn man die manuelle Erstellung gewählt hat (nur beim Einspielermodus möglich) die Schiffe im Spielfenster erstellen. Man klickt auf zwei verschiedene Felder in einer Reihe oder Spalte und, das Spiel baut und überprüft das Schiff. Bei einem Fehler wird dieser angezeigt.
Mit der Del/Entf-Taste kann dass zuletzt gebaute Schiff gelöscht werden und mit der Backspace/Zurück-Taste kann der Bau eines Schiffes abgebrochen werden.
Nachdem alle Schiffe gebaut wurden startet automatisch das Spiel.
Die Farben:
grün: unbeschädigte Schiffe
blau: Beschossene Wasserfelder
rot: getroffene Schiffsteile
rosa: versenkte Schiffe
Download
Viel Spaß beim Spielen!
Anregungen und Kritik wären schön.
PS: Entschuldigung an alle Linux-User dass, das Downloadpaket nur als .zip verfügbar ist.
Schiffe Versenken mit Pygame
Zuletzt geändert von Lasse am Mittwoch 20. Juli 2011, 14:44, insgesamt 1-mal geändert.
@Lasse
Das das Paket nur als Zip verfügbar ist stört AFAIK niemanden, aber warum nutzt du google code wenn du nicht einmal das svn-repository nutzt ?
Im Code selbst gibt es auch noch einiges zu verbessern, das fängt bei dem Shebang und der definierten Kodierung an und hört bei der einfachen definition einer main auf.
Was mich direkt im Programm stört ist das die Spieler sich immer abwechseln und das ein Spieler auf das Feld des anderen klicken kann und der Zug dann nicht existent ist.
Das das Paket nur als Zip verfügbar ist stört AFAIK niemanden, aber warum nutzt du google code wenn du nicht einmal das svn-repository nutzt ?
Im Code selbst gibt es auch noch einiges zu verbessern, das fängt bei dem Shebang und der definierten Kodierung an und hört bei der einfachen definition einer main auf.
Was mich direkt im Programm stört ist das die Spieler sich immer abwechseln und das ein Spieler auf das Feld des anderen klicken kann und der Zug dann nicht existent ist.
@Xynon1: Danke für deine Rückmeldung. Aber in Schiffe Versenken wechseln sich die Spieler (bis auf in einigen besonderen Varianten) immer ab. Das dies bei 2 Spielern unpraktisch ist habe ich auch schon gemerkt.
Änderungen zu Version 2.0:
-Shebang hinzugefügt
-Coding hinzugefügt
-Main Funktion
-diverse Fehler korregiert.
http://code.google.com/p/schiffe-versen ... p&can=2&q=
PS: Download auch oben korregiert.
Änderungen zu Version 2.0:
-Shebang hinzugefügt
-Coding hinzugefügt
-Main Funktion
-diverse Fehler korregiert.
http://code.google.com/p/schiffe-versen ... p&can=2&q=
PS: Download auch oben korregiert.
Also ich kenne es so, dass man nach einem Treffer nochmal dran ist, bis man daneben trifft. Wikipedia kennt beide Möglichkeiten, ist also Vereinbarungssache: http://de.wikipedia.org/wiki/Schiffe_ve ... ielverlauf. Kannst ja dem Benutzer erlauben, das selber einzustellen
Sehe ich auch so das sollte man einstellen können. Allerdings ist es nicht das was mich daran gestört hat. Du hast einen kleinen Fehler drin; wenn Spieler1 auf das Feld von Spieler2 klickt, dann wird der Klick zwar ignoriert, aber dennoch ist der andere Spieler an der Reihe.
So hier noch ein paar Mängel im Code die ins Auge stechen.
- Entweder du machst aus deinem Shebang python3 oder du importierst dir aus dem future-Paket die Unicode-Literale oder du nutzt das u-Prefix vor den Strings, denn so wie das Programm jetzt ist läuft es nicht mit Python 2.x
- Aus würde ich machen
- Ebendso kann man so etwas ...
- Deine pygame.init() ist mehrmals auf der Modul-Ebene ich vermute mal du machst das nur weil du die Intialisierung für die Fonts brauchst, dann musst du pygame danach auch wieder deinitialisieren. Das kann man machen um Ressourcen zu laden, aber man sollte es beschränken, in dem Fall also pygame.font.init und pygame.font.quit. Die Initialisierung vom kompletten pygame-Paket sollte man nur einmal in der Main durchführen, zu dem Zeitpunkt sollten alle einzelnen Module deinitialisiert sein. Also nimm deine mehrfachen Initialisierungen raus.
- Wenn du schon einen Font(für den du hoffentlich die nötigen Rechte hast) mitlieferst, dann solltest du ihn nicht nur in der Überschrift nutzen.
- Endlose "while"-Schleifen in Methoden solltest du vermeiden, schon gar nicht in einer Klasse "Grafik". Übergib lieber die Events an die Methode, ruf diese dann immer in der Main auf und reagiere ensprechend auf die Rückgabewerte.
- Einen RuntimeError wegen einem belegten Feld zu werfen finde ich auch nicht korrekt, bau dir einfach eine eigene Exception und werfe dann diese bei solchen Fehlern.
- Mit pygame.display.flip solltest du auch sparsamer umgehen, da der gesamte Bildschirm aktualisiert wird. Eigentlich brauch man diese Methode nur einmal, am Ende aller Zeichnungen.
- Entweder du machst aus deinem Shebang python3 oder du importierst dir aus dem future-Paket die Unicode-Literale oder du nutzt das u-Prefix vor den Strings, denn so wie das Programm jetzt ist läuft es nicht mit Python 2.x
- Aus
Code: Alles auswählen
Spielfeld = schiffeversenken.Grafik(SchiffeMenu.eingaben[0],
SchiffeMenu.eingaben[1],
SchiffeMenu.eingaben[2],
SchiffeMenu.eingaben[3])
Code: Alles auswählen
Spielfeld = schiffeversenken.Grafik(*SchiffeMenu.eingaben)
Code: Alles auswählen
x1 = pos1[0]
x2 = pos2[0]
y1 = pos1[1]
y2 = pos2[1]
#...auch so schreiben
x1, y1 = pos1
x2, y2 = pos2
- Wenn du schon einen Font(für den du hoffentlich die nötigen Rechte hast) mitlieferst, dann solltest du ihn nicht nur in der Überschrift nutzen.
- Endlose "while"-Schleifen in Methoden solltest du vermeiden, schon gar nicht in einer Klasse "Grafik". Übergib lieber die Events an die Methode, ruf diese dann immer in der Main auf und reagiere ensprechend auf die Rückgabewerte.
- Einen RuntimeError wegen einem belegten Feld zu werfen finde ich auch nicht korrekt, bau dir einfach eine eigene Exception und werfe dann diese bei solchen Fehlern.
- Mit pygame.display.flip solltest du auch sparsamer umgehen, da der gesamte Bildschirm aktualisiert wird. Eigentlich brauch man diese Methode nur einmal, am Ende aller Zeichnungen.