53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
from typing import List, Set, Dict, Tuple, Optional
|
|
import random
|
|
import players
|
|
from characters import all_characters
|
|
from deck import Deck
|
|
import roles
|
|
|
|
class Game:
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.players: List[players.Player] = []
|
|
self.deck: Deck = None
|
|
self.started = False
|
|
self.turn = 0
|
|
|
|
def add_player(self, player: players.Player):
|
|
player.join_game(self)
|
|
self.players.append(player)
|
|
|
|
def choose_characters(self):
|
|
char_cards = random.sample(all_characters(), len(self.players))
|
|
for i in range(len(self.players)):
|
|
self.players[i].set_available_character(char_cards[i*2:i*2+2])
|
|
|
|
def start_game(self):
|
|
if self.started:
|
|
return
|
|
self.started = True
|
|
self.deck = Deck()
|
|
self.choose_characters()
|
|
|
|
def distribute_roles(self):
|
|
available_roles: List[roles.Role] = []
|
|
if len(self.players) == 3:
|
|
available_roles = [roles.Sheriff(), roles.Renegade(), roles.Outlaw()]
|
|
random.shuffle(available_roles)
|
|
for i in range(len(self.players)):
|
|
self.players[i].set_role(available_roles[i])
|
|
if type(available_roles[i]) == roles.Sheriff:
|
|
self.turn = i
|
|
self.players[i].prepare()
|
|
for k in range(self.players[i].max_lives):
|
|
self.players[i].hand.append(self.deck.draw())
|
|
self.play_turn()
|
|
|
|
def play_turn(self):
|
|
self.players[self.turn].play_turn()
|
|
|
|
def next_turn(self):
|
|
self.turn = (self.turn + 1) % len(self.players)
|
|
self.play_turn()
|
|
|