182 lines
12 KiB
Python
182 lines
12 KiB
Python
import menu #Importierung der Menu.py Datei im Game folder
|
|
import random
|
|
|
|
class coin_multiplier(): #Klasse, die das Upgrade darstellt, welches die anzahl des Bonusses beim Kopfwurf veraendert
|
|
def __init__(self, multiplier:float, cost:int):
|
|
self.multiplier = multiplier
|
|
self.cost = cost
|
|
|
|
class flip_chance(): #Upgrade, welches die Chance auf kopf veraendert
|
|
def __init__(self, chance:int, cost:int):
|
|
self.chance = chance
|
|
self.cost = cost
|
|
|
|
class lucky_coin(): #Upgrade, welches festlegt wie hoch die Wahrscheinlichkeit auf einen LuckyCoin (Jackpot) ist
|
|
def __init__(self, chance:float, cost:int):
|
|
self.chance = chance
|
|
self.cost = cost
|
|
|
|
def main_game(): #Funktion die Basiswerte angibt und einen game loop erstellt. Sie prueft, ob der gameloop beendet oder neugestartet werden soll
|
|
while True:
|
|
wealth = 1 #Festlegung des Basis Guthabens
|
|
coins_per_head = 0.5 #Festlegung des Standartmaessigen Coin Boosters
|
|
heads_amount = 1 #Anzahl der Standartmaessigen kopfwuerfe (wird im Laufe des Spiels veraendert)
|
|
|
|
reset_upgrades() #Funktion zur Festlegung der Standartattribute der Upgrade Klassen
|
|
|
|
state = coin_flip(wealth,coins_per_head,heads_amount) #Ueberpruefung, ob das die Funktion coin_flip() 'RESTART' oder 'EXIT' ausgibt
|
|
|
|
if state == 'RESTART': #Wenn 'RESTART' ausgegeben wird beginnt die schleife von Vorne ---> Attribute und Spielwerte werden wieder auf Standarteinstellung zurueckgesetzt: Programm startet neu
|
|
print('Alles Klar das Spiel wird jetzt neu gestartet')
|
|
input()
|
|
continue
|
|
elif state == 'EXIT': #Wenn 'EXIT' ausgegeben wird, wird der Gameloop der Funktion unterbrochen ---> Spiel bricht ab bzw. wird beendet
|
|
print('DANKE FUERS SPIELEN :)')
|
|
input()
|
|
break
|
|
|
|
def coin_flip(wealth, coins_per_head, heads_amount): #Funktion fuer die Grundmechanik des Spiels (Kopf oder Zahl)
|
|
while True:
|
|
result = random.randint(0, 100) #Generiert eine zufaellige Zahl zwischen 1 und 100
|
|
if result in range(0,base_lvl_flip_chance.chance): #Wenn die Zahl kleiner als die, in den Upgrades festgelegte Wahrscheinlichkeit fuer den Kopfwurf (10%) ist
|
|
print(f'Kopf ({heads_amount}x)') #Gibt die Anzahl an geworfenen Koepfen aus
|
|
heads_amount += 1 #Anzahl an hintereinander geworfenen "Köpfen" wird eine Einheit hinzugefuegt
|
|
game_state = end_game(heads_amount) #Die Variable game_state wird mit der Ausgabe der Funktion end_game definiert
|
|
if game_state: #game_state ist entweder 'RESTART', 'EXIT', oder None ---> alles True ausser None=False ---> Bedingung wird nicht ausgefuehrt (game_state wird nicht returned). Bei 'RESTART' oder 'EXIT': game_state wird returned als 'RESTART' oder 'Exit'
|
|
return game_state
|
|
if heads_amount >=3: #Wenn 2 Mal hintereinander (also 3 mal) Kopf geworden wird
|
|
coins_per_head += base_lvl_coin_multiplier.multiplier #Coin-Boost für mehrfaches werfen von Kopf hintereinander (Abhaengig vom Upgrade Attribut multiplier der Klasse coin_multiplier())
|
|
else:
|
|
coins_per_head = 0.5 #Falls es nicht der Fall ist bekommt man pro Kopf Wurf 0.5 Coins
|
|
wealth += coins_per_head
|
|
print('')
|
|
print(f'Du hast {wealth} Coins (+ {coins_per_head})') #Zwischenstand des Kontostands wird ausgegeben
|
|
answer = input() #Die Antowort wird in der Variable Answer gespeichert
|
|
wealth = check_lucky_coin(result, wealth) #Die Funktion ueberprueft, ob die, in Zeile 40 generierte, Zahl in dem Wahrscheinlichkeitsbereich des Lucky Coin Events liegt
|
|
try: #Probiert aus
|
|
answer = int(answer)#prueft, ob die Eingabe eine Zahl ist und 4 ist
|
|
if answer == 4:
|
|
wealth = homepage_upgrades(wealth) #Leitet auf die Homepage-Seite der Upgrades ueber
|
|
else:
|
|
continue #Schleife wird fortgesetzt ---> Ueberleitung zu Kopf/Zahl
|
|
except ValueError: #Wenn es einen Widerspruch bzw ValueError entsteht
|
|
continue #Schleife wird fortgesetzt ---> Ueberleitung zu Kopf/Zahl
|
|
elif result in range(base_lvl_flip_chance.chance,100): #Wenn die Zufallsgenerierte Zahl zwischen der, in der flip_chance() festgelegten chance Attribut, Zahl und 100 liegt
|
|
print('Zahl')
|
|
heads_amount = 1 #Die Streak wird wieder auf 1 also fuer den Spieler 0 zurueckgesetzt
|
|
answer = input()
|
|
wealth = check_lucky_coin(result, wealth) #Wird erneut auf das Lucky Coin Event geprueft
|
|
try: #Erneut das Gleiche wie von Zeile 56-63
|
|
answer = int(answer)
|
|
if answer == 4:
|
|
wealth = homepage_upgrades(wealth)
|
|
else:
|
|
continue
|
|
except ValueError:
|
|
continue
|
|
wealth = check_lucky_coin(result,wealth) #Wahrscheinlich unnoetig dient aber zur Ueberpruefung auf Lucky Coin auch am Ende der Schleife
|
|
|
|
def reset_upgrades(): #Festlegung der Basiswerte fuer alle Upgrades
|
|
global base_lvl_coin_multiplier
|
|
global base_lvl_flip_chance
|
|
global base_lvl_lucky_coin
|
|
|
|
base_lvl_coin_multiplier = coin_multiplier(0.5, 10) #Definiert den Coin Boost (0.5 Coins) und die Kosten (10 Coins)
|
|
base_lvl_flip_chance = flip_chance(5, 1) #Definiert die Ausgangschance auf Kopf (5%) und Die Kosten (1 Coin)
|
|
base_lvl_lucky_coin = lucky_coin(0.5, 10) #Definiert die Ausgangschance fuer Lucky Coin (0.5%) und die Kosten (10 Coins)
|
|
|
|
def lvl_up_multiplier(): #Funktion, um den Coin Boost zu erhoehen
|
|
lvl_up = True
|
|
|
|
if lvl_up == True:
|
|
base_lvl_coin_multiplier.cost *= 5 #Die Kosten werden beim Ausfuehren ver-2.5-facht und neu damit definiert
|
|
base_lvl_coin_multiplier.multiplier *= 5 #Der Boost wird ver-5-facht und neu definiert
|
|
#print(f' CM: {base_lvl_coin_multiplier.cost}')
|
|
print(f' \nCoin Multiplier liegt bei: {base_lvl_coin_multiplier.multiplier}\n') #Gibt einen Zwischenstand des Wertes aus
|
|
|
|
def lvl_up_flip_chance(): #Funktion, um die Chance auf einen Kopfwurf zu erhoehen
|
|
lvl_up = True
|
|
|
|
if lvl_up == True:
|
|
base_lvl_flip_chance.cost *= 20 #In der base_lvl_flip_chance Variable nach der Klasse flip_chance() wird der cost Attribut verzehnfacht ---> zahnfache Kosten
|
|
base_lvl_flip_chance.chance *= 2 #Die Chance auf Kopf wird verdoppelt
|
|
#print(f" FC Cost: {base_lvl_flip_chance.cost}")
|
|
print(f" \nFlip Chance liegt bei: {base_lvl_flip_chance.chance}%\n") #Die neue Chance auf Kopf wird ausgegeben
|
|
|
|
def lvl_up_lucky_coin(): #Funktion, um die Chance auf den Lucky Coin zu erhoehen
|
|
lvl_up = True
|
|
|
|
if lvl_up == True:
|
|
base_lvl_lucky_coin.cost *= 10 #Die costen werden verdreifacht
|
|
base_lvl_lucky_coin.chance *= 1.5 #Die Chancen auf den Luckycoin werden ver 1.5 facht
|
|
#print(f" Lucky Coin Cost: {base_lvl_lucky_coin.cost}")
|
|
print(f" \nLucky Coin Chance liegt bei: {base_lvl_lucky_coin.chance}%\n") #Die neue Chance auf den Lucky Coin wird ausgegeben
|
|
|
|
def homepage_upgrades(wealth): #Funktion, die die Upgrade Hompage erstellt
|
|
while True:
|
|
print(f'Du hast {wealth} Coins\n')
|
|
answer = input(f' Flip Chance [{base_lvl_flip_chance.chance}% > {base_lvl_flip_chance.chance*2}%] (Preis: {base_lvl_flip_chance.cost} Coins): [1]\n Lucky Coin [{base_lvl_lucky_coin.chance}% > {base_lvl_lucky_coin.chance*1.5}%] (Preis: {base_lvl_lucky_coin.cost} Coins): [2]\n Multiplier [+{base_lvl_coin_multiplier.multiplier} Coins > {base_lvl_coin_multiplier.multiplier*5} Coins] (Preis: {base_lvl_coin_multiplier.cost} Coins): [3]\n Zum Game: [4]') #Speichert input in einer variable answer. Angabe von Effekten den Upgrades. Also was upgraded es
|
|
try:
|
|
answer = int(answer) #Testet ob die Eingabe eine Zahl ist
|
|
if answer == 1:
|
|
if wealth >= base_lvl_flip_chance.cost: #Wenn der Kontostand (wealth) groesser bzw. gleich ist wie die Kosten fuer das Upgrade (Chance auf Kopf)
|
|
wealth -= base_lvl_flip_chance.cost #Die Kosten werden vom Kontostand abgezogen und der Kontostand wird mit seinem neuen Wert in der Variable wealth gespeichert (also geupdated)
|
|
lvl_up_flip_chance() #Die Chance auf Kopf wird um ein Level erhoeht
|
|
print(f' Erfolgreich geupgradet. Du hast noch {wealth} Coins\n') #Neuer Kontostand wird ausgegeben
|
|
|
|
else:
|
|
print()
|
|
print('Du bist zu arm\n') #Falls die Bedingung nicht erfuellt wird, wird die Schleife weiterhin ausgefuehrt + Hinweis auf zu geringen Kontostand
|
|
|
|
elif answer == 2: #Wenn die Antwort 2 ist geschieht das gleiche wie von Zeile 121-124 nur mit der Chance und den Kosten des Lucky Coin Upgrades
|
|
if wealth >= base_lvl_lucky_coin.cost:
|
|
wealth -= base_lvl_lucky_coin.cost
|
|
lvl_up_lucky_coin()
|
|
print(f' Erfolgreich geupgradet. Du hast noch {wealth} Coins\n')
|
|
else:
|
|
print()
|
|
print('Du bist zu arm\n')
|
|
|
|
elif answer == 3: #Wenn die Antwort 3 ist geschieht das gleiche wie von Zeile 121-124 nur mit der Anzahl an Bonuscoins und den Kosten des Bonus-Upgrades
|
|
if wealth >= base_lvl_coin_multiplier.cost:
|
|
wealth -= base_lvl_coin_multiplier.cost
|
|
lvl_up_multiplier()
|
|
print(f' Erfolgreich geupgradet. Du hast noch {wealth} Coins\n')
|
|
else:
|
|
print('\nDu bist zu arm\n')
|
|
elif answer == 4: #Wenn die Eingabe 4 ist wird der neue Wert der Variable auf Globaler Ebene aus der Funktion ausgegeben ---> Globales Update des Kontostandes
|
|
return wealth
|
|
|
|
elif answer not in (1, 2, 3, 4): #Wenn die Antwort eine andere Zahl als 1, 2, 3, 4 ist, wird ausgegeben, dass nur diese Zahlen moeglich sind
|
|
print('Bitte 1, 2, 3 oder 4!')
|
|
|
|
except ValueError: #Falls ein ValueError kommt, wird er abgefangen, der Benutzer aufgefordert nur Zahlen einzugeben und die Eingabemoeglichkeit wiederholt
|
|
print('\nNur Zahlen\n')
|
|
input()
|
|
|
|
def check_lucky_coin(result, wealth): #Funktion, die Ueberprueft, ob der Lucky Coin getriggert wird ---> JACKPOT
|
|
if result < base_lvl_lucky_coin.chance or result == base_lvl_lucky_coin.chance: #Wenn die, in Zeile 40 bestimmte, Variable result kleiner ist, als die Chance des Lucky coins ist, bzw. gleich ist, wird der Kontostand verdoppelt
|
|
print('\nHerzlichen Glueckwunsch! Du hast den Lucky Coin bekommen\n')
|
|
wealth *= 2
|
|
print(f'Kontostand: {wealth} Coins')
|
|
return wealth #Der Funktionswert fuer den Kontostand wealth wird global gespeichert
|
|
|
|
def end_game(heads_amount): #Funktion, die ueberprueft, ob das Spiel zuende ist
|
|
if heads_amount == 11: #Wenn 10 mal hintereinander das Ergebnis 'Kopf' kommt wird das folgende ausgefuehrt
|
|
print('GLUECKWUNSCH! Du hast das Spiel durchgespielt :)\nDruecke [1] um ein NEUES SPIEL zu starten\nDruecke [2] um das Spiel zu BEENDEN')
|
|
while True:
|
|
answer = input() #Eingabe wird in der lokalen Variable answer gespeichert
|
|
try:
|
|
answer = int(answer) #Testet ob answer eine Zahl ist
|
|
if answer == 1:
|
|
return 'RESTART' #Wenn die Eingabe 1 ist wird der Funktionswert 'RESTART' ausgegeben, welcher in der coin_flip() funktion verwendet wird und in der main_game() funktion als anhaltspunkt genutzt wird, um zu entscheiden, ob das Spiel neugestartet werden soll
|
|
elif answer == 2:
|
|
return 'EXIT' #Wenn die Eingabe 2 ist wird der Funktionswert 'EXIT' ausgegeben, welcher in der coin_flip() funktion verwendet wird und in der main_game() funktion als anhaltspunkt genutzt wird, um zu entscheiden, beendet werden soll
|
|
else:
|
|
print('Nur [1] oder [2] du Schlingel') #Wenn die Eingabe eine andere Zahl ist wird folgendes ausgegeben
|
|
except ValueError: #Wenn ein ValueError auftritt wird er abgefangen ---> Eingabe ist etwas anderes als ein Integer(Ganze Zahl)
|
|
print('Du kannst nur [1] oder [2] eingeben du Sack')
|
|
|
|
|
|
|
|
main_game() #Die Funktion, die das Spiel ausfuehrt wird aufgerufen, damit das Programm ueberhaupt ausgefuehrt wird |