From 9a4febaaf40a9e19185307ff4463aaf43cf6b839 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Sun, 17 Dec 2023 22:16:43 +0100 Subject: [PATCH] Rework Heuristics --- src/classes/Heuristic.py | 62 ++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/src/classes/Heuristic.py b/src/classes/Heuristic.py index d7fa3ea..2656180 100644 --- a/src/classes/Heuristic.py +++ b/src/classes/Heuristic.py @@ -17,28 +17,41 @@ class ScoreHeuristicEngine(HeuristicEngine): class WeightHeuristicEngine(HeuristicEngine): + def __init__(self, logger, options): + super().__init__(logger, options) + self.weights = self._get_weight_array() + self.logger.debug("{}".format(self.show_weights())) + def get(self, board, player): score = self.get_weight(board, player) return score def get_weight(self, board, player): score = 0 - size = board.get_board_size() - weights = self._get_weight_array(size) - for pos_x in range(size): - for pos_y in range(size): - if board._board[pos_x][pos_y] == player: - score += weights[pos_x][pos_y] - else: - score -= weights[pos_x][pos_y] + size = self.options['size'] + w = [[ 0 for _ in range(size)] for _ in range(size)] + for pos_x in range(self.options['size']): + for pos_y in range(self.options['size']): + p = board._board[pos_x][pos_y] + if p == player: + score += self.weights[pos_x][pos_y] + w[pos_x][pos_y] = self.weights[pos_x][pos_y] + + elif p != player and p != board._EMPTY: + score -= self.weights[pos_x][pos_y] + w[pos_x][pos_y] = -self.weights[pos_x][pos_y] return score - def _get_weight_array(self, size): + def _get_weight_array(self): + size = self.options['size'] w = [[ 0 for _ in range(size)] for _ in range(size)] padding = size // 5 center = size // 2 - for pos_y in range(size): - for pos_x in range(size): + full_range = range(self.options['size']) + center_range = range(center - padding, center + padding) + + for pos_y in full_range: + for pos_x in full_range: # Elements in the corner if pos_x in [0, size -1] and pos_y in [0,size - 1]: @@ -49,10 +62,35 @@ class WeightHeuristicEngine(HeuristicEngine): w[pos_x][pos_y] = self.options['weight'][1] # Element the center - elif pos_x in range( center - padding, center + padding) and pos_y in range(center - padding, center + padding): + elif pos_x in center_range and pos_y in center_range: w[pos_x][pos_y] = self.options['weight'][0] return w + + def show_weights(self): + display = "\n |" + for x in range(self.options['size']): + display += "{:^3}|".format(x) + display += "\n" + for x in range(self.options['size']): + display += "{:^3}|".format(str(x)) + for y in range(self.options['size']): + display += "{:^3}|".format(self.weights[x][y]) + display += "\n" + return display + + @staticmethod + def show_weight_score(weights, size): + display = "\n |" + for x in range(size): + display += "{:^3}|".format(x) + display += "\n" + for x in range(size): + display += "{:^3}|".format(str(x)) + for y in range(size): + display += "{:^3}|".format(weights[x][y]) + display += "\n" + return display class FullHeuristicEngine(WeightHeuristicEngine): def get(self, board, player):