wordle/play.py

72 lines
2.4 KiB
Python

import random
from lib import cat_words, INSTRUCTIONS, BLANK, ROUNDS, WORD_LENGTH
PLAY_INSTRUCTIONS = "Guess a 5-letter word, all lowercase. Hints will be given after the guess. " + INSTRUCTIONS
def build_letter_hint(guess, word):
guess_break = [letter for letter in guess]
word_break = [letter for letter in word]
letters_hints = [BLANK] * WORD_LENGTH
for guess_pos, guess_letter in enumerate(guess):
if word[guess_pos] == guess_letter:
letters_hints[guess_pos] = guess_letter.upper()
word_break[guess_pos] = BLANK
guess_break[guess_pos] = BLANK
# see test() - need to be more careful with repeating words
for guess_pos, guess_letter in enumerate(guess_break):
if guess_letter != BLANK and guess_letter in word_break:
letters_hints[guess_pos] = guess_letter
first_index = word_break.index(guess_letter)
word_break[first_index] = BLANK
return ''.join(letters_hints)
def build_non_letter_hint(guess, word):
non_letters_hints = ''
for letter in guess:
if letter not in word and letter not in non_letters_hints:
non_letters_hints += letter
return non_letters_hints
def main_loop():
word = random.choice([w for w in cat_words()])
print(PLAY_INSTRUCTIONS)
for round_number in range(ROUNDS):
print("ROUND {}".format(round_number + 1))
guess = input("Guess: ")
if len(guess) != 5 and not all([x.islower() for x in guess]):
print("ERROR: {}".format(PLAY_INSTRUCTIONS))
non_letters_hints = build_non_letter_hint(guess, word)
letters_hints = build_letter_hint(guess, word)
print("Non-letters: {}".format(non_letters_hints))
print("Letters: {}".format(letters_hints))
print("-" * 10)
if all([x.isupper() for x in letters_hints]):
print('WIN')
break
else:
print("LOSE")
print("Word was: {}".format(word))
def do_test():
assert build_letter_hint('yummy', 'slily') == '----Y'
assert build_letter_hint('yummy', 'slyly') == 'y---Y'
assert build_letter_hint('yymyy', 'slyyy') == 'y--YY'
assert build_letter_hint('ymmyy', 'slyyy') == 'y--YY'
assert build_letter_hint('mmmyy', 'slyyy') == '---YY'
assert build_letter_hint('cabby', 'abbey') == '-aBbY'
assert build_letter_hint('abbey', 'cabby') == 'abB-Y'
def main():
do_test()
main_loop()
if __name__ == "__main__":
main()