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
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)
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)