CodingRookie
CodingRookie

Reputation: 13

Infinite loop in python treasure hunt game

So I've been creating this simple treasure hunt game where you look for three treasures in a board. But after 6 guesses, it gets me stuck in a loop! The X's represent areas you've searched and the $ signs are treasures you've found. Please help!!!!

import random

def hide_treasure(board):
   treasures=0
   while treasures<=3:
      random_row=random.randrange(0,5)
      random_col=random.randrange(0,5)
      if(0<=random_row<5) and(0<=random_col<5) and (board[random_row]       [random_col]==" "):
         board[random_row][random_col]="T"
         treasures+=1

def display_board(board,show_treasure=False):
    for col in range(5):
      print "  %d " %col,
   print   
   for row in range(5):
      print " %d:" %(row)," | ".join(board[row]).replace("T"," ")
      print "   ---+---+---+---+---"
   if show_treasure==True:
      " ".replace(" ","T")




def make_user_move(board):
   valid_move=False
   while not valid_move:
      try:
         ask_row=input("What row would you like to search (0-4): ")
         ask_col=input("What col would you like to search (0-4): ")
         if board[ask_row][ask_col]=="T":           
            board[ask_row][ask_col]="$"
            print
            print"YES! You found a treasure."
            return True
         elif board[ask_row][ask_col]=="$" or board[ask_row][ask_col]=="X":
            print
            print"You already tried there, please pick again."
         else:
            board[ask_row][ask_col]="X"
            print
            print"Nothing there."
            break

      except ValueError:
         print"Integers only for row and column values. Please try again!"
         continue
      except IndexError:
         print
         print"Sorry invalid location. Please try again!"


def main():
   board=[[" "," "," "," "," "],[" "," "," "," "," "],[" ", " "," "," ","    ",],[" "," "," "," "," "],[" "," "," "," "," "]]
   print"WELCOME TO TREASURE HUNT!"
   guess=10
   treasures=0
   while guess!=0 and treasures!=3:
      print
      print"You have",guess,"guesses left and have found",treasures,"/3  treasures"
      hide_treasure(board)
      display_board(board)
      guess-=1
      if make_user_move(board):
         treasures+=1

   if guess==0 and treasures!=3:
      display_board(show_treasure=True)
      print"OH NO! You only found %d"%treasures,"/3 treasures."
      print
      print"*** GAME OVER ***"
   elif treasures==3:
      display_board(board)
      print"CONGRATULATIONS! You found ALL of the hidden treasure."
      print
      print"*** GAME OVER ***"


main()

Upvotes: 1

Views: 5330

Answers (1)

Blckknght
Blckknght

Reputation: 104722

The issue you're having is that you run out of room to hide treasures in. Your current code doesn't just hide three treasures, it hides three treasures at the start, then three more after each guess. After six guesses, there are no spaces left that haven't either been guessed already, or have a treasure hidden in them.

You probably want to move the call to hide_treasure out of the while loop in main. Just call it once at the start, and you'll be good:

def main():
   board=[[" "," "," "," "," "],[" "," "," "," "," "],[" ", " "," "," ","    ",],[" "," "," "," "," "],[" "," "," "," "," "]]
   print"WELCOME TO TREASURE HUNT!"
   guess=10
   treasures=0
   hide_treasure(board)  ### call this here, instead of in the loop below
   while guess!=0 and treasures!=3:
      print
      print"You have",guess,"guesses left and have found",treasures,"/3  treasures"
      # hide_treasure(board)  ### remove this!
      display_board(board)
      guess-=1
      if make_user_move(board):
         treasures+=1

   #....

Upvotes: 1

Related Questions