-3

I am trying to write a Cows and Bulls game on my own. Since yesterday I am getting an IndexError: list index out of range error and I can't figure out what is wrong. I know there are better solutions, but can anyone review my code?

import random

#randomly generate 4 digitnumber
#asked the user to guess the number
#every digit gussed in the correct place they gave a "cow"
#every digit guessed correctly you get the "bull"
#one the user guessed the correct number game is over
#7 trials

def play_bull_and_cow(random_number, guess_number):
  users_number = [int(x) for x in str(guess_number)]
  trials = 7
  while trials > 0:
    if random_number == users_number:
      trials -=1
      return "you won, congratulations"
      break
    else:
      bull = 0
      cow = 0
      for i in range(len(random_number)):
        if users_number[i] == random_number[i]:       
          bull += 1
          random_number.pop(i)
          users_number.pop(i)
          random_number = random_number
          users_number = users_number
          trials -= 1
          continue
        elif users_number[i] in random_number:
          cow +=1
          trials -=1
          continue
        else:
          return "you have not guessed anything try again"
          
random_number = random.sample(range(1, 10), 4)
print(random_number)
guess_number = int(input("enter the 4 digit number: "))
print(play_bull_and_cow(random_number, guess_number))      

output:

[5, 2, 3, 8]
enter the 4 digit number: 5237
Traceback (most recent call last):
  File "C:\Users\Luiza\Desktop\try_to_understand.py", line 41, in <module>
    print(play_bull_and_cow(random_number, guess_number))
  File "C:\Users\Luiza\Desktop\try_to_understand.py", line 23, in play_bull_and_cow
    if users_number[i] == random_number[i]:
IndexError: list index out of range
LuiTe
  • 51
  • 7
  • Does this answer your question? [Modifying list while iterating](https://stackoverflow.com/questions/1637807/modifying-list-while-iterating) – Tomerikoo Nov 12 '20 at 09:37
  • [How to debug small programs](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – Tomerikoo Nov 12 '20 at 09:40

2 Answers2

1

it's because users_number and random_number don't have the same tail. so i goes from 0 to a number greater than len(users_number) which gives this error

Talm
  • 118
  • 7
  • I have added random_number = random_number users_number = users_number below to overwrite it.. but it did not help. Do you know how can I change code to make it work..? – LuiTe Nov 12 '20 at 09:49
0

Because here for i in range(len(random_number)) your range value is already calculated and is constant. But here random_number.pop(i) you reduce the size of list. So you end up with more iterations than current list length. And when your i passes the random_number length, you get IndexError when trying to access values with random_number[i]

go2nirvana
  • 1,598
  • 11
  • 20
  • I guess I understand. I tried to change code by adding random_number = random_number cause I want that it takes this new random_number after random_number.pop(i). It did not help. Do you have any tips how to change it in the way that it works properly? – LuiTe Nov 12 '20 at 09:44