added color switch and reset trigger

This commit is contained in:
2022-10-14 17:05:44 +02:00
parent 74c06fb6e9
commit 09d99aeafd

View File

@@ -46,12 +46,14 @@ class Field:
reset_confirm = cv.imread("reset_confirm.jpg", cv.IMREAD_COLOR) reset_confirm = cv.imread("reset_confirm.jpg", cv.IMREAD_COLOR)
reset_counter = 0 reset_counter = 0
colors_at_standard = True colors_at_standard = True
needles = {}
hsh_needles = {}
explosives = [] explosives = []
explosives.append(RAINBOW) explosives.append(RAINBOW)
#explosives.append(ARROW_RIGHT) explosives.append(ARROW_RIGHT)
#explosives.append(ARROW_DOWN) explosives.append(ARROW_DOWN)
#explosives.append(BIGBOMB) explosives.append(BIGBOMB)
#explosives.append(BOMB) explosives.append(BOMB)
colors = [] colors = []
colors.append(GREEN) colors.append(GREEN)
colors.append(YELLOW) colors.append(YELLOW)
@@ -86,41 +88,7 @@ class Field:
# initialize the StunVision class # initialize the StunVision class
self.vision_stun = Vision() self.vision_stun = Vision()
self.needles = {GREEN: cv.imread("green.jpg", cv.IMREAD_COLOR), self.set_color_order((GREEN, YELLOW, RED, BLUE, PURPLE))
YELLOW: cv.imread("yellow.jpg", cv.IMREAD_COLOR),
RED: cv.imread("red.jpg", cv.IMREAD_COLOR),
BLUE: cv.imread("blue.jpg", cv.IMREAD_COLOR),
PURPLE: cv.imread("purple.jpg", cv.IMREAD_COLOR),
RAINBOW: cv.imread("rainbow.jpg", cv.IMREAD_COLOR),
#BIGBOMB: cv.imread("bigbomb.jpg", cv.IMREAD_COLOR),
#BOMB: cv.imread("bomb.jpg", cv.IMREAD_COLOR),
#ARROW_DOWN: cv.imread("arrow_down.jpg", cv.IMREAD_COLOR),
#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),
# BURGER: cv.imread("burger.jpg", cv.IMREAD_COLOR),
# GOLDBAR: cv.imread("burger.jpg", cv.IMREAD_COLOR),
# PAB1: cv.imread("pab1.jpg", cv.IMREAD_COLOR),
MAGINENT: cv.imread("maginent.jpg", cv.IMREAD_COLOR),
CHEMTRANT: cv.imread("chemtrant.jpg", cv.IMREAD_COLOR),
TENESENT: cv.imread("tenesent.jpg", cv.IMREAD_COLOR),
CIBUTRANT: cv.imread("cibutrant.jpg", cv.IMREAD_COLOR),
ARTISENT: cv.imread("artisent.jpg", cv.IMREAD_COLOR)
}
self.hsh_needles = {GREEN: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
YELLOW: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
PURPLE: HsvFilter(120, 45, 0, 170, 255, 255, 0, 0, 0, 0),
BLUE: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
RED: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
RAINBOW: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
MAGINENT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
CHEMTRANT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
TENESENT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
CIBUTRANT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0),
ARTISENT: HsvFilter(0, 0, 0, 179, 255, 255, 0, 0, 0, 0)
}
def reset(self): def reset(self):
self.observation = [] self.observation = []
@@ -134,10 +102,10 @@ class Field:
order[4]: cv.imread("purple.jpg", cv.IMREAD_COLOR), order[4]: cv.imread("purple.jpg", cv.IMREAD_COLOR),
RAINBOW: cv.imread("rainbow.jpg", cv.IMREAD_COLOR), RAINBOW: cv.imread("rainbow.jpg", cv.IMREAD_COLOR),
#BIGBOMB: cv.imread("bigbomb.jpg", cv.IMREAD_COLOR), BIGBOMB: cv.imread("bigbomb.jpg", cv.IMREAD_COLOR),
#BOMB: cv.imread("bomb.jpg", cv.IMREAD_COLOR), BOMB: cv.imread("bomb.jpg", cv.IMREAD_COLOR),
#ARROW_DOWN: cv.imread("arrow_down.jpg", cv.IMREAD_COLOR), ARROW_DOWN: cv.imread("arrow_down.jpg", cv.IMREAD_COLOR),
#ARROW_RIGHT: cv.imread("arrow_right.jpg", cv.IMREAD_COLOR) ARROW_RIGHT: cv.imread("arrow_right.jpg", cv.IMREAD_COLOR),
# ROCK_1: cv.imread("rock1.jpg", cv.IMREAD_COLOR), # ROCK_1: cv.imread("rock1.jpg", cv.IMREAD_COLOR),
# ROCK_2: cv.imread("rock2.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),
@@ -174,7 +142,12 @@ class Field:
# no movement detected -> blow explosives or reset # no movement detected -> blow explosives or reset
self.reset_counter += 1 self.reset_counter += 1
if self.reset_counter >= 3: if self.reset_counter == 1:
pass
elif self.reset_counter == 2:
self.detonate_explosive_when_stuck(new_observation)
return
elif self.reset_counter >= 3:
screenshot = self.capture_window.get_screenshot() screenshot = self.capture_window.get_screenshot()
if self.check_for_button_and_execute(screenshot, self.reset_board): if self.check_for_button_and_execute(screenshot, self.reset_board):
cv.waitKey(500) cv.waitKey(500)
@@ -190,8 +163,8 @@ class Field:
self.colors_at_standard = True self.colors_at_standard = True
self.reset_counter = 0 self.reset_counter = 0
return return
self.detonate_explosive_when_stuck(new_observation) else:
return return
self.find_patterns_and_valid_moves(new_observation) self.find_patterns_and_valid_moves(new_observation)
self.observation = new_observation self.observation = new_observation
@@ -561,7 +534,6 @@ class Field:
return score return score
def is_direction_in_bounce_and_same_color(self, state, loc, color): def is_direction_in_bounce_and_same_color(self, state, loc, color):
x, y = loc x, y = loc
if x <= 7 and x >= 0 and y <= 13 and y >= 0: if x <= 7 and x >= 0 and y <= 13 and y >= 0:
@@ -585,198 +557,6 @@ class Field:
continue continue
return False return False
def check_5_horizontal(self, state, e, i, color):
try:
#
if state[e, i] == color and state[e, i + 1] == color and state[e, i + 3] == color and state[
e, i + 4] == color:
if state[e, i + 2] <= 0 or state[e, i + 2] >= 6:
return False
#
if e - 1 >= 0 and i + 2 <= 13:
if state[e - 1, i + 2] == color:
return True
return False
except:
return False
def check_5_vertical(self, state, e, i, color):
try:
#
if state[e, i] == color and state[e + 1, i] == color and state[e + 3, i] == color and state[
e + 4, i] == color:
if state[e + 2, i] <= 0 or state[e + 2, i] >= 6:
return False
# third left upper
if e + 2 <= 7 and i - 1 >= 0:
if state[e + 2, i - 1] == color:
print("upper left", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e + 2, i - 1])
dest_pt = self.get_click_point(self.data_coordinates[e + 2, i])
self.move_tile(src_pt, dest_pt)
return True
if e + 2 <= 7 and i + 1 <= 13:
if state[e + 2, i + 1] == color:
print("upper left", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e + 2, i + 1])
dest_pt = self.get_click_point(self.data_coordinates[e + 2, i])
self.move_tile(src_pt, dest_pt)
return True
return False
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
if state[e, i] == color and state[e, i + 1] == color:
# third left upper
if e - 1 >= 0 and i - 1 >= 0:
if state[e - 1, i - 1] == color and (state[e, i - 1] in self.colors):
print("upper left", color, e, i)
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 >= 0:
if state[e + 1, i - 1] == color and (state[e, i - 1] in self.colors):
print("lower left", color, e, i)
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 with gap
if i - 2 >= 0:
if state[e, i - 2] == color and (state[e, i - 1] in self.colors):
print("left gap ", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e, i - 2])
dest_pt = self.get_click_point(self.data_coordinates[e, i - 1])
self.move_tile(src_pt, dest_pt)
return True
# third right upper
if e - 1 >= 0 and i + 2 <= 13:
if state[e - 1, i + 2] == color and (state[e, i + 2] in self.colors):
print("upper right", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e - 1, i + 2])
dest_pt = self.get_click_point(self.data_coordinates[e, i + 2])
self.move_tile(src_pt, dest_pt)
return True
# third right lower
if e + 1 <= 7 and i + 2 <= 13:
if state[e + 1, i + 2] == color and (state[e, i + 2] in self.colors):
print("upper lower", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e + 1, i + 2])
dest_pt = self.get_click_point(self.data_coordinates[e, i + 2])
self.move_tile(src_pt, dest_pt)
return True
# third right with gap
if i + 3 <= 13:
if state[e, i + 3] == color and (state[e, i + 2] in self.colors):
print("right gap ", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e, i + 3])
dest_pt = self.get_click_point(self.data_coordinates[e, i + 2])
self.move_tile(src_pt, dest_pt)
return True
except:
return False
def check_3_vertical(self, state, e, i, color):
try:
# second color next to starting point o
if state[e, i] == color and state[e + 1, i] == color:
# third left upper
if e - 1 >= 0 and i - 1 >= 0:
if state[e - 1, i - 1] == color and (state[e - 1, i] in self.colors):
print("upper left", color, e, i)
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 + 2 <= 7 and i - 1 >= 0:
if state[e + 2, i - 1] == color and (state[e + 2, i] in self.colors):
print("lower left", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e + 2, i - 1])
dest_pt = self.get_click_point(self.data_coordinates[e + 2, i])
self.move_tile(src_pt, dest_pt)
return True
# third right upper
if e - 1 >= 0 and i + 1 <= 13:
if state[e - 1, i + 1] == color and (state[e - 1, i] in self.colors):
print("upper right", color, e, i)
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 right lower
if e + 2 <= 7 and i + 1 <= 13:
if state[e + 2, i + 1] == color and (state[e + 2, i] in self.colors):
print("upper lower", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e + 2, i + 1])
dest_pt = self.get_click_point(self.data_coordinates[e + 2, i])
self.move_tile(src_pt, dest_pt)
return True
# third upper with gap
if e - 2 >= 0:
if state[e - 2, i] == color and (state[e - 1, i] in self.colors):
print("upper gap ", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e - 2, i])
dest_pt = self.get_click_point(self.data_coordinates[e - 1, i])
self.move_tile(src_pt, dest_pt)
return True
# third lower with gap
if e + 3 <= 7:
if state[e + 3, i] == color and (state[e + 2, i] in self.colors):
print("lower gap ", color, e, i)
src_pt = self.get_click_point(self.data_coordinates[e + 3, i])
dest_pt = self.get_click_point(self.data_coordinates[e + 2, i])
self.move_tile(src_pt, dest_pt)
return True
except:
return False
def move_tile(self, point_source, point_dest): def move_tile(self, point_source, point_dest):
offset_left = 230 offset_left = 230
offset_down = 58 offset_down = 58