Schiffe Versenken mit Pygame

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

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. :(
Zuletzt geändert von Lasse am Mittwoch 20. Juli 2011, 14:44, insgesamt 1-mal geändert.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

@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. :roll:

Ä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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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 ;)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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

Code: Alles auswählen

Spielfeld = schiffeversenken.Grafik(SchiffeMenu.eingaben[0],
                                            SchiffeMenu.eingaben[1],
                                            SchiffeMenu.eingaben[2],
                                            SchiffeMenu.eingaben[3])
würde ich machen

Code: Alles auswählen

Spielfeld = schiffeversenken.Grafik(*SchiffeMenu.eingaben)
- Ebendso kann man so etwas ...

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
- 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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten