def process(self, conn: socket.socket, message: Message): """ 根据 signal 获取执行函数并调用 Args: conn: socket 连接 message: """ if message.signal: signal_name, signal_value = message.signal.split('.') else: player = self.players[conn] _signal = player.menu.get_signal(message.code) if _signal: ignore_list = ignore_menu(player) signal_name, signal_value = _signal.split('.') if signal_value in ignore_list: signal_name = None else: signal_name = signal_value = None signal = self.signals.get(signal_name) if signal is None: self.logger.error(f"{message.signal} is not found") conn.send(Message(text="指令错误,请重新输入").encode()) return func = signal.deferred_functions.get(signal_value) if func is None: self.logger.error(f"{message.signal} is not found") conn.send(Message(text="指令错误,请重新输入").encode()) return func(self, conn, *message.args)
def login(server: TexasServer, conn, username, chips=None): if username in [player.name for player in server.players.values()]: conn.send(Message(text=f"{username}已登录", status=400).encode()) return player = TexasPlayer(username) player.menu = HillMenu server.players[conn] = player server.logger.info(f"玩家<{username}>登录游戏") conn.send(Message(text=f"{username},欢迎来到德州扑克", status=200).encode()) conn.send(Message(text='输入 h/H 查看帮助菜单').encode())
def fold(server: TexasServer, conn): player = server.players[conn] room_index = server.rooms.index(player.room) player.fold() conn.send(Message(text=f"已弃牌").encode()) server.room_notice(room_index, text=f"玩家<{player.name}>弃牌", ignore_players=[player]) player.room.receive_chips(player, 0) if not player.room.is_bet_success() and player.room.is_ready(): current_player_conn = server.get_conn(player.room.current_player) server.room_notice(room_index, text=f"等待玩家<{player.room.current_player.name}>下注", ignore_players=[player.room.current_player]) current_player_conn.send(Message(text="请下注", status=200).encode())
def room_notice(self, room_index, text, ignore_players=None): ignore_players = ignore_players or [] for conn, player in self.players.items(): room = self.rooms[int(room_index)] if player not in ignore_players and player.room == room: conn.send(Message(text=text, status=200).encode()) self.logger.info(text)
def bet(server: TexasServer, conn, chips): player = server.players[conn] room_index = server.rooms.index(player.room) player.bet(int(chips)) conn.send(Message(text=f"下注{chips}成功").encode()) server.room_notice( room_index, text=f"玩家<{player.name}>下注{chips},当前注码{player.bet_round_chips}," f"底池{player.room.pot + player.bet_round_chips}", ignore_players=[player]) player.room.receive_chips(player, int(chips)) if not player.room.is_bet_success() and player.room.is_ready(): current_player_conn = server.get_conn(player.room.current_player) server.room_notice(room_index, text=f"等待玩家<{player.room.current_player.name}>下注", ignore_players=[player.room.current_player]) current_player_conn.send(Message(text="请下注", status=200).encode())
def create_rooms(server: TexasServer, conn): room = TexasRoom() player = server.players[conn] room.receive_player(player) server.rooms.append(room) player.menu = RoomMenu text = f"创建房间成功,房间ID {room.id}\n" \ f"输入 h/H 查看帮助菜单" conn.send(Message(text=text, status=200).encode())
def allin(server: TexasServer, conn): player = server.players[conn] room_index = server.rooms.index(player.room) player.allin() conn.send(Message(text=f"All in {player.allin_chips}").encode()) server.room_notice( room_index, text= f"玩家<{player.name}> 全推,当前注码{max(player.room.public_bet, player.bet_round_chips)}," f"底池{player.room.pot + player.allin_chips}", ignore_players=[player]) player.room.receive_chips(player, player.allin_chips) if not player.room.is_bet_success() and player.room.is_ready(): current_player_conn = server.get_conn(player.room.current_player) server.room_notice(room_index, text=f"等待玩家<{player.room.current_player.name}>下注", ignore_players=[player.room.current_player]) current_player_conn.send(Message(text="请下注", status=200).encode())
def thread(self, conn): while True: try: rec_msg = conn.recv(1024) if not rec_msg: return self.process(conn, Message.decode(rec_msg)) except ConnectionResetError: self.players.pop(conn, None)
def exit_room(server: TexasServer, conn): player = server.players[conn] room_index = server.rooms.index(player.room) player.exit_room() player.menu = HillMenu text = f"已退出房间\n" \ f"输入 h/H 查看帮助菜单" conn.send(Message(text=text, status=200).encode()) server.room_notice(room_index, text=f"玩家<{player.name}> 退出房间", ignore_players=[player])
def enter_room(server: TexasServer, conn, room_index): player = server.players[conn] room = server.rooms[int(room_index)] room.receive_player(player) player.menu = RoomMenu text = f"进入房间成功,房间ID {room.id}\n" \ f"输入 h/H 查看帮助菜单" conn.send(Message(text=text, status=200).encode()) server.room_notice(room_index, text=f"玩家<{player.name}> 进入房间", ignore_players=[player])
def raise_(server: TexasServer, conn, chips): player = server.players[conn] room_index = server.rooms.index(player.room) public_bet = player.room.public_bet bet_chips = player.bet_round_chips player.raise_(public_bet, int(chips)) new_bet_chips = player.bet_round_chips - bet_chips conn.send(Message(text=f"加注到{public_bet + int(chips)}").encode()) server.room_notice( room_index, text=f"玩家<{player.name}>加注,当前注码{player.bet_round_chips}," f"底池{player.room.pot + new_bet_chips}", ignore_players=[player]) player.room.receive_chips(player, new_bet_chips) # 加注需要校准注码 player.room.public_bet = player.bet_round_chips if not player.room.is_bet_success() and player.room.is_ready(): current_player_conn = server.get_conn(player.room.current_player) server.room_notice(room_index, text=f"等待玩家<{player.room.current_player.name}>下注", ignore_players=[player.room.current_player]) current_player_conn.send(Message(text="请下注", status=200).encode())
def ready(server: TexasServer, conn): player = server.players[conn] player.ready() conn.send(Message(text=f"已准备,等待其他玩家准备", status=200).encode()) room = player.room if room.is_ready(): room_index = server.rooms.index(room) server.room_notice(room_index, text="牌局开始") room.trigger() room.card_set.deal(room) server.room_notice(room_index, text="发牌完成") for p in room.players: p.menu = GameMenu cards = ''.join([str(card) for card in p.hole_cards]) server.logger.info(f"玩家<{p.name}>,底牌{cards}") player_conn = server.get_conn(p) player_conn.send(Message(text=p.show_cards(), status=200).encode()) if p == room.current_player: player_conn.send(Message(text="请下注", status=200).encode()) server.room_notice(room_index, text=f"等待玩家<{room.current_player.name}>下注", ignore_players=[room.current_player])
def get_rooms(server: TexasServer, conn): text = '\n'.join([f"{i}\t{r}" for i, r in enumerate(server.rooms)]) or '无房间' conn.send(Message(text=text, status=200).encode())
def player_list(server: TexasServer, conn): player = server.players[conn] room = player.room text = '\n'.join([str(p) for p in room.players]) conn.send(Message(text=text, status=200).encode())
def help_list(server: TexasServer, conn): player = server.players[conn] ignore_list = ignore_menu(player) conn.send( Message(text=_format_menu(player.menu, ignore_list), status=200).encode())
def show_cards(server: TexasServer, conn): player = server.players[conn] conn.send(Message(text=player.show_cards()).encode())
def stop(server: TexasServer, conn): server.players.pop(conn, None) conn.send(Message(text='', status=200).encode())
def my_info(server: TexasServer, conn): player = server.players[conn] text = f"玩家<{player.name}>,筹码量 {player.chips}" conn.send(Message(text=text, status=200).encode())