From 9a2c40c5c4c568b7996046dfd9fbeff43e1f7711 Mon Sep 17 00:00:00 2001 From: Thaloria Date: Fri, 7 Oct 2022 16:19:35 +0200 Subject: [PATCH] added 3s with gap support added explosive detonation on stuck --- farm/Field_Representation.py | 151 +++++++++++++++++++++-------------- farm/maginent.jpg | Bin 0 -> 7306 bytes farm/main_farm.py | 4 +- 3 files changed, 91 insertions(+), 64 deletions(-) create mode 100644 farm/maginent.jpg diff --git a/farm/Field_Representation.py b/farm/Field_Representation.py index 791305f..eb8494f 100644 --- a/farm/Field_Representation.py +++ b/farm/Field_Representation.py @@ -20,6 +20,7 @@ ARROW_RIGHT = 10 ROCK_1 = 11 ROCK_2 = 12 ROCK_3 = 13 +MAGINENT = 21 class Field: data_value_grid = [] @@ -32,10 +33,19 @@ class Field: explosives.append(ARROW_DOWN) explosives.append(BIGBOMB) explosives.append(BOMB) + colors = [] + colors.append(GREEN) + colors.append(YELLOW) + colors.append(BLUE) + colors.append(RED) + colors.append(PINK) + colors.append(MAGINENT) + def __init__(self): self.data_value_grid = np.zeros((8, 14), dtype=int) self.data_coordinates = np.zeros((8, 14), dtype=object) + self.observation = np.zeros((8, 14), dtype=int) # 230 to 2110 = 1883 / 14 = 134.5 # 60 to 1130 = 1076 / 8 = 134.5 @@ -64,75 +74,28 @@ class Field: ARROW_RIGHT: cv.imread("arrow_right.jpg", cv.IMREAD_COLOR), ROCK_1: cv.imread("rock1.jpg", cv.IMREAD_COLOR), ROCK_2: cv.imread("rock2.jpg", cv.IMREAD_COLOR), - ROCK_3: cv.imread("rock3.jpg", cv.IMREAD_COLOR) + ROCK_3: cv.imread("rock3.jpg", cv.IMREAD_COLOR), + MAGINENT: cv.imread("maginent.jpg", cv.IMREAD_COLOR) + } def reset(self): - self.episode_step = 0 - self.last_reward = 0 - self.last_score = 0 - self.kill_counter = 0 - # hit reset button and confirm - # self.check_for_button_and_click_it("needles/repeat.jpg") - # self.check_for_button_and_click_it("needles/reset.jpg") + self.observation = [] - self.dig_point(1800, 160, 600) - self.dig_point(1800, 1000, 300) - self.observation, screen = self.get_current_board_state() - return self.observation + def assess_playfield_and_make_move(self): - def shift_playfield(self, action): - self.episode_step += 1 - # move to indicated direction - self.action(action) - # get new field status new_observation, new_screenshot = self.get_current_board_state() - current_score = 0 - reward = 0 # wrong movement detection # last board state is same as actual if mse(new_observation, self.observation) == 0.0: - # no movement detected -> punish - if len(new_observation[new_observation == 0]) >= 1: - reward = -100 - else: - self.kill_counter = self.kill_counter + 1 - reward = -5 - else: - # calculate current board score - self.kill_counter = 0 - for e in range(0, 4, 1): - for i in range(0, 4, 1): - current_score = current_score + (2 ** new_observation[e][i] - 1) - bonus_for_empty_cells = len(new_observation[new_observation == 0]) - reward = current_score - self.last_score + bonus_for_empty_cells - self.last_score = current_score + # no movement detected -> blow explosives or reset + self.detonate_explosive_when_stuck(new_observation) + cv.waitKey(500) - if self.kill_counter >= 5: - self.kill_counter = 0 - done = True - else: - done = False + self.find_patterns_and_valid_moves(new_observation) self.observation = new_observation - return new_observation, reward, done - - def action(self, choice): - ''' - Gives us 4 total movement options. (0,1,2,3) - ''' - if choice == 0: - # right - self.move_to(1200, 598) - elif choice == 1: - # left - self.move_to(1000, 598) - elif choice == 2: - # up - self.move_to(1113, 498) - elif choice == 3: - # down - self.move_to(1113, 698) + return new_observation def move_to(self, x, y): point_src = (1113, 598) @@ -171,8 +134,8 @@ class Field: def get_current_board_state(self): try: # get an updated image of the game - #screenshot = self.capture_window.get_screenshot() - screenshot = cv.imread("field_farm.jpg") + screenshot = self.capture_window.get_screenshot() + #screenshot = cv.imread("field_farm.jpg") screenshot = screenshot[58:1134, 230:2113] # 1883,1076 # gray = cv.cvtColor(screenshot, cv.COLOR_BGR2GRAY) # thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)[1] @@ -214,7 +177,7 @@ class Field: # cv.waitKey(150) return data_coords, screenshot - def analyse_boardstate(self, state): + def find_patterns_and_valid_moves(self, state): for e in range(0, 8, 1): for i in range(0, 14, 1): if self.check_explosives(state, e, i): @@ -222,7 +185,7 @@ class Field: for e in range(0, 8, 1): for i in range(0, 14, 1): - for color in range(1, 6, 1): + for color in self.colors: if self.check_5_horizontal(state, e, i, color): return if self.check_5_vertical(state, e, i, color): @@ -230,11 +193,35 @@ class Field: for e in range(0, 8, 1): for i in range(0, 14, 1): - for color in range(1, 6, 1): + for color in self.colors: if self.check_3_horizontal(state, e, i, color): return if self.check_3_vertical(state, e, i, color): return + if self.check_3_with_gap(state, e, i, color): + return + + def detonate_explosive_when_stuck(self, state): + for e in range(0, 8, 1): + for i in range(0, 14, 1): + for explosive in self.explosives: + if self.local_pos_check(state, e, i, 0, 0, explosive): + dest_pt = self.get_click_point(self.data_coordinates[e, i]) + if self.local_pos_checks(state, e, i, 1, 0, self.colors): + src_pt = self.get_click_point(self.data_coordinates[e + 1, i]) + self.move_tile(src_pt, dest_pt) + elif self.local_pos_checks(state, e, i, 0, 1, self.colors): + src_pt = self.get_click_point(self.data_coordinates[e, i + 1]) + self.move_tile(src_pt, dest_pt) + elif self.local_pos_checks(state, e, i, -1, 0, self.colors): + src_pt = self.get_click_point(self.data_coordinates[e - 1, i]) + self.move_tile(src_pt, dest_pt) + elif self.local_pos_checks(state, e, i, 0, -1, self.colors): + src_pt = self.get_click_point(self.data_coordinates[e, i - 1]) + self.move_tile(src_pt, dest_pt) + else: + continue + return def check_explosives(self, state, e, i): for explosive in self.explosives: @@ -316,6 +303,46 @@ class Field: except: return False + def check_3_with_gap(self, state, e, i, color): + try: + # second color next to starting point + if i + 2 <= 13: + if state[e, i] == color and state[e, i + 2] == color: + # third upper + if e - 1 >= 0 and i + 1 <= 13: + #if state[e - 1, i - 1] == color and (state[e, i - 1] >= 1 and state[e, i - 1] <= 5): + if state[e - 1, i + 1] == color and (state[e, i + 1] in self.colors): + src_pt = self.get_click_point(self.data_coordinates[e - 1, i + 1]) + dest_pt = self.get_click_point(self.data_coordinates[e, i + 1]) + self.move_tile(src_pt, dest_pt) + return True + # third left lower + if e + 1 <= 7 and i + 1 <= 13: + if state[e + 1, i + 1] == color and (state[e, i + 1] in self.colors): + src_pt = self.get_click_point(self.data_coordinates[e + 1, i + 1]) + dest_pt = self.get_click_point(self.data_coordinates[e, i + 1]) + self.move_tile(src_pt, dest_pt) + return True + if e + 2 <= 7: + if state[e, i] == color and state[e + 2, i] == color: + # third upper + if e + 1 >= 0 and i + 1 <= 13: + #if state[e - 1, i - 1] == color and (state[e, i - 1] >= 1 and state[e, i - 1] <= 5): + if state[e + 1, i + 1] == color and (state[e + 1, i] in self.colors): + src_pt = self.get_click_point(self.data_coordinates[e + 1, i + 1]) + dest_pt = self.get_click_point(self.data_coordinates[e + 1, i]) + self.move_tile(src_pt, dest_pt) + return True + # third left lower + if e + 1 <= 7 and i - 1 >= 0: + if state[e + 1, i - 1] == color and (state[e + 1, i] in self.colors): + src_pt = self.get_click_point(self.data_coordinates[e + 1, i - 1]) + dest_pt = self.get_click_point(self.data_coordinates[e + 1, i]) + self.move_tile(src_pt, dest_pt) + return True + except: + return False + def check_3_horizontal(self, state, e, i, color): try: # second color next to starting point diff --git a/farm/maginent.jpg b/farm/maginent.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab83d917d48f07a4a48f7590125e18cc6371be09 GIT binary patch literal 7306 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 XQWjbGR}UMARVfQTb#|^!B+UH>-y2!I literal 0 HcmV?d00001 diff --git a/farm/main_farm.py b/farm/main_farm.py index 75087a6..1f25a98 100644 --- a/farm/main_farm.py +++ b/farm/main_farm.py @@ -24,8 +24,8 @@ def run(): continue - cords, screenshot = field.get_current_board_state() - field.analyse_boardstate(cords) + #cords, screenshot = field.get_current_board_state() + cords = field.assess_playfield_and_make_move() print(cords) cv.waitKey(1000)