11. Danger, Will Robinson! - Wrong X marked


#1



https://www.codecademy.com/courses/python-beginner-en-4XuFm/1/4?curriculum_id=4f89dab3d788890003000096

Hey guys,
I am new to codecademy and am struggling with the battleship exersice. After inputing my guess, the code checks back with the randomly generated position of the battleship. That check works fine and gives me the correct message (success or not) afterwards. However, the "updated" playing field, where the actual position is marked with an X is somehow not working. It does mark a position, but that position is in no way related to the actual position of the battleship. Yet, codecademy tells me that my code is correct. Please find my complete code below.

Also, I don't quite understand how the board[guess_row][guess_col]="X" part works. As far as I understand it, the playing field is saved as a list that consists of five lists, which each include 5 values. So in my understanding I would need to use the guess_row to find the correct list and then use guess_col within that list to find the correct column. Where am I going wrong here?

I would very much appreciate your help :slight_smile:


from random import randint

board = []

for x in range(0, 5):
    board.append(["O"] * 5)

def print_board(board):
    for row in board:
        print " ".join(row)

print_board(board)

def random_row(board):
    return randint(0, len(board) - 1)

def random_col(board):
    return randint(0, len(board[0]) - 1)

ship_row = random_row(board)
ship_col = random_col(board)
guess_row = int(raw_input("Guess Row:"))
guess_col = int(raw_input("Guess Col:"))

print ship_row
print ship_col

# Write your code below!
if guess_row == ship_row and guess_col == ship_col:
    print "Congratulations! You sank my battleship!"
else:
    if guess_row not in range(5) or guess_col not in range(5):
        print "Oops, that's not even in the ocean."
    elif board[guess_row][guess_col] == "X":
        print "You guessed that one already."
    else:   
        print "You missed my battleship!"
        board[guess_row][guess_col]="X"
        print print_board(board)

this would just be one example of how the X is in very weird places :wink:


#2

An I actually just noticed my own...let's call it stupidity. The X obviously marks my guess and not the actuall position of the battleship. I now updated the positions with a -1 to account for the index that starts at 0.

Still, what I do not understand is the whole board[guess_row][guess_col]=X part. Why don't I have to go through the lists with something like board[guess_row[guess_col]]?


#3

hello the whole board[guess_row][guess_col]=X part its giving to the program an pair of coordinates one from [guess_row] and one for [guess_col]


#4

That's how it seems, but isn't the playing field stored like this:

board = [ [O,O,O,O,O], [O,O,O,O,O], [O,O,O,O,O], [O,O,O,O,O], [O,O,O,O,O] ] ?

Then I wouldn't really understand how it finds the correct combination. Or does python just read that as:
1. go to list number guess_row and
2. in that list refer to item number guess_col

Thanks for your help