Tic Tac Toe

Code-Stücke können hier veröffentlicht werden.
Antworten
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Ja, wieder ein Tic Tac Toe Spiel :D. Hier der Code: https://github.com/toxinman/stuff/blob/ ... ctactoe.py
Ich hoffe, ihr habt viele Verbesserungsvorschläge. Ich weiß z.B. nicht, wie ich eine gegnerische KI baue.
BlackJack

@Xfd7887a: Anmerkungen zu: https://github.com/toxinman/stuff/blob/ ... ctactoe.py

Das Spielfeld kann man mit einer „list comprehension” erstellen.

Wenn eine Testfunktion im Erfolgsfall `True` zurück gibt, dann sollte sie im anderen Fall auch `False` zurück geben und nicht implizit `None`. Ausserdem sollten Testfunktionen keine Ausgaben tätigen. Da vermischt Du Programmlogik mit Benutzerinteraktion.

In `auswahl` hast Du ein Wörterbuch das als Schlüssel fortlaufende Zahlen enthält, also eigentlich eine umständlich ausgedrückte Liste. Das Auslesen eines Eintrags ist auch etwas umständlich. Du fragst zweimal hintereinander den selben Wert ab um dann jeweils einen anderen Index aus dem Tupel anzusprechen, statt nur *einmal* das Tupel abzufragen und dann auf die beiden Namen zu verteilen:

Code: Alles auswählen

    y, x = auswahl[wahl][0], auswahl[wahl][1]

    =>

    y, x = auswahl[wahl]
Der darauffolgende Test ``if wahl in auswahl.keys()`` ist a) umständlich weil erst eine Liste mit allen Schlüsseln erstellt wird und dann in dieser Liste linear nach `wahl` gesucht wird statt den viel effizienteren Test direkt auf dem Wörterbuch zu machen. Der Test ist aber auch überflüssig weil der an der Stelle *immer* `True` ergibt. Würde er das nicht, dann hätte es davor doch schon einen `KeyError` gegeben.

Auch in der Funktion wird wieder Programmlogik und Benutzerinteraktion vermischt.

Die Funktion sollte `feld` nicht zurückgeben. Diesen Wert hat der Aufrufer bereits, also muss man ihm den nicht noch mal zurück geben. Das macht keinen Sinn. Und es weckt beim Leser die Erwartung das hier ein *neuer* Wert zurückgegeben wird und das übergebene `feld` nicht verändert wurde.

Bei ``int(randint(1, 9))`` ist der `int()`-Aufruf überflüssig.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Danke für deine Kritik. Werde daran arbeiten :)
BlackJack

Bezüglich einer KI kannst Du Dir den englischen Wikipedia-Eintrag zum Spiel mal anschauen.

Ansonsten ist das Spiel ja so simpel das man auch einfach am Start alle Spielverläufe einmal durchgehen und in einer Baumstruktur speichern kann um die dann jeweils zu befragen ob ein Spielzug von einem gegebenen Knoten, also Spielfeldzustand, zu einem Sieg oder mindestens einem Unentschieden führen kann, beziehungsweise kann man einen solchen unter den möglichen Zügen auswählen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Ansonsten ist das Spiel ja so simpel das man auch einfach am Start alle Spielverläufe einmal durchgehen und in einer Baumstruktur speichern kann [...]
Grafisch gibt es das bei xkcd (wo auch sonst?).
Antworten