Ein paar fragen

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
CodeMaster
User
Beiträge: 22
Registriert: Mittwoch 15. September 2010, 21:37

Guten tag, ich haätte dal mal ein paar fragen und zwar
will ich mich mit python auseinandersetzen und jetzt versuchen ein kleines Minispiel zu machen, das nicht all zu schwer sein sollte.
Und zwar möchte ich ein Tic Tac Toe machen.
1. Wie kann man das am besten darstellen? Weil der gedanke es mit strings zu machen, wäre sehr kompliziert, meines wissens jedenfals

da das bisher meine entscheidenste frage ist, stelle ich die anderen fragen erst danach :)

MfG
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Starte mit dem Tutorial. Das gibt es auch auf deutsch. Überlege dir dann, wie Tic Tac Toe funktioniert. Schreib es dir auf oder sag es dir laut vor. Das hat erst mal gar nichts mit Python zu tun. Implementiere zunächst die Spiellogik. Erst danach würde ich mir über die Darstellung Gedanken machen. 9 Felder können jeweils X, O oder nix enthalten. Eine Liste ist eine prima Repräsentation für das Spielfeld. Wie kann man hier Werte lesen und setzen? Überlege dann, wie man prüfen kann, ob ein Spieler gewonnen hat. 8 verschiedene Kombinationen sind zu prüfen. Dann brauchst du nur noch eine Schleife, in der du pro Spieler nach einem Feld fragst, wo er ein X oder O setzen will und wo du prüfst, ob der Spieler gewonnen hat.

Anbei eine quick'n'dirty Umsetzung, von der ich nicht erwarten würde, dass sie einem Anfänger verständlich ist, da ich absichtlich ein paar der eher fortgeschrittenen Features eingebaut habe, nur so als Ansporn :)

Code: Alles auswählen

class TicTacToe:
    def __init__(self):
        self.fields = [0] * 9
    
    def __getitem__(self, index):
        return self.fields[index[0] + index[1] * 3]
    
    def __setitem__(self, index, value):
        self.fields[index[0] + index[1] * 3] = value
    
    def __str__(self):
        return "\n  1 2 3\n1 %s|%s|%s\n  -+-+-\n2 %s|%s|%s\n  -+-+-\n3 %s|%s|%s\n" % \
            tuple(" XO"[i] for i in self.fields)
    
    def has_won(self, p):
        return any(all(self.fields[i] == p for i in indexes) for indexes in 
            ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)))

def ask(prompt):
    while True:
        try: n = int(input(prompt)) - 1
        except ValueError: continue
        if 0 <= n < 3: return n

t = TicTacToe()
p = 1
for _ in range(9):
    print(t)
    print("Your turn, player", p)
    t[ask("x?"), ask("y?")] = p
    if t.has_won(p):
        print("You have won!")
        break
    p = 3 - p
else:
    print("Draw!")
Stefan
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

CodeMaster hat geschrieben:Guten tag, ich haätte dal mal ein paar fragen und zwar
will ich mich mit python auseinandersetzen und jetzt versuchen ein kleines Minispiel zu machen, das nicht all zu schwer sein sollte.
Und zwar möchte ich ein Tic Tac Toe machen.
Prinzipiell eine sehr gute Idee!
CodeMaster hat geschrieben: 1. Wie kann man das am besten darstellen? Weil der gedanke es mit strings zu machen, wäre sehr kompliziert, meines wissens jedenfals
"Strings" sind eine Datenstruktur und haben zunächst einmal nichts mit der Darstellung zu tun! Du musst Dir zuerst einmal eine gute Datenstruktur einfallen lassen, in der Du Dir die 9 Felder merkst zusammen mit deren Zustand (frei, belegt von Spieler 1 oder 2).

Das ganze kannst Du dann entsprechend darstellen; zu Beginn am besten in Textform in einer Shell - später kannst Du dann ggf. noch eine "echte" GUI drum herum bauen. War das Deine eigentliche Frage?

Als erstes solltest Du jedoch ein Tutorial durcharbeiten, um die Grundlagen zu lernen. Dazu empfiehlt es sich, dass offizielle zu nehmen (direkt in der Doku) oder zusätzlich noch andere Einsteigerlehrfäden, wie etwa "A Byte of Python" oder "Dive into Python". Mehr dazu findest Du auch im wiki: http://wiki.python-forum.de/FAQ#WieFang ... nsteigerAn

Edit: Mist, sma war schneller ;-)

@sma: Interessant ist auch der Ansatz, die Felder mit "1" und "4" zu belegen. Damit kann man mittels sum() auf eine erfolgreiche Reihe testen - Deine Lösung sieht aber auch gut aus :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Falls jemand gerade nicht weiß, was er mit seiner Zeit anfangen soll:
https://www.spoj.pl/problems/TOE1
https://www.spoj.pl/problems/TOE2
Antworten