mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 15:16:33 -08:00
165 lines
4.7 KiB
Python
165 lines
4.7 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
|
|
from typing import List
|
|
|
|
|
|
def initial_message() -> None:
|
|
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() -> int:
|
|
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() -> None:
|
|
# 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() -> List[str]:
|
|
possible_fruits = ["Bar", "Bell", "Orange", "Lemon", "Plum", "Cherry"]
|
|
wheel = choices(possible_fruits, k=3)
|
|
|
|
print(*wheel)
|
|
beeping()
|
|
|
|
return wheel
|
|
|
|
|
|
def adjust_profits(wheel: List[str], m: int, profits: int) -> int:
|
|
# 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: int) -> None:
|
|
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() -> None:
|
|
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 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
|
|
#
|
|
######################################################################
|