Reputation: 71
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
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