def place_pdu(self, context, client, x, y): if client == context.socket_player_white: if GameLogic.is_valid_position(context.boardmodel, x, y, Player.WHITE): affected_positions = GameLogic.get_affected_positions(context.boardmodel, x, y, Player.WHITE) GameLogic.apply_move(context.boardmodel, x, y, Player.WHITE) board_pdu = GameClientPDUCodec.update_board_pdu(Player.WHITE, affected_positions) context.request.send_req(context.socket_player_white, board_pdu) context.request.send_req(context.socket_player_black, board_pdu) next_turn_player = GameLogic.next_turn_player(context.boardmodel, Player.WHITE) white_count, black_count = context.boardmodel.count_disks() # if white_count > 4: # context.end_game() if next_turn_player == Player.WHITE: context.turn = context.socket_player_white context.state = context.WHITE_TURN context.state.turn_req(context) elif next_turn_player == Player.BLACK: context.turn = context.socket_player_black context.state = context.BLACK_TURN context.state.turn_req(context) else: # no valid movements->board full or no valid placements for any player context.end_game() else: context.request.send_req(client, GameClientPDUCodec.place_error_pdu()) context.request.send_req(client, GameClientPDUCodec.turn_pdu()) else: # not your turn # read protocol, I don't remember if it's specified to report the error or not context.request.send_req(client, GameClientPDUCodec.place_error_pdu())
def end_game(self, context): white_count, black_count = context.boardmodel.count_disks() winner_pdu = GameClientPDUCodec.winner_pdu(Player.EMPTY) if white_count > black_count: winner_pdu = GameClientPDUCodec.winner_pdu(Player.WHITE) elif black_count > white_count: winner_pdu = GameClientPDUCodec.winner_pdu(Player.BLACK) context.request.send_req(context.socket_player_white, winner_pdu) context.request.send_req(context.socket_player_black, winner_pdu) context.request.shutdown_req()
def disconnection_ind(self, context, client): print "[Game Instance] Got a disconnection" winner = None if client == context.socket_player_white: other_player = context.socket_player_black winner = Player.BLACK else: other_player = context.socket_player_white winner = Player.WHITE context.request.send_req(other_player, GameClientPDUCodec.winner_pdu(winner)) context.request.shutdown_req()
def game_init(self): self.request.send_req(self.socket_player_white, GameClientPDUCodec.connect_ok_pdu(Player.WHITE)) self.request.send_req(self.socket_player_black, GameClientPDUCodec.connect_ok_pdu(Player.BLACK)) initial_board = GameLogic.initial_board_as_affected_positions(8) self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0])) self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1])) self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0])) self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1])) self.request.send_req(self.socket_player_black, GameClientPDUCodec.turn_pdu())
def recv_ind(self, client, data): (pdu_id, pdu_size, pdu_data) = GameClientPDUCodec.decode(data) print (pdu_id, pdu_size, pdu_data) if pdu_id == PDUCodes.CLIENT_CONNECT_OK: self.state.connection_ok_ind(self, pdu_data[0]) elif pdu_id == PDUCodes.PLACE_ERROR: self.state.place_error_ind(self) elif pdu_id == PDUCodes.TURN: self.state.turn_ind(self) elif pdu_id == PDUCodes.WINNER: self.state.winner_ind(self, pdu_data[0]) elif pdu_id == PDUCodes.UPDATE_BOARD: self.state.updated_board_ind(self, pdu_data[0], pdu_data[1]) return pdu_size
def turn_req(self, context): context.request.send_req(context.turn, GameClientPDUCodec.turn_pdu())