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))