-
Notifications
You must be signed in to change notification settings - Fork 32
/
Snippet_CCS-09.py
147 lines (113 loc) · 4.74 KB
/
Snippet_CCS-09.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Import needed modules
import random
import re
from utilities import *
class CoffeeShopSimulator:
# Minimum and maximum temperatures
TEMP_MIN = 20
TEMP_MAX = 90
# Faux temp distributions. We'll do this better
# later with a bell curve, but for now a quick hack
def __init__(self, player_name, shop_name):
# Set player and coffee shop names
self.player_name = player_name
self.shop_name = shop_name
# Current day number
self.day = 1
# Cash on hand at start
self.cash = 100.00
# Inventory at start
self.coffee_inventory = 100
# Sales list
self.sales = []
# Possible temperatures
self.temps = self.make_temp_distribution()
def run(self):
print("\nOk, let's get started. Have fun!")
# The main game loop
running = True
while running:
# Display the day and add a "fancy" text effect
self.day_header()
# Get the weather
temperature = self.weather
# Display the cash and weather
self.daily_stats(temperature)
# Get price of a cup of coffee
cup_price = float(
prompt("What do you want to charge per cup of coffee?"))
# Get advertising spend
print("\nYou can buy advertising to help promote sales.")
advertising = prompt(
"How much do you want to spend on advertising (0 for none)?", False)
# Convert advertising into a float
advertising = convert_to_float(advertising)
# Deduct advertising from cash on hand
self.cash -= advertising
# Simulate today's sales
cups_sold = self.simulate(temperature, advertising, cup_price)
gross_profit = cups_sold * cup_price
# Display the results
print("You sold " + str(cups_sold) + " cups of coffee today.")
print("You made $" + str(gross_profit) + ".")
# Add the profit to our coffers
self.cash += gross_profit
# Subtract inventory
self.coffee_inventory -= cups_sold
# Before we loop around, add a day
self.increment_day()
def simulate(self, temperature, advertising, cup_price):
# Find out how many cups were sold
cups_sold = self.daily_sales(temperature, advertising)
# Save the sales data for today
self.sales.append({
"day": self.day,
"coffee_inv": self.coffee_inventory,
"advertising": advertising,
"temp": temperature,
"cup_price": cup_price,
"cups_sold": cups_sold
})
# We technically don't need this, but why make the next step
# read from the sales list when we have the data right here
return cups_sold
def make_temp_distribution(self):
# This is not a good bell curve, but it will do for now
# until we get to more advanced mathematics
temps = []
# First, find the average between TEMP_MIN and TEMP_MAX
avg = (self.TEMP_MIN + self.TEMP_MAX) / 2
# Find the distance between TEMP_MAX and the average
max_dist_from_avg = self.TEMP_MAX - avg
# Loop through all possible temperatures
for i in range(self.TEMP_MIN, self.TEMP_MAX):
# How far away is the temperature from average?
# abs() gives us the absolute value
dist_from_avg = abs(avg - i)
# How far away is the dist_from_avg from the maximum?
# This will be lower for temps at the extremes
dist_from_max_dist = max_dist_from_avg - dist_from_avg
# If the value is zero, make it one
if dist_from_max_dist == 0:
dist_from_max_dist = 1
# Append the output of x_of_y to temps
for t in x_of_y(int(dist_from_max_dist), i):
temps.append(t)
return temps
def increment_day(self):
self.day += 1
def daily_stats(self, temperature):
print("You have $" + str(self.cash) +
" cash on hand and the temperature is " + str(temperature) + ".")
print("You have enough coffee on hand to make " +
str(self.coffee_inventory) + " cups.\n")
def day_header(self):
print("\n-----| Day " + str(self.day) +
" @ " + self.shop_name + " |-----")
def daily_sales(self, temperature, advertising):
return int((self.TEMP_MAX - temperature) * (advertising * 0.5))
@property
def weather(self):
# Generate a random temperature between 20 and 90
# We'll consider seasons later on, but this is good enough for now
return random.choice(self.temps)