First off, while numberRangeLow < numberRangeHigh+1: do stuff
is basically the same as range
.
For the same result, you can use numbers = range(numberRangeLow, numberRangeHigh + 1)
, which will build the list for you.
You also don't need to warn about it being case sensitive, if you use str.lower()
it'll automatically put it into lower case. For example, you could do if answer.lower() == "higher"
.
To remove numbers, you can do list slicing. For example, if you have a = [1, 2, 3, 4]
, and it's lower than 3, you can get the index of 3 by using a.index(3)
, which in this case, will give 2.
By then cutting off anything higher than this index with a[2:]
, you have removed any higher numbers than 3.
Here's a quick update to your code doing the bits I mentioned.
trys=int(input("How many trys will you let me have? "))
numberRangeLow=int(input("What is the lowest number I can guess?: "))
numberRangeHigh=int(input("And the highest?: "))
print("\nSo I have",str(trys),"trys")
print("And the number is between",str(numberRangeLow),"and",str(numberRangeHigh)
#New bits:
numbers = range(numberRangeLow, numberRangeHigh + 1)
for i in range(trys):
guess = random.choice(numbers)
print("Is your number", str(guess), "?")
answer = input("Enter 'higher', 'lower' or 'correct'").lower()
if answer == 'correct':
break
elif answer == 'higher':
list_index = numbers.index(guess)
numbers = numbers[list_index + 1:]
elif answer == 'lower':
list_index = numbers.index(guess)
numbers = numbers[:list_index]
I rearranged the last part of the code so you didn't have 2 copies of the random choice. Also for the record, it's seen as better practice to name_variables_like_this
and notLikeThis
.
Edit: Kevins way is slightly different from mine, a simple comparison would be assuming you have written the numbers down on paper, this way would rip the paper in half and discard one part, whereas Kevins way would be writing it out again on a fresh sheet of paper, so you get more control, but it's a bit slower.
Edit 2:
Since I'm bored, I wrote it how I'd do it with a function (with some comments). Bear in mind it's python 2 not python 3 I'm using so copy + paste won't work for you.
def number_guess(tries, low, high):
#Error if low is more than or the same as high
if low >= high:
raise ValueError('invalid range')
#Build number list
num_list = range(low, high + 1)
print 'I have got {} tries'.format(tries)
print 'And the number is between {} and {}'.format(low, high)
for i in range(tries):
guess = random.choice(num_list)
print 'Is {} your number?'.format(guess)
answer = input('Enter higher, lower or correct').lower()
#Empty answer
if not answer:
continue
#Correct answer
if answer[0] in ('c', 'y'):
print 'I guessed in {} tries'.format(i)
return True
#Number is higher
if answer[0] == 'h':
list_index = num_list.index(guess)
num_list = num_list[list_index + 1:]
#Number is lower
elif answer[0] == 'l':
list_index = num_list.index(guess)
num_list = num_list[:list_index]
#If it hits this point there are no tries left
print 'I failed to guess'
return False
tries = int(input('How many tries will you let me have?' ))
low = int(input('What is the lowest number I can guess?' ))
high = int(input('And what is the highest?' ))
success = number_guess(tries, low, high)