Deka
Deka

Reputation: 71

MasterMind Game Python Code

import random 
def create_code(characters,length):
    """(str,int) -> list
    Return a list of length size of single character of the characters in the given str
    >>>create_code('ygbopr')
    ['g','b','r','b']
    """
    characters = 'grbyop'
    length = 4 
    return list(random.sample(characters,length))
    pass

def find_fully_correct(answer, guess):
    """(list,list) -> list
    Return a list containing a 'b' for each correctly positioned color in the guess
    >>>find_fully_correct(['g','b','r','b'], ['g','b','r','b'])
    ['b', 'b', 'b', 'b']
    """
    res= []
    for x, y in  zip(guess, answer):
            if x == y:
                res.append("b")
    return res if res else None
    pass

def remove_fully_correct(answer, guess):
    """(list,list) -> list 
    Return a list that removes the chars from the first list that are the same and in the same postion in the second list
    >>>remove_fully_correct(['a','b','c','d'], ['d','b','a','d'])
    ['a','c']
    """
    res= answer
    for x,y in zip(answer, guess):
        if x == y:
            res.remove(x)
    list3 = remove_fully_correct(guess,answer)
    list4 = remove_fully_correct(answer,guess)

    for char in list4:
        if char in list3:
            return res
        pass

def find_colour_correct(answer, guess):
    """(list,list) -> list
    Return a list of 'w''s where the number of 'w''s is qual to the number of strs in the second list that have the same value as the str in the first list but a different position
    >>>find_colour_correct(['y','n','g','g'], ['g','n','o','r'])
    ['w']
    """
    res = []
    for str in guess:
        if str in answer:
            res.append("w")   
    return res
    pass

def print_game(guesses, clues):
    """(list,list) -> display
    Print to display headers, Guess and Clue, with the corresponding sublists of the given lists
    >>>print_game(guesses,clues)
    Guesses     Clues
    o o o o     b
    r r r r     b b
    """
    print ('Guesses \t Clues')

    guess = ''
    clue = ''
    guesses = guess_list 
    clues = clue_list
    clue_list = (find_fully_correct, find_correct,colour)

    for guess_list in guesses: 
        for index in range(len(guess_list)):
        guess = guess + ' ' + guess_list[index]
        guess = guess.lstrip()

    for clue_list in clues:
        for char in range (len(clue_list)): 
            clue = clue + ' ' + clue_list[char]
            clue = clue.lstrip()

        print (guess + ' \t ' + clue + '\n')
        pass

def valid(user_guess, valid_chars, size):

    if len(user_guess) != size or user_guess not in valid_chars:
        return False
    else:
        return True
    pass

if __name__ == '__main__':
    size = 4
    tries = 10
    valid_chars= 'grbyop'

Attempting to code the Mastermind game which involves the creation of a hidden colour combination or code - consisting of 4 colour code chosen from 6 colours by the program. The user is the code-breaker and tries to figure out the code by guessing the code. The program then gives feedback on the correctness of the guess by telling the second player how many correctly positioned in their guessed colour code has and how many correct colour but incorrectly positioned colours the guess has, until the user either guesses the actual colour code or runs out of their 10 tries.

I'm having trouble with the print_game function and the valid function

Also I'm not sure how to command the actual program to function like a game after the if__name__ == 'main' section. As in calling the actual functions to giving commands to the user to see their progress.

Any help is much appreciated.

Upvotes: 2

Views: 2870

Answers (1)

igon
igon

Reputation: 3046

If you want to ask the user for input, you can use raw_input in Python 2.X, and input in Python 3. I would start with that in order to test your code.

valid seems conceptually correct to me except for the pass statement at the end which is unnecessary. It can be rewritten simply as:

valid(user_guess, valid_chars, size):
    return len(user_guess) == size and reduce(operator.and , map(lambda x: x in valid_chars ,user_guess))

I am not sure what you are trying to achieve with print_game. Given a list of guesses and clues print_game should just be:

print_game(guesses,clues):
    print ('Guesses \t Clues')
    assert len(guesses) == len(clues)
    for g,c in zip(guesses,clues):
        print g,'\t',c

Upvotes: 1

Related Questions