Search code examples
pythonglobaldefined

Python: NameError: global name 'lol' is not defined


I know there are a lot of these but i've been searching for an hour and nothing is working.

          ship2X=eg.passwordbox("Player " + str(playerNumber) + " input the x co-ordinate for your SECOND ship ")
          ship2Y=eg.passwordbox("Player " + str(playerNumber) + " input the y co-ordinate for your SECOND ship ")

          return[ship2X, ship2Y]

The above code is in a function.

def haveShot(playerNumber, ship, ship2, board):

    global ship2

    eg.msgbox("Player " + str(playerNumber) + " your shot")

    hit=False

    shotX=eg.enterbox("Enter the x-coordinate for your shot: ")
    shotY=eg.enterbox("Enter the y-coordinate for your shot: ")

.... error checking here....

if int(shotX) == int(ship[0]) and int(shotY) == int(ship[1]):
        board[5 - int(shotY)][int(shotX) - 1] = "X"
        eg.msgbox("Nice shot! You hit ship 1")
        hit = True

    elif int(shotX) == int(ship2[0]) and int(shotY) == int(ship2[1]):
        board[5 - int(shotY)][int(shotX) - 1] = "X"
        eg.msgbox("Nice shot! You hit ship 2")
        hit = True


    elif board[5 - int(shotY)][int(shotX) - 1] == "o":
        eg.msgbox("You already tried that shot! D'oh!")

    else:
        board[5 - int(shotY)][int(shotX) - 1] = "o"
        eg.msgbox("Unlucky - you missed!")

Ye, I have an if before that.

Then I have this near the end:

hit = False
winner = "0"
p1 = 0
p2 = 0

while hit == False:
    hit = haveShot("1", player2Ship, player2Ship, player1Board)

    if hit:
        p1 = p1+1

    hit = haveShot("2", player1Ship, player1Ship, player2Board)

    if hit:
        p2 = p2+2

I copied it from the first enter ship thing so I'm super confused as to why that's happening...

Any ideas?

If you want to see the full code you can see it at: http://pastebin.com/TAyHtnTs

The error I have is if I do enter the correct co-ordinate for the second ship it says I missed it, however if I enter the correct co-ordinates for the first ship it says I hit it like it shoul.

Thanks for the help you can provide :)


Solution

  • Couple of things:

    Line 81

    You can't have two subsequent return statements. The first one will exit the function. If you want to return two sets of coordinates return a nested list:

    return [[x1, y1], [x2, y2]]
    

    Line 161

    Then use unpacking to get these:

    p1ship1, p1ship2 = inputCoords("1")
    p2ship1, p2ship2 = inputCoords("2")
    

    Line 171/176

    Make sure the two ships you're passing in are different (currently they're the same):

    hit = haveShot("1", player2Ship, player2Ship, player1Board)
    

    to

    hit = haveShot("1", p2ship1, p2ship2, player1Board)
    

    Line 170

    The while hit == False condition means that the game will exit as soon as player 1's ship is hit. Use another variable to check if the game is over, such as:

    while player1ShipCount > 0 and player2ShipCount > 0:
        #play game
    

    And keep track of each players' available ships.