Exemple #1
0
 def __init__(self, board, playerToMove, fruit_life, fruit_taken, penalty_taken):
     self.playerToMove = playerToMove
     self.pos = utils.getPlayerPos(board, playerToMove)
     self.rival_pos = utils.getPlayerPos(board, utils.nextTurn(playerToMove))
     self.fruit_life = fruit_life
     self.fruit_taken = fruit_taken
     self.penalty_taken = penalty_taken
Exemple #2
0
    def perform_move(self, state, d, maximizing_player):  # ->succ_state
        i = state.pos[0] + d[0]
        j = state.pos[1] + d[1]
        new_pos = (i, j)

        self.board[state.pos] = -1

        new_player_to_move = utils.nextTurn(state.playerToMove)
        new_fruit_life = max(0, state.fruit_life - 1)

        fruit_taken = 0
        if new_fruit_life > 0:
            fruit_taken = self.board[new_pos]

        self.board[new_pos] = state.playerToMove
        penalty_taken = 0
        if not utils.playerCanMove(self.board,
                                   new_pos) and utils.playerCanMove(
                                       self.board, state.rival_pos):
            penalty_taken = self.penalty_score
        self.score[state.playerToMove - 1] = self.score[
            state.playerToMove -
            1] + fruit_taken - penalty_taken  # the fruit was on my pos + penalty if there any

        return Player.PlayerState(self.board, new_player_to_move,
                                  new_fruit_life, fruit_taken, penalty_taken)
Exemple #3
0
def nextState(original_state, action, match_log=None):
    """
    Parameters
    ------------
    original_state: State Object
        状態オブジェクト
    
    action: int
        行動

    Returns
    ------------
    next_state: State Object
        次の状態
    reward: list(int) or None
        報酬(ゲーム終了時のみ順位リストを返す,それ以外はNone)
    
    Notes:
    ------------
    現在の状態stateに対して,actionが選択されたときに,遷移する状態を返す
    非破壊的メソッド
    """

    # 現状態のコピー
    state = deepcopy(original_state)
    player = state.players[state.turn]

    # 状態フラグ
    kill8 = False
    skip5 = False
    outX = False

    # パスの場合
    if action == 54:

        # 流れの場合
        if state.last == nextTurn(state.turn, state.out,
                                  reverse=state.reverse):

            # 流れによる場の初期化
            flowGame(state)
            if match_log != None:
                match_log.writeFrowLog()

            state.turn = state.last

            return (state, None)

    # パス以外の行動の場合
    else:

        # 状態遷移(プレイヤーの手札から)
        cut_index = np.where(player == action)[0]
        state.players[state.turn] = np.delete(player, cut_index).tolist()
        state.field.append(action)

        # カード効果の処理
        card_number = NUMBER[number(action)]

        if card_number == "8":
            flowGame(state)
            kill8 = True

        elif card_number == "5":
            skip5 = True

        elif card_number == "J":
            state.back = True

        elif card_number == "9":
            state.reverse = bool(1 - state.reverse)

        # 和了
        if len(state.players[state.turn]) == 0:

            outX = True
            state.out[state.turn] = True
            state.rank[state.turn] = sum(state.out)
            state.last = nextTurn(state.turn,
                                  state.out,
                                  reverse=state.reverse,
                                  skip=skip5,
                                  kill=kill8,
                                  win=True)

        # 非和了
        else:
            state.last = state.turn

    # ターンを進める
    state.turn = nextTurn(state.turn,
                          state.out,
                          reverse=state.reverse,
                          skip=skip5,
                          kill=kill8,
                          win=outX)

    if sum(state.out) == N_Player - 1:

        return (state, state.rank)
    else:
        return (state, None)