How to solve the “Mastermind” guessing game?

后端 未结 10 448
有刺的猬
有刺的猬 2020-12-04 07:42

How would you create an algorithm to solve the following puzzle, \"Mastermind\"?

Your opponent has chosen four different colours from a set of six (yellow, blue, gre

10条回答
  •  旧巷少年郎
    2020-12-04 08:29

    Here is a generic algorithm I wrote that uses numbers to represent the different colours. Easy to change, but I find numbers to be a lot easier to work with than strings.

    You can feel free to use any whole or part of this algorithm, as long as credit is given accordingly.

    Please note I'm only a Grade 12 Computer Science student, so I am willing to bet that there are definitely more optimized solutions available.

    Regardless, here's the code:

    import random
    
    
    def main():
    
        userAns = raw_input("Enter your tuple, and I will crack it in six moves or less: ")
        play(ans=eval("("+userAns+")"),guess=(0,0,0,0),previousGuess=[])
    
    def play(ans=(6,1,3,5),guess=(0,0,0,0),previousGuess=[]):
    
        if(guess==(0,0,0,0)):
           guess = genGuess(guess,ans)
        else:
            checker = -1
            while(checker==-1):
                guess,checker = genLogicalGuess(guess,previousGuess,ans)
    
        print guess, ans
    
    
        if not(guess==ans):
            previousGuess.append(guess)
    
            base = check(ans,guess)
    
            play(ans=ans,guess=base,previousGuess=previousGuess)
    
        else:
            print "Found it!"
    
    
    
    
    
    def genGuess(guess,ans):
        guess = []
        for i in range(0,len(ans),1):
            guess.append(random.randint(1,6))
    
        return tuple(guess)
    
    def genLogicalGuess(guess,previousGuess,ans):
        newGuess = list(guess)
        count = 0
    
        #Generate guess
    
        for i in range(0,len(newGuess),1):
            if(newGuess[i]==-1):
                newGuess.insert(i,random.randint(1,6))
                newGuess.pop(i+1)
    
    
        for item in previousGuess:
            for i in range(0,len(newGuess),1):
                if((newGuess[i]==item[i]) and (newGuess[i]!=ans[i])):
                    newGuess.insert(i,-1)
                    newGuess.pop(i+1)
                    count+=1
    
        if(count>0):
            return guess,-1
        else:
            guess = tuple(newGuess)
            return guess,0
    
    
    def check(ans,guess):
        base = []
        for i in range(0,len(zip(ans,guess)),1):
            if not(zip(ans,guess)[i][0] == zip(ans,guess)[i][1]):
                base.append(-1)
            else:
                base.append(zip(ans,guess)[i][1])
    
        return tuple(base)
    
    main()
    

提交回复
热议问题