Exemple #1
0
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]
        ]
Exemple #2
0
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("")