A hand has a point value, based on the mixture of
Set
s. This point value is used to resolve the
amount owed to the winner by the losers in the game. There is a subtlety
to this evaluation that we have to gloss over, and that is the rules
about for concealed and
exposed or melded sets.
For now, we will assume that all sets are concealed.
We need to expand our definition of
SuitTile
. There are two different score values
for SuitTile
s: the terminals (one and nine) have
one score, and the simples (two through eight) have a different score.
This will lead to two subclasses of SuitTile
:
TerminalSuitTile
and
SimpleSuitTile
.
A winning hand has a base value of 20 points plus points assigned
for each of the four scoring sets and the pair.
Set |
Simples |
Terminals or Honors |
SequenceSet
|
0 |
0 |
ThreeSet
|
4 |
8 |
FourSet
|
16 |
32 |
The PairSet
is typically worth zero points.
However, the following kinds of pairs can add points to a hand.
-
A pair of dragons is worth 2 points.
-
A pair of winds associated with your seat at the table is
worth 2 points.
-
A full game consists of four rounds. Each round has a
prevailing wind. Within each round, each of
the players will be the dealer. A pair of the round's prevailing
winds is worth 2 points.
-
A double wind pair occurs when your
seat's wind is also the prevailing wind. A pair of this wind is
worth 4 points.
There are a few more ways to add points, all related to the
mechanics of play, not to the hand itself.
Update the Tile Class Hierarchy. You will need to add two new subclass of
SuitTile
:
TerminalSuitTile
and
SimpleSuitTile
.
You will need to add a simple
method to the
Tile
class which returns
False
. The SimpleSuitTile
(ranks 2 to 8), however, will override this method to return
True
.
You will need to add a
lucky
(
prevalingWind
,
myWind
) method to the
Tile
class which returns
False
. The HonorsTile
will
override this method to return True
if the name is a
dragon ("Red", "Green" or "White") or
prevalingWind
or
myWind
.
You will want to upgrade Wall
to correctly
generate the various HonorsTile
,
TerminalSuitTile
and
SimpleSuitTile
instances.
You may also want to create a
Generator
for tiles. A function similar to the
following can make programs somewhat easier to read.
def tile( *args ):
"""tile(name) -> HonorsTile
tile( rank, suit ) -> SuitTile
"""
if len(args) == 1:
return HonorsTile( *args )
elif args[0] in ( 1, 9 ):
return TerminalSuitTile( *args )
else:
return SimpleSuitTile( *args )
Update the Set Class Hierarchy. You can then add a
points
(
prevailingWind
,
myWind
) to the
Set
class hierarchy. This function will examine
the first Tile
of the
Set
to see if it is simple
or not, and return the proper number of points. The wind isn't used
for most Set
s.
In the case of PairSet
, however, the first
Tile
must be checked against two rules. If
prevailingWind
is the same as
myWind
and the same as the tile's name, this
is worth 4 points. If the tile's lucky
method is
True
(a dragon, or one of the two winds), then the
value is 2 points.
Update the Hand Class. You'll want to add a points
function which
computes the total number of points for a hand. You may also want to
write a pointReport
which prints a small
scorecard for the hand, showing each set and the points
awarded.
You will want to revise your unit tests, also, to reflect these
changes. You'll also need to add additional unit tests to check the
number of points in each hand.
For the first test cases in the previous the section called “Some Test Cases”, here are the scores.
Set |
Points |
Winning |
20 |
ThreeSet['2B', '2B', '2B'] |
4 |
StraightSet['3B', '4B', '5B'] |
0 |
PairSet['5B', '5B'] |
0 |
ThreeSet['2D', '2D', '2D'] |
4 |
ThreeSet['Green', 'Green', 'Green'] |
8 |
Points |
36 |
For the second test cases in the section called “Some Test Cases”, here are the scores.
Set |
Points |
Winning |
20 |
ThreeSet['2B', '2B', '2B'] |
4 |
StraightSet['3B', '4B', '5B'] |
0 |
PairSet['5B', '5B'] |
0 |
ThreeSet['2D', '2D', '2D'] |
4 |
StraightSet['2D', '3D', '4D'] |
0 |
Points |
28 |
Be sure to add a test case with lucky tiles
(dragons or winds) as the pair.