Home

Scrabble

Scrabble

You probably know the game of Scrabble. It uses tiles marked with the 26 letters of the Roman alphabet. Each letter has a value, shown in the following map:
val letterValues = scala.collection.immutable.Map(
  'A'-> 1, 'B'-> 3, 'C'-> 3, 'D'-> 2, 'E'-> 1, 'F'-> 4, 
  'G'-> 2, 'H'-> 4, 'I'-> 1, 'J'-> 8, 'K'-> 5, 'L'-> 1, 
  'M'-> 3, 'N'-> 1, 'O'-> 1, 'P'-> 3, 'Q'-> 10, 'R'-> 1, 
  'S'-> 1, 'T'-> 1, 'U'-> 1, 'V'-> 4, 'W'-> 4, 'X'-> 8, 
  'Y'-> 4, 'Z'-> 10)
Players have to form words. Words are valid according to certain rules. We will use the official word list for North American scrabble, which you can download as a text file scrabble.txt.

The score of a word is simply the sum of the values of the letters of the word.

Your task is to implement a game inspired by the rules of Scrabble, but without using the Scrabble board. In each round of the game, you receive a hand of HAND letter tiles. (You can think about the case HAND = 7 as in Scrabble.) Your task is to form words from these tiles.

Here is an example run of the game:

Welcome to KAIST Scrabble!

Here is your hand:  A E F G H L L 

Enter your word: HEAL
HEAL is a good word and scores 7 points

You have these letters left: F G L

Enter your word: GIRL
You cannot make GIRL with your hand.

You have these letters left: F G L

Enter your word:

Your total score was 7 points.

Would you like to play again? y

Here is your hand: A A C I O P T

Enter your word: TAPIOCA
TAPIOCA is a good word and scores 11 points.

Your total score was 61 points.

Would you like to play again? y

Here is your hand: C E E F I P Z

Enter your word: CEEF
CEEF is not a word.  Try again!

You have these letters left: C E E F I P Z

Enter your word: PIECE
PIECE is a good word and scores 9 points

You have these letters left: F Z

Enter your word:

Your total score was 9 points.

Would you like to play again? n

Good bye!

In every round, the computer deals you a hand of HAND letter tiles (HAND must be a parameter defined at the top of your program). It does this as follows: The first HAND / 3 (integer division) tiles are vowels, chosen randomly (with replacement) from the set A E I O U. The remaining tiles are chosen from the set of all 26 letters, again randomly with replacement.

(Bonus: If you want, you can instead deal a hand by sampling randomly without replacement from a bag of Scrabble tiles as they appear in a real Scrabble game—see the picture below.)

Scrabble tiles

The computer then waits for you to enter a word:
Enter your word:

If the word entered is not in the offical Scrabble list, the computer refuses it:

Enter your word: CEEF
CEEF is not a word.  Try again!

If you don't have the tiles to make the word, the computer refuses it:

Enter your word: GIRL
You cannot make GIRL with your hand.

If the word is accepted, the computer computes the score of the word, displays it, and shows you the letters you have left:

Enter your word: PIECE
PIECE is a good word and scores 9 points

If there are any tiles left, you can then try to enter another word:

You have these letters left: C E E F I P Z

Enter your word: 

If you cannot form another word, you can just press Enter. This means that your round has ended. (The round ends automatically when you have no tiles left.)

The computer displays the total score of all your words:

Your total score was 9 points.

Would you like to play again? 

If you enter a question mark ? instead of a word, then the computer will display all words that can be made using your letters, and display them together with their scores, sorted by decreasing score:

Here is your hand: A D G I J R X 

Enter your word: ?
13 RADIX
11 JIG
11 JAG
10 RAX
10 RAJ
10 JAR
 9 XI
 9 AX
 6 GRID
 6 GRAD
 6 GIRD
 6 GADI
 6 DRAG
 5 RAID
 5 RAGI
 5 GID
 5 GAD
 5 DIG
 5 DAG
 5 ARID
 4 RIG
 4 RID
 4 RAG
 4 RAD
 4 GAR
 4 AID
 3 RIA
 3 RAI
 3 ID
 3 AIR
 3 AG
 3 AD
 2 AR
 2 AI

You have these letters left: A D G I J R X 

Enter your word:

If you manage to use all letters in your hand in the first go, then you receive 50 extra points (see TAPIOCA in the example run).