【问题标题】:Python multiple number guessing gamePython 多数字猜谜游戏
【发布时间】:2014-10-24 23:36:30
【问题描述】:

我正在尝试创建一个包含多个数字的数字猜谜游戏。计算机生成 4 个介于 1 和 9 之间的随机数,然后用户有 10 次机会猜出正确的数字。我需要将反馈显示为YYYY 以表示猜中的 4 个正确数字,YNNY 表示猜中的第一个和最后一个数字等(你明白了)。下面的代码不断返回说IndexError: list index out of range

from random import randint

guessesTaken = 0
randomNumber = []

for x in range(4):
        tempNumber = randint(1, 9)
        randomNumber.append(tempNumber)

Guess = []
Guess.append(list(input("Guess Number: ")))

print(randomNumber)
print(Guess)

if randomNumber[0] == Guess[0]:
    print("Y")
elif randomNumber[1] == Guess[1]:
    print("Y")
elif randomNumber[2] == Guess[2]:
    print("Y")
elif randomNumber[3] == Guess[3]:
    print("Y")
elif randomNumber[0] != Guess[0]:
    print("N")
elif randomNumber[1] != Guess[1]:
    print("N")
elif randomNumber[2] != Guess[2]:
    print("N")
elif randomNumber[3] != Guess[3]:
    print("N")

【问题讨论】:

  • 用户输入的是什么?将行更改为Guess += list(input("Guess Number: ")) 可以修复它,但这取决于输入

标签: python numbers


【解决方案1】:

您需要四次猜测来匹配随机数,您也可以使用列表组合来缩短您的代码:

from random import randint

guessesTaken = 0
randomNumber = []

Guess = []
for x in range(4):
        tempNumber = str(randint(1, 9)) # compare string to string 
        randomNumber.append(tempNumber)
        Guess.append(input("Guess Number: "))

print("".join(["Y" if a==b else "N" for a,b in zip(Guess,randomNumber)]))

您还可以使用 enumerate 来检查匹配索引处的元素:

print("".join(["Y" if randomNumber[ind]==ele else "N"  for ind, ele in enumerate(Guess)]))

让用户循环猜测:

from random import randint

guessesTaken = 0
randomNumber = [str(randint(1, 9))  for _ in range(4)] # create list of random nums

while guessesTaken < 10: 
    guesses = list(raw_input("Guess Number: ")) # create list of four digits
    check = "".join(["Y" if a==b else "N" for a,b in zip(guesses,randomNumber)])
    if check == "YYYY": # if check has four Y's we have a correct guess
        print("Congratulations, you are correct")
        break
    else:
        guessesTaken += 1 # else increment guess count and ask again
        print(check)

【讨论】:

  • @AaronHall,我不能再不同意了,它怎么不可读?这比多个不必要的 if else 语句要好得多
  • 我同意@PadraicCunningham,列表理解更具可读性。很琐碎,懂基本python的人应该真的能看懂那个代码
  • @user2981639,是的,我同意,它几乎读作完美的英语
  • 您好,效果很好,但我的解释一定不是很清楚,我需要用户输入猜测(显然是 4 个数字),然后猜测之后的输出将显示 'YYYY'或 'YYNNY' (你又明白了),然后用户不断猜测,直到输出为 'YYYY' (但用户应该最多只能猜测 10 次)谢谢你的帮助
  • @paxyshack,看看编辑,看看我们是否在同一页面上
【解决方案2】:

现在您只要求用户进行一次猜测,并将猜测附加到Guess 列表中。所以Guess 列表只有一个元素,但您使用的是Guess[1]Guess[2] 等,这当然会导致IndexError

【讨论】:

    【解决方案3】:

    我会重新排列你的代码,这样它就不会偏离你所做的太远。

    from random import randint
    
    guessesTaken = 0
    randomNumbers = []
    Guess = [] # Combine your guesses with your loop
    
    for x in range(4):
        tempNumber = randint(1, 9)
        randomNumbers.append(tempNumber)
        # This should be done four times too
        # In Python 2, instead of this:
        # Guess.append(input("Guess Number: ")) 
        # do this:
        Guess.append(int(raw_input("Guess Number: "))) #  raw_input and pass to int 
        # in python 3, raw_input becomes input, so do this instead:
        # Guess.append(int(input("Guess Number: "))) 
    
    
    print(randomNumbers)
    print(Guess)
    

    您可以将它们组合在一个循环中以避免重复代码:

    if randomNumbers[0] == Guess[0]:
        print("Y")
    else:
        print("N")
    if randomNumbers[1] == Guess[1]:
        print("Y")
    else:
        print("N")
    if randomNumbers[2] == Guess[2]:
        print("Y")
    else:
        print("N")
    if randomNumbers[3] == Guess[3]:
        print("Y")
    else:
        print("N")
    

    也许,打印您想要的结果,例如YNNY,像这样:

    result = []
    for index in range(4):
        if randomNumbers[index] == Guess[index]:
            result.append("Y")
        else:
            result.append("N")
    print(''.join(result))
    

    如果你想要更简洁的代码,请使用 Python 的三元运算:

    result = []
    for index in range(4):
        result.append("Y" if randomNumbers[index] == Guess[index] else "N")
    print(''.join(result))
    

    或者使用True == 1False == 0作为索引:

    result = []
    for index in range(4):
        result.append("NY"[randomNumbers[index] == Guess[index]])
    print(''.join(result))
    

    【讨论】:

    • 上次检查字符串和整数不能相等
    • 如果是python 2,输入的整数变成整数。
    • 一个有根据的猜测考虑到 OP 正在使用 parens 进行打印,这会让我相信他们正在使用 python 3,如果不是,他们应该不鼓励使用 input
    猜你喜欢
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多