15. Play it, Sam. [Passing but not getting all 4 turns]


#1



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

I'm actually passing this. But my code is only giving the player one turn, and acting as though it was the player's 4th turn, and writing "Game Over." in console, only after one guess. Why is this?


from random import randint

board = []

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

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

print "Let's play Battleship!"
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)
print ship_row
print ship_col

# Everything from here on should go in your for loop!
# Be sure to indent four spaces!
for turn in range(4):
    print "Turn", turn+1

guess_row = int(raw_input("Guess Row:"))
guess_col = int(raw_input("Guess Col:"))

if guess_row == ship_row and guess_col == ship_col:
    print "Congratulations! You sunk my battleship!"
else:
    if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4):
        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 (turn + 1) here!
if turn == 3:
    print "Game Over."
    
    print_board(board)

https://gyazo.com/7b4196cbc80fd4c168eeb94d01c2852e


#2

you might want to place all that inside the for loop, this is currently your for loop:

for turn in range(4):
    print "Turn", turn+1

i would but the guess, the whole if/elif/else statement in your for loop. Indention determines what is in (or in this case) outside the function


#3

Still puts the same error out. Only giving the player one chance before saying Game Over.

Code with changes mentioned:

from random import randint

board = []

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

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

print "Let's play Battleship!"
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)
print ship_row
print ship_col

guess_row = int(raw_input("Guess Row:"))
guess_col = int(raw_input("Guess Col:"))

# Everything from here on should go in your for loop!
# Be sure to indent four spaces!
for turn in range(4):
    print "Turn", turn+1
    if guess_row == ship_row and guess_col == ship_col:
        print "Congratulations! You sunk my battleship!"
else:
    if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4):
        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 (turn + 1) here!
if turn == 3:
    print "Game Over."
    
    print_board(board)

#4

the prompts for the user guesses should also be in the for loop, i assume you want to give the user the opportunity to enter new coordinates?


#5

Oh god. That makes sense. Tried it and it worked. Thank you so much.


#6

Why is it that when I initialize turn to zero as below it doesn't work, it keeps printing Turn 1 each turn.

for turn in range(5):
    turn = 0
    turn = turn + 1
    print 'Turn', turn


guess_row = int(raw_input("Guess Row:"))
guess_col = int(raw_input("Guess Col:"))
if guess_row == ship_row and guess_col == ship_col:
    print "Congratulations! You sunk my battleship!"
else:
    if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4):
        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_board(board)

#7

because you initialize turn inside the for loop? This means, each time the loops runs again, turn gets reset to 0. Declare turn outside the for loop


#8

Thanks a lot, I get it now.