149 lines
3.5 KiB
Python
149 lines
3.5 KiB
Python
from enum import Enum
|
|
import datetime
|
|
import random
|
|
import math
|
|
|
|
# Use cent values instead of token floats
|
|
# Note: Could be set as launch args
|
|
BET_GREEN = 0
|
|
BET_RED = 30
|
|
BET_BLACK = 30
|
|
BET_BAIT = 10
|
|
|
|
MULTIPLIER_RED = 2.1
|
|
MULTIPLIER_BLACK = 2.1
|
|
MULTIPLIER_GREEN = 14.7
|
|
MULTIPLIER_BAIT = 7.0
|
|
|
|
balance = 0
|
|
loss_streak = 0
|
|
win_streak = 0
|
|
biggest_loss_streak = 0
|
|
biggest_win_streak = 0
|
|
is_last_roll_win = False
|
|
rolls = 0
|
|
real_time = 0
|
|
total_bet = 0
|
|
average_net = 0
|
|
|
|
|
|
class Hit(Enum):
|
|
GREEN = 0
|
|
BLACK = 1
|
|
RED = 2
|
|
BAIT = 3
|
|
|
|
@classmethod # Refer to https://onecompiler.com/javascript/42qq3ryft for logic
|
|
def roll_result(cls, index):
|
|
if index == 0:
|
|
return [cls.GREEN]
|
|
if index == 1:
|
|
return [cls.BAIT, cls.RED]
|
|
if index <= 7:
|
|
return [cls.RED]
|
|
if index == 8:
|
|
return [cls.BAIT, cls.BLACK]
|
|
return [cls.BLACK]
|
|
|
|
@classmethod
|
|
def get_multiplier(cls, hit):
|
|
return globals()["MULTIPLIER_" + hit.name]
|
|
|
|
|
|
def run_simulation():
|
|
|
|
payouts = Hit.roll_result(roll())
|
|
difference = pay_out(payouts)
|
|
update_statistics(difference)
|
|
print_statistics()
|
|
|
|
|
|
def roll():
|
|
return random.randint(0, 14) # Modulo of 15 rolls over at 15
|
|
|
|
|
|
def pay_out(payout_enum_array):
|
|
global total_bet
|
|
income = 0
|
|
for payout in payout_enum_array:
|
|
multiplier = Hit.get_multiplier(payout)
|
|
bet_amount = globals()["BET_" + payout.name]
|
|
income += calculate_payout(bet_amount, multiplier)
|
|
return income - total_bet
|
|
|
|
|
|
def calculate_payout(bet, multiplier):
|
|
return math.floor(bet * multiplier)
|
|
|
|
|
|
def update_statistics(difference):
|
|
global balance
|
|
balance += difference
|
|
update_roll_statistics()
|
|
update_streak_statistics(difference)
|
|
update_average_statistic(difference)
|
|
|
|
|
|
def update_roll_statistics():
|
|
global rolls, real_time
|
|
rolls += 1
|
|
real_time = datetime.timedelta(seconds=rolls * 15)
|
|
|
|
|
|
def update_streak_statistics(difference):
|
|
global loss_streak, win_streak, biggest_loss_streak, biggest_win_streak
|
|
if difference < 0: # Loss
|
|
loss_streak += difference
|
|
abs_loss_streak = abs(loss_streak)
|
|
if abs_loss_streak > biggest_loss_streak:
|
|
biggest_loss_streak = abs_loss_streak
|
|
win_streak = 0
|
|
else: # Win
|
|
win_streak += difference
|
|
if win_streak > biggest_win_streak:
|
|
biggest_win_streak = win_streak
|
|
loss_streak = 0
|
|
|
|
|
|
def update_average_statistic(difference):
|
|
global rolls, average_net, total_bet
|
|
net = difference + total_bet
|
|
average_net = average_net + ((net - average_net) / rolls)
|
|
|
|
|
|
def print_statistics():
|
|
global total_bet, rolls, real_time, balance, biggest_loss_streak, biggest_win_streak
|
|
message = (
|
|
"\rTotal bet: "
|
|
+ str(total_bet / 100.0)
|
|
+ "; Average net: "
|
|
+ str(int(average_net) / 100.0)
|
|
+ "; Loss streak: "
|
|
+ str(biggest_loss_streak / 100.0)
|
|
+ "; Win streak: "
|
|
+ str(biggest_win_streak / 100.0)
|
|
+ "; Rolls: "
|
|
+ str(rolls)
|
|
+ "; Real time: "
|
|
+ str(real_time).ljust(18)
|
|
+ "; Balance: "
|
|
+ str(balance / 100.0)
|
|
)
|
|
print(message, end="")
|
|
|
|
|
|
def set_total_bet():
|
|
global total_bet
|
|
total_bet = BET_GREEN + BET_BLACK + BET_RED + BET_BAIT
|
|
|
|
|
|
while True:
|
|
if BET_GREEN and BET_RED and BET_BLACK:
|
|
print("Bet not allowed (arbitrary site restriction)!")
|
|
quit()
|
|
set_total_bet()
|
|
try:
|
|
run_simulation()
|
|
except KeyboardInterrupt:
|
|
quit()
|