Python 主心数位置值

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

我正在创建一个Master Mind程序,在该程序中,用户应该猜测一个4位数的数字,所有数字都必须不同。如果用户猜测的数字在数字中,但不在正确位置,则显示为“F”,如果在正确位置,则显示为“R”。我的代码的问题是,如果用户的猜测包含2个或更多相同的数字,并且第一个在错误的位置,但是第二个在正确的位置,那么它会显示一个“F”,但它应该显示一个“R”。你能帮我找个办法解决这个问题吗

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”。