TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

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
Eragpm
User
Beiträge: 14
Registriert: Mittwoch 10. Juni 2020, 23:20

hi
Ich versuche gerade ein Tictactoe spiel zu schreiben und versuche gerade ein Spielfeld auszugeben und bin gerade am verzweilfen.
Hier mein Code

Code: Alles auswählen

class Board:
    def __init__(self):
        self.state = [1, 0, -1, 0, 0, 0, 0, 0, 0]

    def sign_to_printable(self, sign):
        if sign == 0:
            print(" ")
        elif sign == 1:
            print("O")
        elif sign == -1:
            print("X")

    def print_board(self):
        print(self.sign_to_printable(self.state[0]) + " | "
        + self.sign_to_printable(self.state[1])+ " | "
        + self.sign_to_printable(self.state[2]))

if __name__=="__main__":
    board1 = Board()
    board1.print_board()
es gibt einen TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' Error zurück und ich hab keine Ahnung wie ich das ändern kann.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst dich halt entscheiden, ob sign_to_printable selbst printen soll, oder ob es stattdessen das Element an der Stelle zurueckgeben soll, damit du das dann ausserhalb in print_board ausgeben kannst. Du machst gerade beides, und gibst nix zurueck - daher das None.

Wobei ich die Frage stellen wuerde: warum kodierst du die besetzten Positionen nicht direkt mit den Werten " ", "X", "O"? Dann sparst du dir zumindest fuer die Ausgabe die Kodierung, und einen echten Mehrwert der Zahlen kann ich jetzt auch nicht erkennen.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum hat board1 eine 1? Soll das Parallel-Tictactoe werden? Lass unnötige Anhängsel einfach weg. sign_to_printable hat mehrere Probleme. Der Name passt nicht zu dem was die Funktion macht und damit kommt auch der Aufrufende nicht zurecht. Da wird was geprintet und nicht was zu einem printable konvertiert. Dann ist das gar keine Methode, weil kein self benutzt wird. Warum steht in state nicht gleich "X", "O" und " "? print_board würde dann auch nur einen kleinen Teil des Boards ausgeben.
Eragpm
User
Beiträge: 14
Registriert: Mittwoch 10. Juni 2020, 23:20

wie soll das funktieren wenn ich gleich die Symbole hinmach
man soll das ja spielen können und ich hab halt gedacht das ich Player 1 dann 1 als sign gebe und Player 2 -1 als sign und das board1 is da weil ich einfach mal wähernd des schreibens das Spielbrett ausgeben wollte.
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Eragpm: Das funktioniert dann einfach ohne diese Indirektion über Zahlen. Statt eine Zahl zu einem Zeichen zu wandeln, stehen dann schon direkt die Zeichen in der Datenstruktur.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum muss es denn board1 heißen, damit du es ausgeben kannst? Mit board geht das genauso. Spieler 1 ist X und Spieler 2 O.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und wenn du dem Spieler 1 das X und dem Spieler 2 das O gibst, dann funktioniert das genauso. Nur weil du mal was gedacht hast, muss das doch nicht auf ewig so bleiben. Vor allem nicht, wenn es keinerlei sichtbaren Vorteil gibt.
Eragpm
User
Beiträge: 14
Registriert: Mittwoch 10. Juni 2020, 23:20

ah danke für die Information, da hab ich wohl zu umständlich gedacht
Antworten