12. Bad Aim


#1

Hey, there. My code works fine except when I try to actually guess numbers greater than 4. Could anyone explain why? This is the error message I receive:

Traceback (most recent call last):
  File "python", line 31, in <module>
IndexError: list index out of range

and this is the code I used:

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

if guess_row == ship_row and guess_col == ship_col:
    print "Congratulations! You sank my battleship!"
else:
    board[guess_row][guess_col] = "X"
    print_board(board)
    if guess_row not in range(5) or \
       guess_col not in range(5):
        print "Oops, that's not even in the ocean."
    else:
        print "You missed my battleship!"

#2

@girafferic: The problem is that you're trying to insert the value "X" in a position that can't be reached.
If you enter the values 10 and 12, it will check if the condition on if is true, turns out it isn't.
So it will move to the else statement and there, the first line the program will find is:

board[guess_row][guess_col] = "X"

You should first check if that's on the ocean or not to later try to make an assignment on that position.


#3

hey please help me out in this code..
i have done everything perfecly & it runs too but i gotta error here it is Oops, try again. Make sure you print "Oops, that's not even in the ocean." if the user guesses a row or column that is off the board (it is the error which they are showing)
here is my code..
please help me out
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."
else:
print "You missed my battleship!"
board[guess_row][guess_col] = "X"
print_board(board)


#4

@methodslayer01568: Make sure the message you'll print is exactly the same as it is on the instructions given to you in that lesson.

Edit: the hint is that you're using more spaces than the message in the instructions!


#5

thanks soo silly of me..
it is solved


#6

@methodslayer01568: No problem! Glad to help!


#7

thanks a lot! that was the part of a code I'd never expect to be wrong)