4 Gewinnt in Python 3.3?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kreutzi
User
Beiträge: 1
Registriert: Freitag 5. September 2014, 02:13

Hi Leute :)

Es ist mir tatsächlich ganz schön unangenehm, danach zu fragen, aber ich weiß einfach nicht weiter.

Ich bin in der 12. Klasse eines Gymnasiums und im Informatik-Grundkurs haben wir gerade ein Projekt vor uns, was wir demnächst abschließen müssen, wir sollen ein 4-Gewinnt-Spiel programmieren, mit Python 3 - der Sprache, die wir benutzen - mithilfe unserer derzeitigen Kenntnisse, die wir laut unseres Lehrers haben müssten.

Und dabei brauche ich Hilfe, ich muss nämlich ehrlich sagen, ich verstehe im Prinzip gar nichts, wenn es um das Umsetzen von Programmideen oder Objekt-/Klassendiagrammen in Python selbst geht. Das Problem ist einfach, dass unser Lehrer uns nichts beibringt, er liest einfach nur seine vorbereitete Powerpointpräsentation vor, in der alles in der Theorie erklärt wird und lässt uns dann mit einer Aufgabe alleine, die die meisten von uns einfach nicht hinkriegen können, weil er uns in keinster Weise in der Praxis hilft. Wie man etwas denn dann wirklich im Programm umsetzt, wird einfach nicht erklärt, sollen wir uns selbst beibringen, frägt man nach, hat er dafür "keine Zeit", oder man "hätte besser aufpassen sollen", oder er hat es "schon tausende male erklärt".

Ich hoffe, ihr versteht, dass ich echt auf dem Schlauch stehe, und dass ihr mir vielleicht helfen könntet, dass zu schaffen.

Die Zielsetzung ist, einfach, ein stinknormales 4-Gewinnt zu entwickeln, mit einer einfachen visuellen Darstellung, das Spiel soll erkennen, ob jemand gewonnen hat und das natürlich ausgeben, aber auch Sonderfälle wie ein vollen Spielplan und ähnliches erkennen und ausgeben. Das reicht fürs erste, Dinge wie Computergegner oder sogar Netzwerkunterstützung brauchen wir nicht.

Wir arbeiten im moment mit Klassen in Python und müssen dementsprechend als Grundlage des Programms auch auf Klassen setzen. Ich habe mir gedacht, fünf Klassen anzulegen, wie es auch empfohlen wurde, von einem Schüler von mir:

- Eine Spielerklasse, in der alle Spieler, die mitspielen können, "gespeichert" werden, mit einer Methode, die den Zug eines Spielers ausführt

- Eine Spielfeldklasse, bestehend aus einem Raster, mit 6x7 Feldern, in denen die Steine liegen können. Da man zum Stein einwerfen, eine Positionsangabe machen muss, sollten also auch Daten vorhanden sein, um eine Position "abzuspeichern" oder so ähnlich, zudem sollte dann irgendwann das Spielfeld einAussehen annehmen. Diese Aussehen würde dann wahrscheinlich eine eigene Klasse verwenden, eine...

-...GUI-Klasse (GUI ist etwas, wovon ich ebenfalls überhaupt keine AHnung habe :K )

- Eine Gebrauchsanleitungsklasse, wo dann die Regeln enthalten sind, mithilfe dieser Klasse, soll gecheckt werden, ob ein gemachter Zug auch so möglich war, und ob ein Spieler gewonnen hat oder nicht, und dies soll ausgegeben werden.

- eine Klasse für das Spiel an sich, was alle anderen Klassen hat und dann das Spiel startet und beendet.


Nun ist die Frage , wie man das in Python implementieren kann, für mich persönlich ein Ding der Unmöglichkeit :oops: . Vor allem der Anfang, ich habe keine Ahnung, mit was ich beginnen sollen.

Ich hoffe, ihr könnt mir dabei ein wenig helfen, ich bin natürlich gerne bereit, mitzudenken, mache ich ja auch, aber ich habe wirklich nur absolute Grundgrundgrundkenntnisse von Python und habe deshalb dabei große Schwierigkeiten. :|

Vielen Dank im Vorraus.

mfg :)
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Die ersten zwei Codezeilen:

Code: Alles auswählen

print("Reihe: 1 bis 7, Ende: X")
eingabe = input("Machen Sie Ihre Eingabe>> ")
Warum sollte ich das so machen, wie von dir beschrieben? Es würde doch z. B. reichen, wenn der Benutzer eine Reihe auswählt, d. h. das Spielfeld in der Ausgabe könnte später auch so aussehen:

Code: Alles auswählen

[  ] [  ] [  ] [  ] [  ] [  ] [  ] 
[  ] [  ] [  ] [  ] [  ] [  ] [  ] 
[  ] [  ] [  ] [  ] [  ] [  ] [  ] 
[O] [  ] [  ] [  ] [  ] [  ] [  ] 
[O] [  ] [  ] [  ] [  ] [  ] [  ] 
[O] [  ] [X] [X] [X] [  ] [  ] 

Reihe: 1 bis 7, Ende: X
Machen Sie Ihre Eingabe>> 
Den Rest erledigt das Programm. Oben fehlt m. E. bei input noch die Angabe des Spielers. Keep it simple and smart, d. h. überleg immer, was genau du benötigst. Gedanklich würde ich z. B. einen Zähler mitlaufen lassen für die bislang getätigten gültigen Spielzüge. Wenn der 6 * 7 = 42 erreicht, weiß ich, dass wenn keiner zu diesem Zeitpunkt gewonnen hat, das Spiel wohl unentschieden geendigt ist...
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kreutzi: Wenn ich Dich recht verstehe, hast Du noch keine Zeile Code dafür geschrieben, was erstmal gut ist. Denn die meisten der Klassen wirst Du im einfachsten Fall gar nicht brauchen. Fang am besten mit der Spiellogik an, also einer Klasse ConnectFour, mit drei Methoden: display, drop_coin und find_winner, wobei Du mit der letzten Methode erst anfangen brauchst, wenn die beiden anderen fertig und gründlich getestet sind.
Die wichtigste Frage, die Du dabei beantworten mußt: In welcher Datenstruktur würdest Du das Spielfeld speichern?

Wenn Du es soweit geschafft hast, kannst Du nämlich schon von der interaktiven Pythoneingabe aus spielen:

Code: Alles auswählen

>>> from connect_four import ConnectFour
>>> game = ConnectFour()
>>> game.drop_coin('X', 3)
>>> game.display()
>>> game.find_winner()
usw.

Um den nächsten Schritt, Spielablauf, GUI, Benutzereingaben, brauchst Du Dich jetzt noch gar nicht kümmern, das kommt dann alles erst, wenn das eigentliche Spiel schon spielbar ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was habt ihr denn so gelernt in Eurem Kurs? Ihr werdet ja sicherlich schon kleinere Sachen selber programmiert haben, oder? Ist Euch der Umgang mit einer Python-Shell vertraut?

Im Grunde genommen muss man imho folgende Dinge kennen:
- Funktionen
- Listen
- Schleifen über Listen
- Indexzugriff auf Listen

Will man es elegant lösen, so würde einem Tiefen- oder Breitensuche noch helfen; man kann die Tests aufs Gewinnen aber auch "manuell" und global lösen, indem man immer das gesamte Spielfeld testet und die Diagonalen fix als Index-Liste hinterlegt.

Ob man da wirklich Klassen braucht, sehe ich erst noch mal nicht... könnte sein, dass das tatsächlich einen Mehrwert darstellt, wenn es um Zugriffe und das Iterieren über die Felder geht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Kreutzi: Die angedachte Klassenaufteilung finde ich übertrieben und teilweise auch ”falsch”. Wenn ich das mit den Spielern richtig verstanden habe, ist das IMHO zum Beispiel eine falsche Aufteilung. Ein Objekt das einen Spieler repräsentiert und zum Beispiel einen Namen und ein Symbol ('X'/'O') zu einem Wert zusammenfasst könnte Sinn machen, aber eine `Players`-Klasse eher weniger. Die Information und Funktionalität die dort drin stecken würde, kann man auch in der Spiel-Klasse unterbringen. Eine Regelklasse macht auch nur Sinn wenn es verschiedene Regelsätze gibt und man mehr als eine von diesen Klassen hätte. Selbst dann sehe ich da eigentlich nur eine, beziehungsweise mehrere, Prüffunktion(en), denn es geht ja nur darum bei einem gegebenen Spielfeld zu entscheiden ob Spieler A oder B oder keiner gewonnen hat. Dafür braucht man keine Klasse.

Ähnliches gilt für das `Aussehen`. Zumindest wenn die einfache visuelle Darstellung als Text passiert, braucht man dafür auch nur eine Funktion, die gegebenfalls andere Funktionen benutzt, um aus einem gegebenen Spielzustand eine Textausgabe zu machen.

Bei einer GUI sieht das anders aus, da könnte man für das Spiel letztendlich mehrere Klassen für die Anzeige verwenden falls es bei einer zu umfangreich wird. Aber das ist eine Frage die stark vom GUI-Toolkit abhängt und mit welchen Mitteln aus dem gewählten Rahmenwerk man die Anzeige des Spiels dann letztendlich umsetzt.

Die Klasse für das Spiel an sich ”hat” auch nicht alle anderen Klassen, denn die GUI gehört da nicht rein. Die Spielklasse sollte nur die Spiellogik umsetzen, unabhängig davon wie das am Ende dem Benutzer präsentiert wird. Und die Spiellogik muss „schrittweise” benutzbar sein, also in der Spielklasse darf nicht so etwas wie eine Hauptschleife stecken welche die Programmkontrolle übernimmt.

Am Anfang sollte man die Grundlagen mal durchgearbeitet haben, also die Grunddatentypen, Kontrollstrukturen, Funktionen, Klassen, und Ausnahmebehandlung wäre nicht schlecht.

Irgendwann muss man klären was „visuelle Darstellung” konkret bedeutet, also ob das tatsächlich eine GUI sein muss. Selbst falls eine Textausgabe nicht reicht, würde ich das erst einmal damit umsetzen und dann später eine GUI dazu programmieren. Diese beiden Teile sollten sowieso sauber getrennt sein, und man eröffnet nicht zwei Fronten gleichzeitig sondern kann sich erst einmal auf die Spiellogik und eine einfache Textdarstellung konzentrieren.

Und dann geht es weiter mit dem was Sirius3 geschrieben hat.
Antworten