Index: bunco.py
==================================================================
--- bunco.py
+++ bunco.py
@@ -1,7 +1,7 @@
# Test
-import csv, random
+import csv, random, sqlite3
teammate_lookup = { 0: 2, 1: 3, 2: 0, 3: 1 }
def TurnInProgress():
return -1
@@ -12,11 +12,10 @@
dice.append(random.randint(1,6))
return dice
class Player:
fuzzydie_holder = None
- current_round = 1
def __init__(self, name, dex, math, speed):
self.name = name
self.dex = dex
self.math_comprehension = math
@@ -44,11 +43,11 @@
self.personal_roll_scores.append(0)
self.turn_progress = 0
self.current_streak = 0
def score_last_roll(self):
- desired_num = self.current_round % 6
+ desired_num = Game.current_round() % 6
desired_num = 6 if desired_num == 0 else desired_num
roll_score = 0
if all(die == desired_num for die in self.current_roll):
@@ -62,20 +61,21 @@
roll_score += 1 if die == desired_num else 0
if roll_score > 0:
self.current_streak += 1
self.max_streak = max(self.current_streak, self.max_streak)
- self.round_scores[self.current_round - 1] += roll_score
- self.personal_roll_scores[self.current_round - 1] += roll_score
+ self.round_scores[Game.current_round() - 1] += roll_score
+ self.personal_roll_scores[Game.current_round() - 1] += roll_score
if roll_score == 21:
self.bunco_count += 1
self.rolled_bunco = True
else:
self.current_streak = 0
+ log_roll(self, self.current_roll, roll_score)
return roll_score
-
+
def tick(self):
result = TurnInProgress()
if self.fuzzydie_holder is self:
self.current_fuzzydie_streak += 1
@@ -94,11 +94,12 @@
elif self.turn_progress < 75:
# Reading the numbers
# TODO: Incorporate MATH COMPREHENSION stat
if not self.current_roll:
self.current_roll = roll_dice()
- self.round_roll_counts[self.current_round - 1] += 1
+ self.round_roll_counts[Game.current_round() - 1] += 1
+ log(self, f"{self.name} rolled the dice")
self.turn_progress += random.randint(12,25)
else:
# Finished reading the numbers -- good job, eyeballs and brain!
result = self.score_last_roll()
self.current_roll = []
@@ -120,11 +121,11 @@
names = ", ".join([p.name for p in self.players])
return f"
"
def update_teammate_score(self, score):
teammate = self.players[teammate_lookup[self.active_player]]
- teammate.round_scores[Player.current_round - 1] += score
+ teammate.round_scores[Game.current_round() - 1] += score
def tick(self):
if self.active_player == -1:
# First tick for the table this round
self.active_player = random.randint(1, len(self.players)) - 1
@@ -149,13 +150,15 @@
self.active_player = 0
# Let the first player go until they roll for 0 points
while self.active_player == 0:
self.tick()
+ Game.increment_tick()
# Now let the rest do the same
while self.active_player != 0:
self.tick()
+ Game.increment_tick()
def losers(self):
if self.team1_score > self.team2_score:
return self.players[1::2]
else:
@@ -233,14 +236,16 @@
players.append(Player(line[0],0,0,0))
return players
class Game:
+ cur_tick = 1
+ cur_round = 1
+
def __init__(self, playerfile):
self.players = load_players(playerfile)
self.tables = assign_teams(self.players)
- Player.current_round = 1
def tick(self):
for table in self.tables:
table.tick()
@@ -251,16 +256,34 @@
# Otherwise, the last person in the list gets the fuzzy die.
if bunco_rollers and Player.fuzzydie_holder not in bunco_rollers:
Player.fuzzydie_holder = bunco_rollers[-1]
for player in bunco_rollers:
player.rolled_bunco = False # Reset flag
+
+ self.increment_tick()
+
+ @classmethod
+ def current_tick(cls):
+ return cls.cur_tick
+
+ @classmethod
+ def increment_tick(cls):
+ cls.cur_tick += 1
+
+ @classmethod
+ def current_round(cls):
+ return cls.cur_round
+
+ @classmethod
+ def increment_round(cls):
+ cls.cur_round += 1
def print_status(self):
for n, table in enumerate(self.tables):
print(f"== TABLE {n+1} == Team 1:{table.team1_score} pts, Team 2:{table.team2_score} pts")
for player in table.players:
- print(f" {player.name} {player.round_scores[Player.current_round - 1]} points, streak {player.max_streak} buncos {player.bunco_count}")
+ print(f" {player.name} {player.round_scores[Game.current_round() - 1]} points, streak {player.max_streak} buncos {player.bunco_count}")
def prep_next_round(self):
# losers from head table move to next table
headtable_losers = self.tables[0].losers()
round_winners = self.tables[1].swap_for_winners(headtable_losers)
@@ -272,11 +295,11 @@
self.tables[0].swap_for_losers(round_winners)
for table in self.tables:
table.prep_new_round()
- Player.current_round += 1
+ self.increment_round()
def play_one_round(self):
# Go until one of the head table teams reaches 21 pts
while max(self.tables[0].team1_score, self.tables[0].team2_score) < 21:
self.tick()
@@ -287,13 +310,35 @@
for player in self.players:
if player.current_roll:
print(f"Finishing up: {player}")
while player.current_roll:
player.tick()
+ self.increment_tick()
# Settle ties at each table by doing a roll-off as many times as needed
for table in self.tables:
while table.team1_score == table.team2_score:
print(f"Roll off! {table}")
table.roll_off()
self.print_status()
+
+log_db = sqlite3.connect("bunco.sqlite")
+log_dbc = log_db.cursor()
+
+def run_query(*args):
+ log_dbc.execute(*args)
+ log_db.commit()
+
+run_query('DROP TABLE IF EXISTS `bunco_log`')
+run_query('CREATE TABLE `bunco_log` (id, tick_number, round, player_name, type, message)')
+
+def log_roll(player, dice, score):
+ msg = f"{player.name} comprehended that [their] roll of {dice} = {score} points"
+ query = """INSERT INTO bunco_log(tick_number, round, player_name, type, message)
+ VALUES(?, ?, ?, ?, ?)"""
+ run_query(query, (Game.current_tick(), Game.current_round(), player.name, 'roll', msg))
+
+def log(player, message):
+ query = """INSERT INTO bunco_log(tick_number, round, player_name, type, message)
+ VALUES(?, ?, ?, ?, ?)"""
+ run_query(query, (Game.current_tick(), Game.current_round(), player.name, 'general', message))