Exemple #1
0
 def next_state(self, owner):
     owner.machine.trigger(DealState())
Exemple #2
0
def rob_dealer(player, proto):
    """ 经典抢地主
    """
    rob_score = proto.rob_code
    win_seat = rob_seat = -1
    cancel = 0
    if player.table.conf.play_type != 1:
        return
        # 当前没有轮到该玩家抢地主
    if player.table.rob_seat != player.seat:
        return
    # 该玩家已经抢过了
    if player.seat in player.table.rob_players:
        return
    # 每次抢地主的分数都要比上次大
    if rob_score and rob_score <= player.table.rob_score:
        return
    # 玩家下的分正确再存
    if rob_score:
        player.table.rob_score = rob_score
    # 用于控制抢地主结束
    player.table.rob_players[player.seat] = rob_score
    # 重连时用作记录
    if rob_score >= 0:
        player.rob_score = rob_score
    if rob_score >= 3:
        win_seat = player.seat
    else:
        if len(player.table.rob_players) >= player.table.chairs:
            dic = player.table.rob_players
            win_seat = sorted(dic, key=lambda x: dic[x])[-1]
            if player.table.rob_players[win_seat] == 0:
                win_seat = -1
                cancel = 1
        else:
            player.table.rob_seat = rob_seat = player.next_seat

    proto = game_pb2.RobLandLordReponse()
    proto.uuid = player.uuid
    proto.rob_score = rob_score
    proto.win_seat = win_seat
    proto.rob_seat = rob_seat
    proto.base_score = player.table.get_base_core(player)
    if win_seat != -1:
        for c2 in player.table.cards_on_desk:
            card = proto.cards_rest.add()
            card.card = c2
    player.table.reset_proto(ROB_DEALER)
    for i in player.table.player_dict.values():
        # player.machine.trigger(RobState())
        # 给所有人发包括自己
        # if i.uuid == player.uuid:
        #     continue
        i.proto.p = copy(proto)
        i.proto.send()
    player.table.replay["procedure"].append(
        {"rob_dealer": [player.uuid, rob_score]})

    # 确定地主
    if win_seat != -1:
        player.table.dealer_seat = win_seat
        player.table.seat_dict[player.table.dealer_seat].land_lord_times += 1
        for card in player.table.cards_on_desk:
            # 给地主加牌
            player.table.seat_dict[win_seat].cards_in_hand.append(card)
        for i in player.table.player_dict.values():
            i.machine.cur_state.execute(i, "rob_skip")
        player.table.replay["procedure"].append(
            {"rob_confirm": [player.seat, rob_score]})
    if cancel:
        player.table.rob_all_cancel()
        from state.table_state.deal import DealState
        player.table.machine.trigger(DealState())
    player.dumps()
Exemple #3
0
def rob_dealer_happy(player, proto):
    """ 欢乐抢地主
    """
    rob_score = proto.rob_score
    win_seat = rob_seat = -1
    cancel = 0
    if player.table.conf.play_type != 2:
        return
        # 当前没有轮到该玩家抢地主
    if player.table.rob_seat != player.seat:
        return
    # 该玩家已经抢过了
    if rob_score == player.rob_score:
        return
    # 放弃的不能在抢地主
    if not player.rob_score:
        return
    # 首次不能抢地主
    if player.table.rob_score == 0 and rob_score == 2:
        return
    # 地主只能被叫一次
    if player.table.rob_score == 1 and rob_score == 1:
        return
    # 抢地主后不能在叫
    if player.table.rob_score == 2 and rob_score == 1:
        return

    player.table.rob_score = rob_score if rob_score else 0
    player.table.rob_players_happy.append([player.seat, rob_score])
    player.rob_score = rob_score

    def get_win_seat(player, max_score):
        lis = player.table.rob_players_happy[::-1]
        result = None
        for item in lis:
            if item[1] == max_score:
                result = item[0]
                break
        return result

    max_score = max([i[0] for i in player.table.rob_players_happy])
    # 只有一个叫地主的
    if max_score == 1 and len(
            player.table.rob_players_happy) == player.table.chairs:
        win_seat = get_win_seat(player, max_score)
    else:
        if len(player.table.rob_players) >= player.table.chairs + 1:
            win_seat = get_win_seat(player, max_score)
        else:

            def set_next(player):
                next_player = player.table.seat_dict[player.next_seat]
                if next_player.rob_score == 0:
                    set_next(next_player)
                    return
                if next_player.table.rob_seat == next_player.seat:
                    return
                next_player.table.rob_seat = next_player.seat
                global rob_seat
                rob_seat = next_player.seat

            set_next(player)
            if player.table.rob_seat == player.seat and player.rob_score == 0:
                # 全都pass 重新发牌
                rob_seat = -1
                cancel = 1

    proto = game_pb2.RobLandLordReponse()
    proto.seat = player.seat
    proto.rob_score = rob_score
    proto.win_seat = win_seat
    proto.rob_seat = rob_seat
    if win_seat != -1:
        for c2 in player.table.cards_on_desk:
            card = proto.cards_rest.add()
            card.card = c2
    player.table.reset_proto(ROB_DEALER_HAPPY)
    for i in player.table.player_dict.values():
        # player.machine.trigger(RobState())
        if i.uuid == player.uuid:
            continue
        i.proto.p = copy(proto)
        i.proto.send()
    # 刷新面板分
    for i in player.table.player_dict.values():
        score_proto = game_pb2.PokerScoreResponse()
        score_proto.multiple = i.table.get_multiple(i)
        send(POKER_SCORE, score_proto, i.session)
    player.table.replay["procedure"].append(
        {"rob_dealer_happy": [player.uuid, rob_score]})
    # 确定地主
    if win_seat != -1:
        player.table.dealer_seat = win_seat
        player.table.seat_dict[player.table.dealer_seat].land_lord_times += 1
        for i in player.table.player_dict.values():
            i.machine.cur_state.execute(i, "rob_skip")
        player.table.replay["procedure"].append(
            {"rob_confirm": [player.seat, rob_score]})
    if cancel:
        player.table.rob_all_cancel()
        from state.table_state.deal import DealState
        player.table.machine.trigger(DealState())
    player.dumps()
 def after(self, owner):
     if owner.conf.game_type == 5:
         owner.machine.trigger(DealState())
     elif owner.conf.game_type == 4 or owner.conf.game_type == 7:
         owner.machine.trigger(DealState())