Игра Python: коровы и быки - PullRequest
0 голосов
/ 23 января 2019

Я пишу код для игры, которая случайным образом генерирует 4-значное число. Попросите пользователя угадать 4-значный номер. За каждую цифру, которую пользователь угадал правильно в правильном месте у них есть «корова». Для каждой цифры, которую пользователь правильно угадал в неправильном месте, есть «бык». Каждый раз, когда пользователь делает предположение, скажите ему, сколько у него «коров» и «быков». Как только пользователь угадает правильный номер, игра окончена. Следите за количеством предположений, которые пользователь делает на протяжении всей игры, и сообщайте ему в конце.

Код ниже.

import random

rand=[random.randint(0,9) for n in range(3)]


user_guess=[input("Please guess 4-digit number: ")]

def game():
    count=0
    while True:
        guess=[i for i in rand]
        listnum=[i for i in user_guess]

        if guess == listnum:
            print("You won.")
            print("It took you "+str(count)+" guess.")
            break

        if guess != listnum:
            cow=0
            bull=0
            count+=1
            for x in range(0,3):
                if guess[x]==listnum[x]:
                    cow+=1

        if len(set(guess)&set(listnum))>num:
            bull=len(set(guess)&set(listnum)) - cow

        print("Cows: "+str(cow)+' Bulls: '+str(bull))

game()

Но я получаю следующую ошибку после того, как пользователь просит угадать число и получает ввод. Ошибка приведена ниже.

Please guess 4-digit number: 1234

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-48-64a0b0d4d766> in <module>()
     41         print("Cows: "+str(cow)+' Bulls: '+str(bull))
     42 
---> 43 game()
     44 
     45 

<ipython-input-48-64a0b0d4d766> in game()
     33             count+=1
     34             for x in range(0,3):
---> 35                 if guess[x]==listnum[x]:
     36                     cow+=1
     37 

IndexError: list index out of range

Какую ошибку я здесь делаю?

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Ваше определение того, когда цифра является быком, немного неясно. Допустим, ваш ключ решения, например, [1, 8, 5, 8] и ваше предположение 8888. Число 8 присутствует несколько раз в ключе решения. Итак, у вас есть 2 коровы. Но каков ваш ожидаемый выход для быков в этом случае? Одним из возможных решений (см. Ниже) было бы проверить, присутствует ли каждое предполагаемое число где-либо в ключе решения (даже если это может быть уже корова).

Приведенное ниже решение включает некоторые замечания, уже упомянутые другими (см. Сообщение @ Bill M. ).

Возможное решение:

import random

def game(num_digits):
    # generate list of random integers of length num_digits
    listnum = [random.randint(0,9) for n in range(num_digits)]
    print("Solution key = " + str(listnum))

    count=0
    while True:
        count+=1
        print("~~~ Guess: " + str(count) + " ~~~")

        print("Please guess " + str(num_digits) + "-digit number: ")
        # transform input string (e.g. "1234") to list of integers (e.g. [1,2,3,4])
        guess = [int(i) for i in str(input())]

        if guess == listnum:
            print("You won.")
            print("It took you "+str(count)+" guess(es).")
            break

        else:
            cow=0
            bull=0

            for x in range(0,num_digits):
                if guess[x]==listnum[x]:
                    cow += 1
                elif guess[x] in listnum: # look if digit is somewhere else in the solution key (might already be a cow)
                    bull += 1

        print("Cows: "+str(cow)+" Bulls: "+str(bull))
        print("++++++++++++++++")

game(4)

Пример вывода:

Solution key = [1, 8, 5, 8]
~~~ Guess: 1 ~~~
Please guess 4-digit number:
2288
Cows: 1 Bulls: 1
++++++++++++++++
~~~ Guess: 2 ~~~
Please guess 4-digit number:
8888
Cows: 2 Bulls: 2
++++++++++++++++
~~~ Guess: 3 ~~~
Please guess 4-digit number:
1858
You won.
It took you 3 guess(es).
0 голосов
/ 23 января 2019

Так что это в основном вариант Mastermind, а?В любом случае, для user_guess у вас есть скобки вокруг всего возврата input.Так как input является строкой, это возвращает вам список только с одним элементом.Например, если пользователь вводит 1234, то user_guess становится списком ['1234'], , а не ['1', '2', '3', '4'].Это означает, что listnum=[i for i in user_guess] просто возвращает вам [1234] (список с одним элементом, который является числом тысяча двести тридцать четыре), не [1,2,3,4].Поэтому попробуйте снять скобки вокруг input.

Кроме того, вы должны изменить свое создание listnum на listnum=[int(i) for i in user_guess], поскольку в конечном итоге вы пытаетесь сравнивать целые числа, а не строки.

Некоторые другие вещи, которые я заметил:

  • Вы говорите пользователям использовать 4-значное число.Поэтому вы должны использовать range(4)
  • Вы просите пользователя угадать только один раз.Вы должны иметь оператор input в своей функции.
  • Ваш счетчик для количества догадок отключен на единицу.Попробуйте поставить count += 1 сразу после while True.
  • guess=[i for i in rand] кажется избыточным.Вы можете просто использовать список rand здесь.Кроме того, кажется нелогичным называть секретный ответ «угадай».
  • На самом деле, поскольку у вас есть все как функция, нет необходимости в цикле while.Вы можете просто вызвать функцию game() снова после неверного предположения и использовать return, когда пользователь наконец выиграет.
  • Для подсчета быков вы используете переменную с именем num, но я неэто нигде не видно.Разве это не должно быть 8?Кроме того, рассмотрим случай, когда число быков должно быть 4, или секретный ответ - что-то вроде «1233»: должна ли догадка «3354» дать вам двух быков?
  • И грамматический момент: ответ вамprint говорит: «Это заняло у вас сколько угодно догадок», а не «догадки», если количество догадок больше одного.
0 голосов
/ 23 января 2019

определить входные данные как строку, а не как один элементарный список с одной строкой в ​​нем

user_guess = input ("Пожалуйста, угадайте четырехзначное число:")

затем разделить список с помощью разделителя

listnum = user_guess.split (',')

https://www.tutorialspoint.com/python/string_split.htm

плюс число не определено в

если len (установить (угадать) и установить (listnum))> num:

0 голосов
/ 23 января 2019

Удалите квадратные скобки из этой строки user_guess=[input("Please guess 4-digit number: ")], как при создании списка с одной записью, ввод строки пользователя. что, вероятно, связано с IndexError, поскольку в списке есть только одна запись, например, ['1234'].

Другим исправлением является преобразование ввода строки пользователя в список целых чисел до while -loop:

user_guess = input("Please guess 4-digit number: ")

def game():
    count=0
    listnum = [int(num) for num in user_guess]
    # or use `map`
    # listnum = list(map(int, user_guess))

Бесконечный цикл, который происходит после этого, является другой проблемой.

...