This challenge write-up first appeared on PyBites.
This week, each one of you has a homework assignment ... - Tyler Durden (Fight club)
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
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
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.
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.
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.
More background in our first challenge article.