Files
basic-computer-games/80_Slots/python/slots.py
Martin Thoma 8495e59a8f Python: Make code testable
Avoid executing code on module level as this prevents importing the
module for testing. Especially infinite loops are evil.
2022-03-19 09:54:52 +01:00

164 lines
4.6 KiB
Python

########################################################
#
# Slots
#
# From Basic Computer Games (1978)
#
# "The slot machine or one-arm bandit is a mechanical
# device that will absorb coins just about as fast as
# you can feed it. After inserting a coin, you pull a
# handle that sets three indepent reels spining. If the
# reels stop with certain symbols appearing in the pay
# line, you get a certain payoff. The original slot
# machine, called the Liberty bell, was invented in 1895
# by Charles Fey in San Francisco. Fey refused to sell
# or lease the manufacturing rights, so H.S. Mills in
# Chicago built a similar, but much improved, machine
# called the Operators Bell. This has survived nearly
# unchanged to today.
# On the operators Bell and other standard slot
# machines, there are 20 symbols on each wheel but they
# are not distributed evenly among the objects(cherries,
# bar, apples, etc). Of the 8000 possible combinations,
# the expected payoff(to the player) is 7049 or $89.11
# for every $100.00 put in, one of the lowest expected
# payoffs of all casino games.
# In the program here, the payoff is considerably more
# liberal; indeed it appears to favor the player by 11%
# -- i.e., an expected payoff of $111 for each $100 bet."
# The program was originally written by Fred Mirabelle
# and Bob Harper
#
########################################################
import sys
from collections import Counter
from random import choices
def initial_message():
print(" " * 30 + "Slots")
print(" " * 15 + "Creative Computing Morrison, New Jersey")
print("\n" * 3)
print("You are in the H&M Casino, in front of one of our")
print("one-arm Bandits. Bet from $1 to $100.")
print("To pull the arm, punch the return key after making your bet.")
def input_betting():
print("\n")
b = -1
while b < 1 or b > 100:
try:
b = int(input("Your bet:"))
except ValueError:
b = -1
if b > 100:
print("House limits are $100")
elif b < 1:
print("Minium bet is $1")
beeping()
return int(b)
def beeping():
# Function to produce a beep sound.
# In the original program is the subroutine at line 1270
for _ in range(5):
sys.stdout.write("\a")
sys.stdout.flush()
def spin_wheels():
possible_fruits = ["Bar", "Bell", "Orange", "Lemon", "Plum", "Cherry"]
wheel = choices(possible_fruits, k=3)
print(*wheel)
beeping()
return wheel
def adjust_profits(wheel, m, profits):
# we remove the duplicates
s = set(wheel)
if len(s) == 1:
# the three fruits are the same
fruit = s.pop()
if fruit == "Bar":
print("\n***Jackpot***")
profits = ((100 * m) + m) + profits
else:
print("\n**Top Dollar**")
profits = ((10 * m) + m) + profits
print("You Won!")
elif len(s) == 2:
# two fruits are equal
c = Counter(wheel)
# we get the fruit that appears two times
fruit = sorted(c.items(), key=lambda x: x[1], reverse=True)[0][0]
if fruit == "Bar":
print("\n*Double Bar*")
profits = ((5 * m) + m) + profits
else:
print("\nDouble!!")
profits = ((2 * m) + m) + profits
print("You Won!")
else:
# three different fruits
print("\nYou Lost.")
profits = profits - m
return profits
def final_message(profits):
if profits < 0:
print("Pay up! Please leave your money on the terminal")
elif profits == 0:
print("Hey, You broke even.")
else:
print("Collect your winings from the H&M cashier.")
def main():
profits = 0
keep_betting = True
initial_message()
while keep_betting:
m = input_betting()
w = spin_wheels()
profits = adjust_profits(w, m, profits)
print(f"Your standings are ${profits}")
answer = input("Again?")
try:
if not answer[0].lower() == "y":
keep_betting = False
except IndexError:
keep_betting = False
final_message(profits)
if __name__ == "__main__":
main()
######################################################################
#
# Porting notes
#
# The selections of the fruits(Bar, apples, lemon, etc.) are made
# with equal probability, accordingly to random.choices documentation.
# It could be added a weights list to the function and therefore
# adjust the expected payoff
#
######################################################################