Python 主心数位置值
我正在创建一个Master Mind程序,在该程序中,用户应该猜测一个4位数的数字,所有数字都必须不同。如果用户猜测的数字在数字中,但不在正确位置,则显示为“F”,如果在正确位置,则显示为“R”。我的代码的问题是,如果用户的猜测包含2个或更多相同的数字,并且第一个在错误的位置,但是第二个在正确的位置,那么它会显示一个“F”,但它应该显示一个“R”。你能帮我找个办法解决这个问题吗Python 主心数位置值,python,python-3.x,Python,Python 3.x,我正在创建一个Master Mind程序,在该程序中,用户应该猜测一个4位数的数字,所有数字都必须不同。如果用户猜测的数字在数字中,但不在正确位置,则显示为“F”,如果在正确位置,则显示为“R”。我的代码的问题是,如果用户的猜测包含2个或更多相同的数字,并且第一个在错误的位置,但是第二个在正确的位置,那么它会显示一个“F”,但它应该显示一个“R”。你能帮我找个办法解决这个问题吗 value = "" tmp = [False]*4 for i in range(4): for j in
value = ""
tmp = [False]*4
for i in range(4):
for j in range(4):
if userAnswer[i] == computerNumber[j]:
if i==j and tmp[j]!= True:
tmp[j] = True
value += "R"
elif tmp[j] != True:
tmp[j] = True
value += "F"
break
return value
你可以试试这个:
def guess(user_answer, true_number):
right_position = [(user_answer[i] == true_number[i]) for i in range(4)]
right_number = [(not right_position[i] and (user_answer[i] in true_number)) for i in range(4)]
return 'R' * right_position.count(True) + 'F' * right_number.count(True)
编辑:我不太确定您需要什么样的输出。如果您希望在存在任何精确匹配时只有“R”(无“F”),您可能会发现以下方法有效:
def guess(user_answer, true_number):
right_position = [(user_answer[i] == true_number[i]) for i in range(4)]
if any(right_position):
return 'R' * right_position.count(True)
right_number = [(user_answer[i] in true_number) for i in range(4)]
if any(right_number):
return 'F' * right_number.count(True)
return '' # or what else you want to indicate that there's no matching
再次编辑:这次我想我会让你知道的。:)然后,这将如您所期望的那样起作用:
def guess(user_answer, true_number):
right_position = [(user_answer[i] == true_number[i]) for i in range(4)]
if any(right_position):
return 'R'
right_number = [(user_answer[i] in true_number) for i in range(4)]
if any(right_number):
return 'F'
return '' # or what else you want to indicate that there's no matching
最好使用一个好的切片结构来代替如此多的嵌套语句。 下面的链接和代码显示了一个很好的方法 选择(玩家4个数字输入) 和makeRandomeWhenGameStarts()(这是要猜测的随机4个数字) 代码中发生的事情是,它从 1234和1423并将它们转换为字符串:
playGuess= [['1'],['2'], ['3'],['4']]
ranRoll= [['1'],['3'],['4'],['2']]
#then you want to do 2 things
#see if i in guess is in randomroll and count them for whitepegs
#Then see what is in the same position:
nWhitePegs = len([i for i in playGuess if i in ranRoll])
then see how many are in the same postion
nRedPegs = sum([1 if i==j else 0 for i, j in zip(playGuess,ranRoll)])
啊哈!唉,我们给了他们一个白色代表所有的红色,但别担心,没关系,我们只是做一些数学运算,每红色减去一个白色
塔达,保持简单,保持美丽
请参见以下链接中已提供的答案:
如果您查看while循环,您应该能够使用此代码
现在的问题是,对于同一个数字,此函数同时返回“F”和“R”。例如,如果用户的答案是4444,true的数字是1234,那么函数返回“RFFF”,而它应该只返回“R”@user3139496。实际上,我不太确定您想要什么输出。。是否只有“R”(无“F”)才有精确匹配?我很快会更新我的答案。问题是数字中的数字应该只返回“F”或“R”。如果用户回答为“4456”,真实数字为“1234”,则函数应返回“F”,而不是“FF”;如果用户回答为“5226”,真实数字为“1234”,则函数应返回“R”,而不是“RF”。是的,只有在完全匹配时才应为“R”。