From 62c3409aa16300b158bcc7622997a5b85503f56f Mon Sep 17 00:00:00 2001 From: Yurii Date: Sat, 16 Apr 2022 00:11:24 +0200 Subject: [PATCH] zrobione obracanie i jedzie tylko do przodu --- classes/ai.py | 7 ++- classes/bfs.py | 153 ++++++++++++++++++++++++++++++++++++------------ classes/node.py | 29 ++++----- main.py | 62 ++++++++++---------- 4 files changed, 166 insertions(+), 85 deletions(-) diff --git a/classes/ai.py b/classes/ai.py index 41c5ca7..d41bddf 100644 --- a/classes/ai.py +++ b/classes/ai.py @@ -87,12 +87,13 @@ class AI: def bfs(self): - dists = [] + dists = [] # how long way is to all mines from start([0, 0]) for mine in self.current_map.mines: dists.append(sqrt((self.saper.position_x-mine.position_x)**2 + (self.saper.position_y-mine.position_y)**2)) - ind = dists.index(min(dists)) + # print(dists) + ind = dists.index(min(dists)) # choose nearest mine goal_state = [self.current_map.mines[ind].position_x, self.current_map.mines[ind].position_y] - print(goal_state) + print(f'We go to {goal_state}') find_path = bfs.BFS(self.saper, self.window) self.the_way = find_path.graphsearch([], [], bfs.BFS.successor, goal_state) \ No newline at end of file diff --git a/classes/bfs.py b/classes/bfs.py index c0e3088..dd287e0 100644 --- a/classes/bfs.py +++ b/classes/bfs.py @@ -15,19 +15,108 @@ class BFS: def successor(self, current_position): new_nodes = [] neighbours_list = self.agent.sensor(current_position[0], current_position[1]) + #print(f'Current position {current_position}') #print(neighbours_list[0]) #print(neighbours_list[1]) #print(neighbours_list[2]) - if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: - new_nodes.append([current_position[0] - 1, current_position[1]]) - if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: - new_nodes.append([current_position[0], current_position[1] + 1]) - if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: - new_nodes.append([current_position[0] + 1, current_position[1]]) - if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: - new_nodes.append([current_position[0],current_position[1] - 1]) + # if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # new_nodes.append([current_position[0] - 1, current_position[1]]) + # if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # new_nodes.append([current_position[0], current_position[1] + 1]) + # if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # new_nodes.append([current_position[0] + 1, current_position[1]]) + # if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # new_nodes.append([current_position[0],current_position[1] - 1]) + + # if current_position[2] == 0: # jesli patrzy na polnoc + # if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('forward', [current_position[0] - 1, current_position[1], 0]) + # new_nodes.append(tmp) + # if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('left', [current_position[0],current_position[1], 270]) + # new_nodes.append(tmp) + # if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('right', [current_position[0], current_position[1], 90]) + # new_nodes.append(tmp) + # + # if current_position[2] == 90: # jesli patrzy na wschod + # if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('forward', [current_position[0], current_position[1] + 1, 90]) + # new_nodes.append(tmp) + # if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('left', [current_position[0], current_position[1], 0]) + # new_nodes.append(tmp) + # if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('right', [current_position[0], current_position[1], 180]) + # new_nodes.append(tmp) + # + # if current_position[2] == 180: # jesli patczy na poludzie + # if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('forward', [current_position[0] + 1, current_position[1], 180]) + # new_nodes.append(tmp) + # if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('left', [current_position[0], current_position[1], 90]) + # new_nodes.append(tmp) + # if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('right', [current_position[0],current_position[1], 270]) + # new_nodes.append(tmp) + # + # if current_position[2] == 270: # jesli patczy na wschod + # if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('forward', [current_position[0],current_position[1] - 1, 270]) + # new_nodes.append(tmp) + # if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('left', [current_position[0], current_position[1], 180]) + # new_nodes.append(tmp) + # if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + # tmp = ('right', [current_position[0], current_position[1], 0]) + # new_nodes.append(tmp) + + if current_position[2] == 180: # jesli patrzy na polnoc + if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('forward', [current_position[0], current_position[1] - 1, 180]) + new_nodes.append(tmp) + if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('left', [current_position[0],current_position[1], 270]) + new_nodes.append(tmp) + if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('right', [current_position[0], current_position[1], 90]) + new_nodes.append(tmp) + + if current_position[2] == 90: # jesli patrzy na wschod + if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('forward', [current_position[0] + 1, current_position[1], 90]) + new_nodes.append(tmp) + if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('left', [current_position[0], current_position[1], 180]) + new_nodes.append(tmp) + if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('right', [current_position[0], current_position[1], 0]) + new_nodes.append(tmp) + + if current_position[2] == 0: # jesli patczy na poludzie + if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('forward', [current_position[0], current_position[1] + 1, 0]) + new_nodes.append(tmp) + if neighbours_list[1][2] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('left', [current_position[0], current_position[1], 90]) + new_nodes.append(tmp) + if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('right', [current_position[0],current_position[1], 270]) + new_nodes.append(tmp) + + if current_position[2] == 270: # jesli patczy na wschod + if neighbours_list[1][0] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('forward', [current_position[0] - 1,current_position[1], 270]) + new_nodes.append(tmp) + if neighbours_list[2][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('left', [current_position[0], current_position[1], 0]) + new_nodes.append(tmp) + if neighbours_list[0][1] not in ['wall', 'cliff_south', 'cliff_east', 'cliff_north', 'cliff_west']: + tmp = ('right', [current_position[0], current_position[1], 180]) + new_nodes.append(tmp) return new_nodes @@ -42,12 +131,13 @@ class BFS: def graphsearch(self, fringe, explored, succ, goaltest): self.window.pause(True) - positiont_at_beginning = [self.agent.position_x, self.agent.position_y, self.agent.rotation_degrees] # x, y, gdzie_patczy - final_action_list = [] - root = node.Node(None, None, positiont_at_beginning[:2]) # parent, action, position + positiont_at_beginning = [self.agent.position_x, self.agent.position_y, self.agent.rotation_degrees] # x, y, gdzie_patczy + print(f'Position {positiont_at_beginning}') + final_action_list = [] # lista co ma robic zeby dojechac do miny + root = node.Node(None, None, positiont_at_beginning) # parent, action, position counter = 0 heapq.heappush(fringe, (counter, root)) - visited_position = [] + #visited_position = [] while len(fringe) != 0: @@ -56,26 +146,18 @@ class BFS: if len(fringe) == 0: return False - break tmp_node = heapq.heappop(fringe) # node - #print(f'my parent is {tmp_node[1].get_parent()}') - tmp_node_position = tmp_node[1].get_position() + tmp_node_position = tmp_node[1].get_position() # x, y , gdzie patczy + #print(f'Position before succ {tmp_node_position}') - #print(f'Position of our node {tmp_node_position[:2]}') - - visited_position.append(tmp_node_position[:2]) - #print(f'visited position: {visited_position}') + #visited_position.append(tmp_node_position) + explored.append(tmp_node_position) if tmp_node_position[:2] == goaltest: - #print(' we find node') - # print(visited_position) + print('Find') - #print(fringe) - #break while tmp_node[1].get_parent() is not None: - #print('sdfhdfg') - #print(tmp_node[1].get_parent()[1].get_position()) final_action_list.append(tmp_node[1].get_action()) tmp_node = tmp_node[1].get_parent() final_action_list.reverse() @@ -83,21 +165,18 @@ class BFS: self.window.pause(False) return final_action_list + # nie wiem na razie po co to + # chyba visited_position lepszy odpowiednik + # explored.append(tmp_node) - explored.append(tmp_node) - neighbours_list_of_our_node = self.successor(tmp_node_position[:2]) + neighbours_list_of_our_node = self.successor(tmp_node_position) # lista możliwych akcij #print(neighbours_list_of_our_node) + for node_ in neighbours_list_of_our_node: - # jesli pozucja wezla nie jest w fringe i nie jest w explored - if [node_[0], node_[1]] not in visited_position and node_[0] >= 0 and node_[1] >=0: + # jesli pozucja wezla nie jest w fringe i nie jest w visited + if [node_[1][0], node_[1][1], node_[1][2]] not in explored and node_[1][0] >= 0 and node_[1][1] >=0: counter += 1 - #print([node_[0], node_[1]]) - x = node.Node(tmp_node, None, [node_[0], node_[1]]) # action + x = node.Node(tmp_node, node_[0], node_[1]) # action heapq.heappush(fringe, (counter, x)) - self.window.draw_search([self.agent.position_x, self.agent.position_y], [node_[0], node_[1]]) - #time.sleep(0.01) - - - - + self.window.draw_search([self.agent.position_x, self.agent.position_y], [node_[1][0], node_[1][1]]) diff --git a/classes/node.py b/classes/node.py index fa3b994..ab269da 100644 --- a/classes/node.py +++ b/classes/node.py @@ -1,22 +1,23 @@ class Node: def __init__(self, parent, action, state_array): self.parent = parent + self.action = action self.position = state_array - if parent: - parent_pos = parent[1].get_position() - diff = [state_array[0] - parent_pos[0], state_array[1] - parent_pos[1]] - if diff[0]==1: - action="E" - elif diff[0]==-1: - action="W" - elif diff[1]==1: - action="S" - elif diff[1]==-1: - action="N" - self.action=action - else: - self.action=action + # if parent: + # parent_pos = parent[1].get_position() + # diff = [state_array[0] - parent_pos[0], state_array[1] - parent_pos[1]] + # if diff[0]==1: + # action="E" + # elif diff[0]==-1: + # action="W" + # elif diff[1]==1: + # action="S" + # elif diff[1]==-1: + # action="N" + # self.action=action + # else: + # self.action=action def get_position(self): return self.position diff --git a/main.py b/main.py index 2072895..00ffb7c 100644 --- a/main.py +++ b/main.py @@ -1,71 +1,71 @@ -#pygame - biblioteka do symulacji graficznych +# pygame - biblioteka do symulacji graficznych import pygame -#system - klasy związane z pygame -#minesweeper - klasy związane z samym saperem -#ai - klasa wykonująca ruchy sapera +# system - klasy związane z pygame +# minesweeper - klasy związane z samym saperem +# ai - klasa wykonująca ruchy sapera from classes import system, minesweeper, ai -#ustalenie wielkości pojedyńczych kawałków mapy, oraz wielkości mapy +# ustalenie wielkości pojedyńczych kawałków mapy, oraz wielkości mapy TILE_SIZE = 64 TILES_X = int(12) TILES_Y = int(10) -#wł/wył muzyki -MUSIC=True +# wł/wył muzyki +MUSIC = True -#ustalenie FPS +# ustalenie FPS FPS = 60 + def main(): if MUSIC: pygame.mixer.init() pygame.mixer.Channel(0).play(pygame.mixer.Sound("assets/music.ogg"), -1) - - #utworzenie okna do gry - window = system.Window(TILE_SIZE*TILES_X, TILE_SIZE*TILES_Y, "Intelligent Minesweeper", "icon.png") - - #utworzenie objektu mapy, wygenerowanie jej i narysowanie na ekranie + # utworzenie okna do gry + window = system.Window(TILE_SIZE * TILES_X, TILE_SIZE * TILES_Y, "Intelligent Minesweeper", "icon.png") + + # utworzenie objektu mapy, wygenerowanie jej i narysowanie na ekranie map = minesweeper.Map(window, TILE_SIZE, TILES_X, TILES_Y) map.generate() map.draw_tiles() - - #utworzenie sapera - saper = minesweeper.Minesweeper(0,0, TILE_SIZE) - #pierwszy render + # utworzenie sapera + saper = minesweeper.Minesweeper(0, 0, TILE_SIZE) + + # pierwszy render map.draw_tiles() map.draw_objects() saper.draw(window.window, 0.1) pygame.display.update() - #utworzenie objektu klasy AI + # utworzenie objektu klasy AI AI = ai.AI(window, map, saper) - #wykonanie funkcji ready() AI + # wykonanie funkcji ready() AI AI.ready() - - #główna pętla + + # główna pętla game_loop = True clock = pygame.time.Clock() while game_loop: - #wdrożenie FPS, delta - czas od ostatniej klatki + # wdrożenie FPS, delta - czas od ostatniej klatki delta = clock.tick(FPS) - - #wykonanie funkcji update() AI + + # wykonanie funkcji update() AI AI.updateFPS() - if saper.offset_x==0 and saper.offset_y==0: + if saper.offset_x == 0 and saper.offset_y == 0: AI.updateTile() - - #narysowanie terenu i obiektów + + # narysowanie terenu i obiektów map.draw_tiles() map.draw_objects() saper.draw(window.window, delta) - #odświeżenie ekranu + # odświeżenie ekranu pygame.display.update() - - #sprawdzanie różnych interakcji użytkownika + + # sprawdzanie różnych interakcji użytkownika for event in pygame.event.get(): if event.type == pygame.QUIT: game_loop = False @@ -73,4 +73,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main()