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
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 ...
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
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.
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:
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: