首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:牛和公牛的游戏

Python:牛和公牛的游戏
EN

Stack Overflow用户
提问于 2019-01-23 20:04:50
回答 4查看 11.6K关注 0票数 0

我正在为一个游戏编写一个代码,它随机生成一个4位数的数字。让用户猜一个四位数的数字.对于用户在正确位置正确猜出的每一个数字,他们都有一个“牛”。对于每一个正确的数字,用户在错误的地方猜测是“牛”。每次用户猜测,告诉他们有多少“牛”和“公牛”。一旦用户猜对了号码,游戏就结束了。跟踪用户在整个游戏中的猜测次数,并在游戏结束时告诉用户。

代码在下面。

代码语言:javascript
复制
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()

但是,在它要求用户猜出数字并接受输入后,我得到了以下错误。下面给出了错误。

代码语言:javascript
复制
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

我在这里犯了什么错误?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-24 00:04:49

你对数字什么时候是公牛的定义有点不清楚。假设您的解决方案密钥是[1, 8, 5, 8]和猜测8888。数字8在解决方案键中多次出现。所以你有两头牛。但在这种情况下,你对多头的预期产出是多少?一种可能的解决方案(见下文)是检查每个猜测的数字是否存在于解决方案键中的任何位置(即使它可能已经是一头母牛)。

下面的解决方案包括其他人已经提到的一些备注(参见@Bill M.发布)。

可能的解决方案:

代码语言:javascript
复制
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)

示例输出:

代码语言:javascript
复制
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).
票数 1
EN

Stack Overflow用户

发布于 2019-01-23 20:37:06

所以它基本上是Mastermind的变体,嗯?无论如何,对于user_guess,在整个input返回过程中都有括号。因为输入是一个字符串,所以这会给您返回一个只有一个项的列表。例如,如果用户输入1234,则user_guess成为列表['1234']而不是 ['1', '2', '3', '4']。这意味着listnum=[i for i in user_guess]只是返回[1234] (一个包含一个元素的列表,即数字1,000,234),而不是 [1,2,3,4]。因此,尝试删除input周围的括号。

另外,您应该将listnum的创建更改为listnum=[int(i) for i in user_guess],因为您最终是在比较整数,而不是字符串。

我还注意到了其他一些事情:

  • 你告诉用户使用一个四位数的数字.所以你应该使用range(4)
  • 你只要求用户猜一次。函数中应该有input语句。
  • 您的猜测次数计数器被关闭了一个。尝试将count += 1放在while True之后。
  • guess=[i for i in rand]似乎是多余的。您可以在这里使用列表rand。而且,把秘密答案称为“猜测”似乎是违反直觉的。
  • 实际上,由于所有东西都是函数,所以不需要使用while循环。您可以在错误的猜测之后再次调用game()函数,并在用户最终获胜时使用return
  • 对于公牛计数,您使用一个名为num的变量,但我没有看到它在任何地方都有定义。不是应该是8点吗?另外,考虑一下公牛数应该是4的情况,或者秘密答案是'1233':猜测'3354‘应该给你两个公牛吗?
  • 还有一个语法问题:你打印的答案说“你猜了多少次”,而不是“猜测”--如果猜测次数超过一次。
票数 2
EN

Stack Overflow用户

发布于 2019-01-23 20:36:53

从这一行user_guess=[input("Please guess 4-digit number: ")]中删除方括号,就像创建一个带有一个条目的列表一样,用户字符串输入。这可能与IndexError有关,因为列表中只有一个条目,例如['1234']

另一个解决方法是在while-loop之前将用户字符串输入转换为整数列表:

代码语言:javascript
复制
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))

在那之后发生的无限循环是另一个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54334846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档