9.12: Exercises
- Page ID
- 17118
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)
Exercise \(\PageIndex{1}\)
The following are the possible hands in poker, in increasing order of value (and decreasing order of probability):
- pair:
- two cards with the same rank
- two pair:
- two pairs of cards with the same rank
- three of a kind:
- three cards with the same rank
- straight:
- five cards with ranks in sequence (aces can be high or low, so
Ace-2-3-4-5
is a straight and so is10-Jack-Queen-King-Ace
, butQueen-King-Ace-2-3
is not.) - flush:
- five cards with the same suit
- full house:
- three cards with one rank, two cards with another
- four of a kind:
- four cards with the same rank
- straight flush:
- five cards in sequence (as defined above) and with the same suit
The goal of these exercises is to estimate the probability of drawing these various hands.
- Download the following files from http://thinkpython.com/code:
- Card.py
- : A complete version of the
Card
,Deck
andHand
classes in this chapter. - PokerHand.py
- : An incomplete implementation of a class that represents a poker hand, and some code that tests it.
- If you run
PokerHand.py
, it deals seven 7-card poker hands and checks to see if any of them contains a flush. Read this code carefully before you go on. - Add methods to
PokerHand.py
namedhas_pair
,has_twopair
, etc. that return True or False according to whether or not the hand meets the relevant criteria. Your code should work correctly for “hands” that contain any number of cards (although 5 and 7 are the most common sizes). - Write a method named
classify
that figures out the highest-value classification for a hand and sets thelabel
attribute accordingly. For example, a 7-card hand might contain a flush and a pair; it should be labeled “flush”. - When you are convinced that your classification methods are working, the next step is to estimate the probabilities of the various hands. Write a function in
PokerHand.py
that shuffles a deck of cards, divides it into hands, classifies the hands, and counts the number of times various classifications appear. - Print a table of the classifications and their probabilities. Run your program with larger and larger numbers of hands until the output values converge to a reasonable degree of accuracy. Compare your results to the values at http://en.Wikipedia.org/wiki/Hand_rankings.
Exercise \(\PageIndex{2}\)
This exercise uses TurtleWorld from Chapter 4. You will write code that makes Turtles play tag. If you are not familiar with the rules of tag, see http://en.Wikipedia.org/wiki/Tag_(game).
- Download http://thinkpython.com/code/Wobbler.py and run it. You should see a TurtleWorld with three Turtles. If you press the Run button, the Turtles wander at random.
- The
step
method gets invoked by TurtleWorld. It invokessteer
, which turns the Turtle in the desired direction,wobble
, which makes a random turn in proportion to the Turtle’s clumsiness, andmove
, which moves forward a few pixels, depending on the Turtle’s speed. - Create a file named
Tagger.py
. Import everything fromWobbler
, then define a class namedTagger
that inherits fromWobbler
. Callmake_world
passing theTagger
class object as an argument. - Add a
steer
method toTagger
to override the one inWobbler
. As a starting place, write a version that always points the Turtle toward the origin. Hint: use the math functionatan2
and the Turtle attributesx
,y
andheading
. - Modify
steer
so that the Turtles stay in bounds. For debugging, you might want to use the Step button, which invokesstep
once on each Turtle. - Modify
steer
so that each Turtle points toward its nearest neighbor. Hint: Turtles have an attribute,world
, that is a reference to the TurtleWorld they live in, and the TurtleWorld has an attribute,animals
, that is a list of all Turtles in the world. - Adjust the rules and your
steer
method for good quality play; for example, it should be possible for the slow Turtle to tag the faster Turtles eventually.
- Solution: