go back  02 - Word Values Part II - A Simple Game




This challenge write-up first appeared on PyBites.

This week, each one of you has a homework assignment ... - Tyler Durden (Fight club)

Given a random set of 7 letters build the most valuable word

Using what we've learned the last challenge this week we build a simple Scrabble-like game (without board):

Letters drawn: G, A, R, Y, T, E, V
Form a valid word: gary  << user input
Word chosen: GARY (value: 8)
Optimal word possible: GARVEY (value: 13)
You scored: 61.5

Get ready

Start coding by forking our challenges repo:

$ git clone https://github.com/pybites/challenges

If you already forked it sync it:

# assuming using ssh key
$ git remote add upstream [email protected]:pybites/challenges.git 
$ git fetch upstream
# if not on master: 
$ git checkout master 
$ git merge upstream/master

Use one of the templates:

$ cd 02
$ cp game-TEMPLATE.py game.py
# code

Requirements / steps

Last time we provided unittests and a guiding template. We received feedback that this was a bit too stringent. Therefore we provide two templates this time: game-help.py and game-nohelp.py

  • We load in the necessary data structures to focus on the game:

    # Note that DICTIONARY is a set for O(1) lookups
    from data import DICTIONARY, LETTER_VALUES, POUCH
    
  • Draw 7 random letters from POUCH.

    As said POUCH is given and contains a distribution of Scrabble letters so that the player gets enough vowels (equally drawing A-Z makes it extremely hard because you need more vowels to make words):

    ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'C', 'C',
    'D', 'D', 'D', 'D', ...]
    
  • Ask the player to form a word with one or more of the 7 letters of the draw. Validate input for:

    1) all letters of word are in draw;
    2) word is in DICTIONARY.
    
  • Calculate the word value and show it to the player.

    To focus on this challenge we re-use two methods from the previous challenge for this: calc_word_value and max_word_value.

  • Calculate the optimal word (= max word value) checking all permutations of the 7 letters of the draw, cross-checking the DICTIONARY set for valid ones. This is a bit more advanced, but allows you to score the player (next).

  • Show the player what the optimal word and its value is.

  • Give the player a score based on the previous steps, basically: player_score / optimal_score.

Bonus (not required)

The optimal solution calculation might be a bit difficult for some, that's why we stop here. But if you are feeling creative you might consider expanding this game:

  • Keep scores in a shelve (file, db) and notify the player when a new record is reached.

  • Work with hints and bonuses: hints cost x points, give a bonus of y points, for example when a 7 letter word is created (complete draw exhausted).

  • Make a simple web, mobile app or pygame.

Good luck!

Remember: there is no best solution, only learning more and better Python.

Enjoy and we're looking forward reviewing on Friday all the cool / creative / Pythonic stuff you come up with.

Have fun!


Again to start coding fork our challenges repo or sync it.


About PyBites Code Challenges

More background in our first challenge article.