Mastermind数字位置值

时间:2013-12-27 13:15:47

标签: python python-3.x

我正在创建一个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

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

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

答案 1 :(得分:0)

最好使用一个好的切片结构来代替那么多嵌套语句。 以下链接和代码显示了一个很好的方法。

选择(玩家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)])

AHA!唉,我们给了他们一个白色的所有红色,但不要担心它确定我们只是做一些数学和" - "每个红色减1白色 Tada保持简单,保持美丽。

请参阅以下链接中提供的答案:

如果你在while循环中查看,你应该可以使用这段代码。

Mastermind Python Using "ABCDEF"