## Slots

### January 14, 2011

We played Hamurabi in a previous exercise. Today we will play the slot machines, using a version of the game from the same source as Hamurabi. Playing instructions and source code appear on the original pages or our copies.

Your task is to recreate the BASIC game. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.

Pages: 1 2 3 4

### 6 Responses to “Slots”

1. […] today’s Programming Praxis exercise, our goal is to create a game that simulates a slot machine. […]

2. My Haskell solution (see http://bonsaicode.wordpress.com/2011/01/14/programming-praxis-slots/ for a version with comments):

```import Control.Monad
import Data.List
import System.Random
import Text.Printf

pull :: Int -> IO Int
pull n = do ws <- replicateM 3 \$ randomRIO (0,5)
putStrLn . unwords \$ map (wheel !!) ws
result . group \$ sort ws where
wheel = words "BAR BELL ORANGE LEMON PLUM CHERRY"
result [[0,0,0]] = win "JACKPOT" 101
result [_]       = win "TOP DOLLAR" 11
result [[0,0],_] = win "DOUBLE BAR" 6
result [_,_]     = win "DOUBLE" 3
result _         = printf "YOU LOSE \$%d\n" n >> return (-n)
win msg d = printf "***%s***\nYOU WIN \$%d\n" msg (n*d) >> return (n*d)

prompt :: IO Int
prompt = do putStr "ENTER YOUR BET: "
maybe prompt check . maybeRead =<< getLine where
check bet | bet < 0   = prompt
| bet > 100 = putStrLn "HOUSE LIMIT \$100" >> prompt
| otherwise = return bet

main :: IO ()
main = instructions >> loop 0 where
instructions = putStrLn "WELCOME TO THE CASINO\n\
\BET IN INCREMENTS OF \$1 FROM \$1 TO \$100\n\
\BET \$0 WHEN YOU ARE FINISHED"
loop purse = prompt >>= \bet -> if bet == 0 then quit purse
else fmap (+ purse) (pull bet) >>= \n -> status n >> loop n
status n | n > 0     = printf "YOU HAVE \$%d\n" n
| n < 0     = printf "YOU OWE \$%d\n" (-n)
| otherwise = putStrLn "YOU ARE EVEN"
quit total | total > 0 = printf "COLLECT \$%d FROM THE CASHIER\n" total
| total < 0 = printf "PLACE \$%d ON THE KEYBOARD\n" (-total)
| otherwise = putStrLn "YOU BROKE EVEN"
```
3. Graham said

My Python solution. Like the Haskell above, I factored out the `_win```` procedure. I'm not terribly happy with the maze of ifs and elifs my code grew into, but it'll do.```

``` #!/usr/bin/env python from random import randrange WHEEL = ["BAR", "BELL", "ORANGE", "LEMON", "PLUM", "CHERRY"] def display_instructions(): print "WELCOME TO THE CASINO" print "BET IN INCREMENTS OF \$1 FROM \$1 TO \$100" print "BET \$0 WHEN YOU ARE FINISHED" return def pull(n): def _win(msg, d): print "***{0}***".format(msg) print "YOU WIN \${0}".format(n * d) return n * d x, y, z = randrange(6), randrange(6), randrange(6) print WHEEL[x], WHEEL[y], WHEEL[z] if x == y == z == 0: return _win("JACKPOT", 101) elif x == y == z: return _win("TOP DOLLAR", 11) elif x == y == 0 or x == z == 0 or y == z == 0: return _win("DOUBLE BAR", 6) elif x == y or x == z or y == z: return _win("DOUBLE", 3) else: print "YOU LOSE \${0}".format(n) return -n def play(): display_instructions() bet, purse = 1, 0 while bet != 0: bet = raw_input("ENTER YOUR BET:\t") try: bet = int(bet) except ValueError: continue if bet > 100: print "HOUSE LIMIT \$100" continue elif 1 <= bet <= 100: purse += pull(bet) if purse > 0: print "YOU HAVE \${0}".format(purse) elif purse < 0: print "YOU OWE \${0}".format(-purse) else: print "YOU ARE EVEN" if purse < 0: print "PLACE \${0} ON THE KEYBOARD".format(-purse) elif purse > 0: print "COLLECT \${0} FROM THE CASHIER".format(purse) else: print "YOU BROKE EVEN" return ```

```if __name__ == "__main__": play() ```

4. Graham said

Oh no! I had a couple typos (messed up closing the code tag, and extra ” in ) in the comment above. Apologies!

5. uberlazy said

Waddling through old code is fun, but I feel this exercise isn’t all it could have been. Slot machines are based on interesting statistical models that keep the game addictive while ensuring the House wins. In that vein, I modified the original task and created a weighted slot machine. I know it doesn’t earn me brownie points, but I hope someone finds it interesting or fun.

I also took the betting out of it so I can just hit the spin key mindlessly, like on a real machine :)

http://paste.lisp.org/display/119226

6. uberlazy said

… incidentally, selecting a random wheel stop is a variant of the algorithm for selecting fortunes from the exercise #192.