我一直在尝试编写一个实现牛群公牛游戏的Python程序,这是我的代码:
import random
def cb():
pc = random.sample('123456789',4)
cows = []
bulls = []
while True:
guess = input('please enter a 4 digit num: ')
cows = rmd(cows)
bulls = rmd(bulls)
if pc == guess:
print('You win!')
break
(cows.append(i) for i in pc if i in guess and guess.index(i) == pc.index(i))
(bulls.append(i) for i in pc if i in guess and guess.index(i) != pc.index(i))
print ('{} cows and {} bulls'.format(len(cows), len(bulls))
continue
这是我在放弃之前尝试的最后一种方法,在此之前我编写了50多个程序并且没有任何工作,它总会返回0牛0牛。我已经尝试过循环,而猜测!=数百个想法中的pc ..什么都行不通。
rmd是一个函数,通过将重复项转换为集合,然后将该集转换为列表并返回最终列表,从给定列表中删除重复项。
这只是一场愚蠢的游戏,但没有任何作用的事实令人沮丧......
答案 0 :(得分:1)
random.sample
返回一个列表,因此它永远不会等于用户输入的字符串。
行(cows.append(i)...
和(bulls.append(i)...
是生成器,这意味着除非进行评估,否则它们不执行任何操作。你可以通过交换方括号的括号括起来在技术上将它们变成列表推导,但你会建立一个副作用列表,这是不赞成的。而不是将list.append
置于生成器或理解中,而是实际构建所需列表的理解,就像它们打算做的那样。此外,由于您首先只需要唯一的项目,因此没有理由在任何时候使用列表。
根本没有理由建立列表或集合,因为您要做的只是计算每个实例。
import random
def cb():
pc = ''.join(random.sample('123456789',4))
while True:
guess = input('please enter a 4 digit num: ')
if pc==guess:
print ('You win!')
break
bulls = 0
cows = 0
for character in guess:
if character in pc:
if guess.index(character) == pc.index(character):
bulls += 1
else:
cows += 1
print(cows, 'cows and', bulls, 'bulls')
答案 1 :(得分:0)
print
查看变量中的内容,您会感到惊讶!random.sample('123456789',4)
会返回4个字母的列表,而不是4个字母的字词。input
,与raw_input相反,尝试自动转换(例如输入“1234”会导致int),有些人认为这是不好的做法。使用raw_input确保获得字符串。"".join(random.sample....)
它们如何相等?!代码:
for index,i in enumerate(guess):
if i in guess:
if pc[index] == i: cows.append(i)
else: bulls.append(i)
祝你好运!
编辑:
我看到有人为你解决了这个问题 - 我仍然恳请你阅读有关发电机的信息,也许还有一个演练。