FAQ: Learn Python - Battleship - Test Run

This community-built FAQ covers the “Test Run” exercise in Codecademy’s lessons on Python.

FAQs for the Codecademy Python exercise Test Run:

Join the Discussion. We Want to Hear From You!

Have a new question or can answer someone else’s? Reply (reply) to an existing thread!

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources about Python in general? Go here!

Want to take the conversation in a totally different direction? Join our wider discussions.

Learn more about how to use this guide.

Found a bug? Report it!

Have a question about your account, billing, Pro, or Pro Intensive? Reach out to our support team!

None of the above? Find out where to ask other questions here!

Other FAQs

The following are links to additional questions that our community has asked about this exercise:

  • This list will contain other frequently asked questions that aren’t quite as popular as the ones above.
  • Currently there have not been enough questions asked and answered about this exercise to populate this FAQ section.
  • This FAQ is built and maintained by you, the Codecademy community – help yourself and other learners like you by contributing!

Not seeing your question? It may still have been asked before – try (search) in the top-right of this page. Still can’t find it? Ask it below by hitting the reply button below this post (reply).

I´m trying to run this code and it only allows me to guess one time, imagine I press 1 in guess_row I would be guessing the place 1x1 but not anything else. What did I do wrong??

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)
print ship_row
print ship_col
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 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_board(board)
1 Like

nothing seems wrong, adding a loop to allow multiple guesses is the next exercise, so should just continue with the course

1 Like

I’m having a similar issue (exact same code as miguelinera), which persists even into the next step where we code in the turn limit, and isn’t resolved by the end of the lesson. The issue is that the console won’t take two raw inputs. Once you input your row selection after being prompted "Guess Row: " and press enter, the console prints the text "Guess Col: " with no option for input, followed by execution of the subsequent code. If you print the guess_row and guess_col variables, they both have the value that was passed into the "Guess Row: " raw input. It seems like the console is passing a single raw input into both variables.

what if you run your code on repl.it? Does it work there?

If not, please share your code

I tried reloading the lesson and the code now works as intended; it also works in repl.it. Not sure what the issue was. Anyway, thanks for the help!

Its a small bug, and on occasion it comes back to hunt codecademy.

Hey, I wonder if it’s possible to make the input ‘1’ count as the first row/column and what should be changed in the code?

given lists are a fundamental part of the python programming language, i wouldn’t fiddle with lists or index concept. Instead, manipulate the user input

1 Like

I know this is probably not needed, but how would I check to see if the raw_input is an integer?

1 Like

given the program otherwise crashes, its certainly useful. There are multiple ways to achieve this. python has a method for it, you could also handle the exception. Google is your friend.

1 Like

So, could anyone tell me how to respond to special characters? When I run the code and enter characters such as apostrophes and backslashes it returns syntax errors. I understand why, but does anyone have a suggestion to fix this.

Here is my code:

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)
print ship_row
print ship_col
guess_row = int(raw_input("Guess Row: "))
guess_col = int(raw_input("Guess 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_board(board)

the problem is that the int() function will throw an exception for anything that can’t be converted to integer, so you have two options:

verifying that the string consists of digits (python has a method for this)
or handling the exception

Hey I’m having a problem with my code. It is the corrected code from the last lesson so should work, but whenever I try to run it it will run Guess Row but not Guess Col. the error message is

Traceback (most recent call last):
** File “python”, line 24, in **
ExecTimeoutException: Program took too long to terminate.

I’ve tried running the code on repl.it, but something similar happens. there’s no error message, but Guess Col: won’t appear on the screen. This is my code if anyone can help I’d really appreciate it.

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))

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

ship_row = random_row(board)
ship_col = random_col(board)
print ship_row
print ship_col
guess_row = int(raw_input("Guess Row:4") -1)
guess_col = int(raw_input("Guess Col:2") - 1)
# 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_board(board)

The problem seems to be the raw inputs on line 24 and 25

I get a very different error:

raw_input() allows you to get input from the user at run-time.

here:

raw_input("Guess Row:4")

the string informs the user what they have to enter. So why you put 4 as part of the string, is a mystery to me.

then you try subtract one, but that before you converted the result to integer, so you get a TypeError

I was running different guesses through it, when I leave it blank I have the same problem. It doesn’t seem to register my second raw input, if I leave the inputs blank or not.

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))

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

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: "))

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_board(board)

This doesn’t return an error, but instead this:

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
2
5
Guess Row:

but doesn’t ever print Guess Col:

raw_input() will pause your program until you provided input and press enter (during run time)

I’m not sure what’s going on, but I’m throwing an error even when I try and run the “get solution” code. It’s happened at every step for this lesson. I write the code, run it, throw the error, then click ‘get solution’, check the code against my previously written stuff, verify that i got it correct, try and run the ‘fixed’ version, throw the same timeout error, and then move on to the next section. It’s the only way I’ve been able to move through the lesson. It seems some replies mention that this is a persistent bug, not a problem with the student code, is that correct?
I don’t want to waste my time trying to debug code that is never going to run properly, but I want to make sure I’m correctly learning the material before I skip it and move on…

Without being able to check your code it’s hard to say for certain. raw_input seems prone to errors in the browser and sometimes it is necessary to refresh the page or clear your browser cache to get code to run after raw_input has been used.

When posting code to the forum please format it so it can be read easily- you can use a triple backquote/accent grave to do so, e.g.
` ` `
x = 3
` ` `
Should appear as the following with the correct indents-

x = 3

The most impotant step of any lesson is underatanding the code so if you are 100% clear on every statement and how they tie together in the solution you could consider moving on.