I\'m trying to improve a game of battleships. The original version works fine with no errors. I have written code to help overcome the fact that the first version places the shi
If you've arrived here because you were looking for the root cause of "TypeError: sequence item 0: expected string, NoneType found
", it can come from doing something along these lines...
','.join([None])
The problem is most likely somewhere within these 4 lines:
for x in range(6):
print letters[x]," ".join(map(DisplayChar,Player[x]))," "*18,"| "," ".join(map(DisplayChar,Opponent[x]))
for x in range(6,12):
print letters[x]," ".join(map(DisplayChar,Player[x]))," | "," ".join(map(DisplayChar,Opponent[x]))
Within these lines, you've used a join
statement multiple times. The join
statement requires a list of strings in order to work. However, when you're mapping DisplayChar
to Player[x]
, the DisplayChar
function is returning the value None
instead of a string of some sort.
If you look at the DisplayChar
function, it handles values only from 0 to 4. The lists you use probably include additional numbers or characters. If x
happened to be something like 5
, DisplayChar
will terminate and simply return the value None
. Remember, functions return the value None
by default.
You either need to handle these additional numbers within DisplayChar
, or modify DisplayChar
to contain an else
statement to return an empty string, like so:
def DisplayChar(x):
if x==0:
return '?'
elif x==1:
return ' '
elif x==2:
return 'X'
elif x==3:
return ' '
elif x==4:
return '*'
else:
return ' '
Edit:
Ok, I think I might know what's going on, given the new edits.
Notice when you were printing out Player[x]
, it printed <function Deploy_Destroyer_1 at 0x1c2634>
the second time around?
That means somewhere, buried deep inside your code, you've done something to the effect of Player[row] = Deploy_Destroyer_1
(notice the missing parenthesis!). Instead of calling the function, you've assigned the function.
Hunting for, and adding the missing parenthesis should most likely solve the problem.
Edit 2:
I think your problem is with this line: Player = DeployFleet(Player), Deploy_Destroyer_1(Player)
If you try doing a print Player
immediately after, I think you'll most likely see a large list of numbers, followed by None
.
This is because the DeployFleet
function is returning the table (I think?) whereas the Deploy_Destroyer_1
function returns nothing. Instead, it just mutates the Player
table.
To fix this, try doing either this:
Player = DeployFleet(Player)
Deploy_Destroyer_1(Player)
...or modify Deployer_Destroyer_1
so that it returns Player
when it's finished, so you can do this:
Player = DeployFleet(Player)
Deploy_Destroyer_1(Player)
Your DisplayChar function does not have a default value. This would do no harm if you'd be handling all possible cases for x
, but apparently you're not. Try
def DisplayChar(x):
if x == 0:
return '?'
elif x == 2:
return 'X'
elif x == 4:
return '*'
else:
return ' '
but this will probably yield blank strings where you don't expect them.
Generally, I'd recommend going through a good Python tutorial first. All of your above code can be greatly simplified.