bang/game.py
Alberto Xamin 768415d2ed
progress
2020-11-15 23:13:17 +01:00

71 lines
2.2 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)
print(f'Added player {player.id} to game')
def choose_characters(self):
char_cards = random.sample(all_characters(), len(self.players)*2)
for i in range(len(self.players)):
self.players[i].set_available_character(char_cards[i*2:i*2+2])
def start_game(self):
print('GAME IS STARING')
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 get_visible_players(self, player):
i = self.players.index(player)
sight = player.get_sight()
return [self.players[j] for j in range(len(self.players)) if i != j and min(abs(i-j)-1, abs(i-len(self.players)-j))+players[j].get_visibility() <= sight]
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()
game = Game()
p1 = players.Player('p1')
game.add_player(p1)
p2 = players.Player('p2')
game.add_player(p2)
p3 = players.Player('p3')
game.add_player(p3)
game.start_game()
for p in game.players:
p.set_character(random.choice(p.available_characters))
game.distribute_roles()