TypeError: Sequenzelement 0: erwartete Zeichenfolge, NoneType gefunden

9

Ich versuche, ein Schlachtschiffspiel zu verbessern. Die ursprüngliche Version funktioniert ohne Fehler. Ich habe Code geschrieben, um zu helfen, die Tatsache zu überwinden, dass die erste Version die Schiffe jedes Mal an den gleichen Ort stellt, also habe ich mit einem Schiff begonnen (aus zwei Quadraten). Ich habe dies getan, indem ich zwei Funktionen erstellt habe: Die erste erzeugt eine zufällige Koordinate ...

%Vor%

und die zweiten Versuche koordinieren gegen die Bedingungen (wenn es auf die Tafel passt und welche Drehung es platziert werden kann).

%Vor%

Nach dem Anwenden meines Codes bekomme ich diesen Fehler.

%Vor%

und hier ist die PrintBoards-Funktion

%Vor%

und hier ist die DisplayChar-Funktion

%Vor%

Ich habe versucht, die obige Funktion zu bearbeiten ...

%Vor%

Allerdings gab es mir stattdessen diesen Fehler

%Vor%

Ich habe auch versucht, die Listen Player und Opponent nach der PrintBoards-Funktion auszudrucken, um sicherzustellen, dass sie 0s und 1s (bezogen auf die DisplayChar-Funktion) enthalten (wenn sie in das Original eingefügt werden, nicht wenn ich mein neues und sehr langes einfüge) Code ein)

Das nächste Bit ist eine Antwort auf Michael

%Vor%

BEARBEITEN

Nachdem jemand freundlicherweise darauf hingewiesen hatte, dass ich die Funktion zugewiesen hatte, anstatt sie aufzurufen, habe ich festgestellt, dass ein weiterer Fehler aufgetreten ist (ich glaube nicht, dass Python mich mag)

%Vor%

Unten habe ich auch aufgeführt, wo ich die Funktion anrief, falls ich etwas albernes gemacht habe

%Vor%

BEARBEITEN 2

Ich habe es zu dem geändert, was Michael0x2a sagte, und es lief ohne Fehler, aber das Schiff, das den Code platzierte, verschwand: s

Soweit ich weiß, druckt die Funktion PrintBoards die Karte für Player , indem sie die Elemente in der Liste der Funktion DisplayChar zuordnet (wenn 2 ein Element in der Liste ist, wird X gedruckt usw.). Mein Novizenwissen sagt mir, dass die Funktion Deploy_Destroyer_1 in Player = in der Funktion Main (oben enthalten) aufgerufen werden sollte, um sicherzustellen, dass das Element in der Liste geändert wird. Daher sollte sich das gedruckte Zeichen ändern.

Ich vermute, dass etwas mit meinem neuen Code falsch ist ( Deploy_Destroyer_1 ), der das nicht richtig macht (entweder ändert sich das Element in der Liste nicht, druckt also nicht das richtige Zeichen oder so etwas) sonst was ich nicht denken kann).

Allerdings besteht auch eine große Chance, dass ich mich selbst verwirrt habe:)

Ich habe Python erst seit ein paar Wochen gelernt. Wenn jemand mehr Details braucht, um mir zu helfen, fragt bitte

    
BLeeM 17.09.2013, 14:15
quelle

3 Antworten

53

Wenn Sie hier angekommen sind, weil Sie nach der Grundursache von " TypeError: sequence item 0: expected string, NoneType found " gesucht haben, kann es etwas an diesen Zeilen liegen ...

%Vor%     
Noel Evans 28.11.2013 16:53
quelle
1

Ihre DisplayChar-Funktion hat keinen Standardwert. Dies würde nicht schaden, wenn Sie alle möglichen Fälle für x behandeln würden, aber anscheinend sind Sie es nicht. Probieren Sie

aus %Vor%

aber das wird wahrscheinlich leere Zeichenfolgen ergeben, wo Sie sie nicht erwarten.

Im Allgemeinen würde ich empfehlen, zuerst ein gutes Python-Tutorial durchzugehen. Der gesamte oben genannte Code kann stark vereinfacht werden.

    
Johannes Charra 17.09.2013 14:48
quelle
0

Das Problem liegt höchstwahrscheinlich irgendwo in diesen 4 Zeilen:

%Vor%

Innerhalb dieser Zeilen haben Sie mehrmals eine join -Anweisung verwendet. Die join -Anweisung benötigt eine Liste von Strings, um zu funktionieren. Wenn Sie jedoch DisplayChar auf Player[x] abbilden, gibt die Funktion DisplayChar den Wert None anstelle einer Zeichenfolge zurück.

Wenn Sie sich die Funktion DisplayChar ansehen, behandelt sie nur Werte von 0 bis 4. Die von Ihnen verwendeten Listen enthalten wahrscheinlich zusätzliche Zahlen oder Zeichen. Wenn x etwas wie 5 ist, wird DisplayChar beendet und gibt einfach den Wert None zurück. Denken Sie daran, dass Funktionen standardmäßig den Wert None zurückgeben.

Sie müssen entweder diese zusätzlichen Zahlen innerhalb von DisplayChar behandeln oder DisplayChar so ändern, dass sie eine else -Anweisung enthalten, um eine leere Zeichenfolge zurückzugeben, etwa so:

%Vor%

Bearbeiten:

Ok, ich denke, ich könnte wissen, was passiert ist, angesichts der neuen Änderungen.

Beachten Sie, wenn Sie Player[x] druckten, druckte <function Deploy_Destroyer_1 at 0x1c2634> das zweite Mal?

Das bedeutet irgendwo, tief in deinem Code vergraben, du hast etwas mit Player[row] = Deploy_Destroyer_1 gemacht (beachte die fehlende Klammer!). Anstatt die Funktion aufzurufen, haben Sie die Funktion zugewiesen.

Das Suchen nach und Hinzufügen der fehlenden Klammer sollte das Problem wahrscheinlich lösen.

Bearbeiten 2:

Ich denke, dein Problem ist mit dieser Zeile: Player = DeployFleet(Player), Deploy_Destroyer_1(Player)

Wenn Sie versuchen, sofort eine print Player zu machen, werden Sie wahrscheinlich eine große Liste von Zahlen sehen, gefolgt von None .

Das liegt daran, dass die Funktion DeployFleet die Tabelle zurückgibt (denke ich?), während die Funktion Deploy_Destroyer_1 nichts zurückgibt. Stattdessen mutiert es nur die Tabelle Player .

Um dies zu beheben, versuchen Sie Folgendes:

%Vor%

... oder ändern Sie Deployer_Destroyer_1 so, dass es Player zurückgibt, wenn es fertig ist, damit Sie dies tun können:

%Vor%     
Michael0x2a 17.09.2013 14:46
quelle

Tags und Links