class NewSolver(object): def __init__(self): self.board = Board() self.state = [] self.threshold = 0 self.team = 'A' def calcScoreAverage(self): num_of_cells = 0 for row in self.board.getBoardScores(): for cell in row: if cell >= 0: self.threshold += cell num_of_cells += 1 self.threshold /= num_of_cells def set_team(self, team): self.team = team def update_board(self, input_board): self.board = input_board def gen_state_list(self): if self.team == 'A': my_board = copy.deepcopy(self.board.team_a) enemy_board = copy.deepcopy(self.board.team_b) elif self.team == 'B': my_board = copy.deepcopy(self.board.team_b) enemy_board = copy.deepcopy(self.board.team_a) self.state = [[0] * self.board.getBoardSize()[1] for i in range(self.board.getBoardSize()[0])] for x in range(self.board.getBoardSize()[0]): for y in range(self.board.getBoardSize()[1]): if my_board[x][y]: self.state[x][y] = 0 else: if self.board.getBoardScores()[x][y] >= self.threshold: if enemy_board[x][y]: self.state[x][y] = 3 else: self.state[x][y] = 2 elif self.board.getBoardScores()[x][y] >= 0: if enemy_board[x][y]: self.state[x][y] = -1 else: self.state[x][y] = 1 else: self.state[x][y] = -2 def search_around(self, row, column): destination = ((0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0), (-1, 1)) que = [] board_size = self.board.getBoardSize() for a in destination: if (0 <= row + a[0] < board_size()[0]) and (0 <= column + a[1] < board_size()[1]): state_cache1 = copy.deepcopy(self.state) first_step = self.state[row + a[0]][column + a[1]] state_cache1[row + a[0]][column + a[1]] = 0 for b in destination: if (0 <= row + a[0] + b[0] < board_size()[0]) and ( 0 <= column + a[1] + b[1] < board_size()[1]): state_cache2 = copy.deepcopy(state_cache1) second_step = state_cache1[row + a[0] + b[0]][column + a[1] + b[1]] state_cache2[row + a[0] + b[0]][column + a[1] + b[1]] = 0 for c in destination: if (0 <= (row + a[0] + b[0] + c[0]) < board_size[0] ) and (0 <= (column + a[1] + b[1] + c[1]) < board_size[1]): third_step = state_cache2[row + a[0] + b[0] + c[0]][column + a[1] + b[1] + c[1]] que.append((first_step + second_step + third_step, self.board.getBoardScores()[row+a[0]][column+a[1]] \ + self.board.getBoardScores()[row+a[0]+b[0]][column+a[1]+b[1]] \ + self.board.getBoardScores()[row+a[0]+b[0]+c[0]][column+a[1]+b[1]+c[1]], (a, b, c) )) practice = [0, 0] #[forのiを代入, 評価値を代入] practices = [] for i, element in enumerate(que): if element[0] > practice[1]: practice = [i, element[0]] practices = [] practices.append(practice) elif element[0] == practice[1]: practice = [i, element[0]] practices.append(practice) best_practices = [(0, (0, 0))] for a in practices: if que[a[0]][1] > best_practices[0][0]: best_practices = [] best_practices.append([que[a[0]][1], que[a[0]][2][0]]) elif que[a[0]][1] == best_practices[0][0]: best_practices.append([que[a[0]][1], que[a[0]][2][0]]) num_run = random.randrange(len(best_practices)) return [ row + best_practices[num_run][1][0], column + best_practices[num_run][1][1] ]
class Solver(object): def __init__(self): self.board = Board() self.state = [] #stateの値は-3が囲むことのできない平均値未満の領域、-2が平均値以上の領域、-1が平均値以下で点数の計算が行われていない領域、0以上は点数計算が終わり、lake_scoreに点数が代入し終わった領域。 self.lake_score = list() def calcScoreAverage(self): return sum(map(sum, self.board.board_scores)) / ( (self.board.row + 1) * (self.board.column + 1)) def state_init(self): self.state = [[0] * self.board.getBoardSize()[1] for i in range(self.board.getBoardSize()[0])] print(len(self.state), len(self.state)) for x in range(self.board.getBoardSize()[0]): for y in range(self.board.getBoardSize()[1]): if self.board.getBoardScores()[x][y] < self.calcScoreAverage(): self.state[x][y] = -1 else: self.state[x][y] = -2 def find_lakes(self, x, y, num): self.state[x][y] = num self.lake_score_buffer = 0 self.utl = ((1, 0), (-1, 0), (0, 1), (0, -1)) for diff in self.utl: if (0 <= x + diff[0] < self.board.getBoardSize()[0] and 0 <= y + diff[1] < self.board.getBoardSize()[1] ) and self.state[x + diff[0]][y + diff[1]] == -1: self.lake_score_buffer += self.find_lakes( x + diff[0], y + diff[1], num) return abs(self.board.getBoardScores()[x][y]) + self.lake_score_buffer def set_state(self): self.state_init() for i in (0, self.board.getBoardSize()[0] - 1): for j in range(self.board.getBoardSize()[1]): if self.state[i][j] == -1: self.find_lakes(i, j, -3) for i in range(self.board.getBoardSize()[0]): for j in (0, self.board.getBoardSize()[1] - 1): if self.state[i][j] == -1: self.find_lakes(i, j, -3) count = 0 for i in range(self.board.getBoardSize()[0]): for j in range(self.board.getBoardSize()[1]): if self.state[i][j] == -1: self.lake_score.append(self.find_lakes(i, j, count)) count += 1 def set_board(self, in_board): self.board = in_board def get_state(self): return self.state def print_state(self): for row in self.state: for cell in row: print(format(cell, '3d'), end="") print("") def print_state_and_score(self, direction=0): if direction == 0: for row in self.state: for cell in row: if cell < 0: print(format(0, '3d'), end="") else: print(format(self.lake_score[cell], '3d'), end="") print("") print("") print("") elif direction == 1: for y in range(self.board.getBoardSize()[1]): for x in range(self.board.getBoardSize()[0]): if self.state[x][y] < 0: print(format(0, '3d'), end="") else: print(format(self.lake_score[self.state[x][y]], '3d'), end="") print("") print("") print("") elif direction == 2: for x in range(self.board.getBoardSize()[1])[::-1]: for y in range(self.board.getBoardSize()[0]): if self.state[x][y] < 0: print(format(0, '3d'), end="") else: print(format(self.lake_score[self.state[x][y]], '3d'), end="") print("") print("") print("") elif direction == 3: for y in range(self.board.getBoardSize()[1]): for x in range(self.board.getBoardSize()[0])[::-1]: if self.state[x][y] < 0: print(format(0, '3d'), end="") else: print(format(self.lake_score[self.state[x][y]], '3d'), end="") print("") print("") print("")