diff --git a/80 Slots/python/slots.py b/80 Slots/python/slots.py new file mode 100644 index 00000000..fbae665b --- /dev/null +++ b/80 Slots/python/slots.py @@ -0,0 +1,159 @@ +######################################################## +# +# 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 +# +######################################################## + +from random import choices +from collections import Counter +import sys + + +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.") + + +profits = 0 +keep_betting = True + +initial_message() +while keep_betting: + m = input_betting() + w = spin_wheels() + profits = adjust_profits(w, m, profits) + + print("Your standings are ${}".format(profits)) + answer = input("Again?") + + try: + if not answer[0].lower() == "y": + keep_betting = False + except IndexError: + keep_betting = False + +final_message(profits) + + +###################################################################### +# +# 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 +# +######################################################################