######################################################## # # 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 # ######################################################################