# we win game print('We just win the game.') game_win += 1 mct.backpropagate(states_in_game, True) with open('res', 'a') as r: r.writelines('W') else: print('We just lost the game.') game_lost += 1 mct.backpropagate(states_in_game, False) with open('res', 'a') as r: r.writelines('L') lets_play_it() elif msg_type == client.CMsgPlayerDeclaresSpecial: if game_mgr.get_game_state() == client.DeclaringSpecials: # HACK: I'M SICK WITH IT. is_discard_locked = True else: is_discard_locked = False game_mgr.handle_cmsg(cm) if game_mgr.get_game_state() == client.DeclaringSpecials: lets_play_it() elif msg_type in [client.CMsgPlayerDraws, client.CMsgPlayerDrawsLoose]: is_discard_locked = False game_mgr.handle_cmsg(cm) print('Receive draw message') if game_mgr.get_game_state() == client.DeclaringSpecials: if game_mgr.is_our_turn(): is_declare_updated = True lets_play_it()
class Server(): def __init__(self, database_path): self.ganager = GameManager(database_path) self.websockets = {} self.players = {} self.ready = {} self.first_round = {} def process_message(self, msg_string, websocket): msg = Message() msg.from_json(msg_string) if msg.get_msg_name() == 'create_game': game_id = self.ganager.create_new_game(player=msg.content) self.websockets[game_id] = [websocket] self.players[game_id] = [msg.content] self.ready[game_id] = False new_msg = Message('game_id', game_id, game_id) return new_msg.to_json(), game_id if msg.get_msg_name() == 'join_game': self.ganager.join_game(game_id=msg.game_id, player_name=msg.content) self.websockets[msg.game_id].append(websocket) self.players[msg.game_id].append(msg.content) self.ready[msg.game_id] = True new_msg = Message('game_id', msg.game_id, msg.game_id) return new_msg.to_json(), msg.game_id if msg.get_msg_name() == 'action': player_name = self.get_player_name_by_websocket( websocket, msg.game_id) end = self.ganager.play_card(game_id=msg.game_id, player_name=player_name, card_idx=msg.content) messages = [] if not end: for _, player_name in enumerate(self.players[msg.game_id]): game_state = self.ganager.get_game_state( msg.game_id, player_name) new_msg = Message('state', game_state, msg.game_id) new_msg_str = new_msg.to_json() messages.append(new_msg_str) else: for _, player_name in enumerate(self.players[msg.game_id]): game_state = self.ganager.get_game_state( msg.game_id, player_name) game_state['game_status'] = end new_msg = Message('end', game_state, msg.game_id) new_msg_str = new_msg.to_json() messages.append(new_msg_str) return messages, msg.game_id if msg.get_msg_name() == 'throw_away': player_name = self.get_player_name_by_websocket( websocket, msg.game_id) self.ganager.throw_away_card(game_id=msg.game_id, player_name=player_name, card_idx=msg.content) messages = [] for _, player_name in enumerate(self.players[msg.game_id]): game_state = self.ganager.get_game_state( msg.game_id, player_name) new_msg = Message('state', game_state, msg.game_id) new_msg_str = new_msg.to_json() messages.append(new_msg_str) return messages, msg.game_id def get_player_name_by_websocket(self, websocket, game_id): player_name = self.players[game_id][self.websockets[game_id].index( websocket)] return player_name async def process(self, websocket, path): # initial connection msg_string = await websocket.recv() new_msg_string, game_id = self.process_message(msg_string, websocket) await websocket.send(new_msg_string) # wait for both player to be connected while not self.ready[game_id]: await asyncio.sleep(1) # initial game state player_name = self.get_player_name_by_websocket(websocket, game_id) game_state = self.ganager.get_game_state(game_id, player_name) new_msg = Message('state', game_state, game_id) new_msg_string = new_msg.to_json() await websocket.send(new_msg_string) # communication self.first_round[game_id] = True while not self.ganager.is_game_over(game_id): msg_string = await websocket.recv() new_msgs_strings, game_id = self.process_message( msg_string, websocket) for i, websock in enumerate(self.websockets[game_id]): await websock.send(new_msgs_strings[i]) if not self.first_round[game_id]: if not self.ganager.is_game_over(game_id): player_name = None wrong_player = self.get_player_name_by_websocket( websocket, game_id) if self.players[game_id][0] == wrong_player: player_name = self.players[game_id][1] elif self.players[game_id][1] == wrong_player: player_name = self.players[game_id][0] if i == 0: self.ganager.material_update(game_id, player_name) game_state = self.ganager.get_game_state( game_id, player_name) new_msg = Message('material_update', game_state, game_id) new_msg_string = new_msg.to_json() await websock.send(new_msg_string) self.first_round[game_id] = False