Python: Cows and Bulls 游戏
Python: Cows and Bulls game
我正在为一个随机生成 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
我在这里犯了什么错误?
从该行删除方括号 user_guess=[input("Please guess 4-digit number: ")]
,就像创建一个只有一个条目的列表一样,即用户字符串输入。这可能与 IndexError
有关,因为列表中只有 one 条目,例如['1234']
.
另一个修复方法是在 while
循环之前将用户字符串输入转换为整数列表:
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))
之后发生的无限循环是另一个问题。
所以它基本上是 Mastermind 的变体,是吗?无论如何,对于 user_guess
,input
的整个 return 都有括号。因为输入是一个字符串,所以这会给你一个只有一个项目的列表。例如,如果用户输入 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
。此外,将秘密答案称为 "guess". 似乎违反直觉
- 事实上,由于您将所有内容都作为一个函数,因此不需要
while
循环。你可以在猜错后再次调用game()
函数,当用户最终获胜时使用return
。
- 对于公牛计数,您使用了一个名为
num
的变量,但我没有在任何地方看到它的定义。这不应该是8吗?另外,考虑公牛数量应该为 4 的情况,或者秘密答案类似于“1233”:如果猜测“3354”会给你两只公牛?
- 还有一个语法要点:如果猜测的次数超过一次,你打印的答案是 "It took you [however many] guess",而不是 "guesses"。
将输入定义为字符串而不是一个包含一个字符串的元素列表
user_guess=输入("Please guess 4-digit number: ")
然后使用分隔符拆分列表
listnum= user_guess.split(',')
https://www.tutorialspoint.com/python/string_split.htm
plus num 在
中未定义
if len(set(guess)&set(listnum))>num:
您对数字何时为牛市的定义有点不清楚。假设您的解决方案关键是例如[1, 8, 5, 8]
和你的猜测 8888
。解决方案密钥中多次出现数字 8。所以你有2头牛。但在这种情况下,您对多头的预期产量是多少?一种可能的解决方案(见下文)是检查每个猜测的数字是否存在于解决方案密钥中的任何位置(即使它可能已经是一头牛)。
下面的解决方案包括其他人已经提到的一些评论(请参阅@Bill M. 的 post)。
可能的解决方案:
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).
我正在为一个随机生成 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
我在这里犯了什么错误?
从该行删除方括号 user_guess=[input("Please guess 4-digit number: ")]
,就像创建一个只有一个条目的列表一样,即用户字符串输入。这可能与 IndexError
有关,因为列表中只有 one 条目,例如['1234']
.
另一个修复方法是在 while
循环之前将用户字符串输入转换为整数列表:
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))
之后发生的无限循环是另一个问题。
所以它基本上是 Mastermind 的变体,是吗?无论如何,对于 user_guess
,input
的整个 return 都有括号。因为输入是一个字符串,所以这会给你一个只有一个项目的列表。例如,如果用户输入 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
。此外,将秘密答案称为 "guess". 似乎违反直觉
- 事实上,由于您将所有内容都作为一个函数,因此不需要
while
循环。你可以在猜错后再次调用game()
函数,当用户最终获胜时使用return
。 - 对于公牛计数,您使用了一个名为
num
的变量,但我没有在任何地方看到它的定义。这不应该是8吗?另外,考虑公牛数量应该为 4 的情况,或者秘密答案类似于“1233”:如果猜测“3354”会给你两只公牛? - 还有一个语法要点:如果猜测的次数超过一次,你打印的答案是 "It took you [however many] guess",而不是 "guesses"。
将输入定义为字符串而不是一个包含一个字符串的元素列表
user_guess=输入("Please guess 4-digit number: ")
然后使用分隔符拆分列表
listnum= user_guess.split(',')
https://www.tutorialspoint.com/python/string_split.htm
plus num 在
中未定义if len(set(guess)&set(listnum))>num:
您对数字何时为牛市的定义有点不清楚。假设您的解决方案关键是例如[1, 8, 5, 8]
和你的猜测 8888
。解决方案密钥中多次出现数字 8。所以你有2头牛。但在这种情况下,您对多头的预期产量是多少?一种可能的解决方案(见下文)是检查每个猜测的数字是否存在于解决方案密钥中的任何位置(即使它可能已经是一头牛)。
下面的解决方案包括其他人已经提到的一些评论(请参阅@Bill M. 的 post)。
可能的解决方案:
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).