Bunco Simulator

Diff

Differences From Artifact [28f635]:

To Artifact [5ff744]:


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
9
10
11
12
13

14
15





16
17













18

19
20
21
22
23





-
+

-
-
-
-
-


-
-
-
-
-
-
-
-
-
-
-
-
-
+
-





}

def TurnInProgress():
    return -1

def roll_dice(name, current_round, roll_count):
def roll_dice():
    dice = []
    result = 0

    desired_num = current_round % 6
    desired_num = 6 if desired_num == 0 else desired_num
    
    for _ in range(3):
        dice.append(random.randint(1,6))
    
    if all(die == desired_num for die in dice):
        # Bunco!
        result = 21
    elif all(die == dice[0] for die in dice):
        # All three dice match, but not Bunco
        result = 5
    else:
        for die in dice:
            result += 1 if die == desired_num else 0
    
    print(f"In round {current_round} {name} rolled {dice} = {result}")
    return result
    return dice


class Player:
    fuzzydie_holder = None

    def __init__(self, name, dex, math, speed):
51
52
53
54
55

56
57
58
59
60
61
62
63
64
65
66
67





























68
69
70
71
72
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





+












+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





        self.turn_progress = 0
        self.current_streak = 0
        self.max_fuzzydie_streak = 0
        self.current_fuzzydie_streak = 0
        self.rolled_bunco = False
        self.current_roll = []
    
    def __repr__(self):
        return f"<Player {self.name}: " \
            + f"\tscores\t\t{self.round_scores}>" \
            + f"\troll counts\t{self.round_roll_counts}>"

    def prep_new_round(self):
        self.round_scores.append(0)
        self.round_roll_counts.append(0)
        self.personal_roll_scores.append(0)
        self.turn_progress = 0
        self.current_streak = 0

    def score_last_roll(self, current_round):
        desired_num = 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):
            # Bunco!
            roll_score = 21
        elif all(die == self.current_roll[0] for die in self.current_roll):
            # All three dice match, but not Bunco
            roll_score = 5
        else:
            for die in self.current_roll:
                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[current_round - 1] += roll_score
            self.personal_roll_scores[current_round - 1] += roll_score
            if roll_score == 21:
                self.bunco_count += 1
                self.rolled_bunco = True
        else:
            self.current_streak = 0
        
        return roll_score

    def tick(self, current_round):
        result = TurnInProgress()

        if self.fuzzydie_holder is self:
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
96
97
98
99
100
101
102
103
104
105

106



107










108


109
110
111
112
113





+
+
+


-
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
+
-
-





            # TODO: Incorporate ROLL SPEED stat
            self.turn_progress += random.randint(12,25)
        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[current_round - 1] += 1
            self.turn_progress += random.randint(12,25)
        else:
            # Finished rolling
            # Finished reading the numbers -- good job, eyeballs and brain!
            self.round_roll_counts[current_round - 1] += 1
            roll_result = roll_dice(self.name, current_round, self.round_roll_counts[current_round - 1])
            
            result = self.score_last_roll(current_round)
            if roll_result > 0:
                self.current_streak += 1
                self.max_streak = max(self.current_streak, self.max_streak)
                self.round_scores[current_round - 1] += roll_result
                self.personal_roll_scores[current_round - 1] += roll_result
                if roll_result == 21:
                    self.bunco_count += 1
                    self.rolled_bunco = True
            else:
                self.current_streak = 0
            self.current_roll = []
            
            result = roll_result
            self.turn_progress = 0
        return result

class Table:
    def __init__(self):
265
266
267
268
269







270
267
268
269
270
271
272
273
274
275
276
277
278
279





+
+
+
+
+
+
+

        while max(self.tables[0].team1_score, self.tables[0].team2_score) < 21:
            self.tick()

        print("\n\n\t\tB U N C O !!!\n\n")
        
        # Finish up scoring for any players that have unscored rolls
        for player in self.players:
            if player.current_roll:
                print(f"Finishing up: {player}")
                while player.current_roll:
                    player.tick(self.current_round)

        self.print_status()