Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialJohn Saari
Courses Plus Student 10,949 PointsMy number game reversal
I created a version where the USER picks the range (min/max), number of attempts and secret number. The COMPUTER then attempts to pick the number. I borrowed several steps from the letter game, but am having trouble resetting the rules if the USER wants to play again. Thanks!
import random
import os
import sys
rules = []
def clear():
if os.name == 'nt':
os.system('cls')
else:
os.system('clear')
def set_rules():
min_num = int(input("What is the beginning of the range: \n>"))
max_num = int(input("what is the end of the range: \n>"))
attempt_num = int(input("How many attempts does the computer get? \n>"))
rules.append(min_num)
rules.append(max_num)
rules.append(attempt_num)
def draw(guesses):
clear()
print("The computer it going to try and guess an number between {} and {}:".format(rules[0], rules[1]))
print('Strikes: {}/{}'.format(len(guesses),rules[2]))
print('')
for num in guesses:
print(num, end=' ')
print('\n\n')
def play(done):
clear()
secret_num = int(input("Pick a number between {} and {} to see if the computer can guess it in {} tries: \n>".format(rules[0], rules[1], rules[2])))
guesses = []
while True:
draw(guesses)
guess = get_guess(guesses)
if guess == secret_num:
found = True
if found:
print("The computer got it!")
print("The secret number you entered was {}".format(secret_num))
done = True
else:
guesses.append(guess)
if len(guesses) == rules[2]:
draw(guesses)
print("The computer didn't guess it!")
print("The secret number you entered was {}".format(secret_num))
done = True
if done:
play_again = input("Play again? Y/n ").lower()
if play_again != 'n':
return play(done=False)
else:
sys.exit()
def get_guess(guesses):
while True:
guess = random.randint(rules[0],rules[1])
if guess in guesses:
continue
else:
return guess
def welcome():
print('Welcome to Number Guess!')
start = input("Press enter/return to start or Q to quit ").lower()
if start == 'q':
print("Bye!")
sys.exit()
else:
return True
done = False
while True:
clear()
welcome()
set_rules()
play(done)
1 Answer
Steven Parker
229,644 PointsDid you just forget to clear the rules and then call "set_rules"?
if done:
play_again = input("Play again? Y/n ").lower()
if play_again != 'n':
del rules[:] # clear the old rules
set_rules() # then set them again
return play(done=False)
Another option would be to have "play" call "set_rules" itself, and have "set_rules" start by clearing the list.
John Saari
Courses Plus Student 10,949 PointsJohn Saari
Courses Plus Student 10,949 PointsI tried the change above and got an UnboundLocalError (referenced before assignment. I also tried several different scenarios to clear the rules list and call set_rules as part of play, but would also get a NameError where the variable rules or secret_num isn't defined for the play(done)
Steven Parker
229,644 PointsSteven Parker
229,644 PointsOops, I didn't test it and accidentally created a new variable with a different scope. I revised my answer so the code does what I originally intended.
John Saari
Courses Plus Student 10,949 PointsJohn Saari
Courses Plus Student 10,949 PointsThat was it! I'll have to learn a little more about scoping to figure this one out!