from math import dist, sqrt import pygame from classes import minesweeper, system, bfs from random import randrange class AI: window:system.Window current_map:minesweeper.Map saper:minesweeper.Minesweeper the_way:list #jak True to można się poruszać strzałkami, jak False sam się porusza user_controlled=False def __init__(self, window, current_map, saper): self.window = window self.current_map = current_map self.saper = saper #co ma zrobić tylko na początku def ready(self): self.saper.set_map(self.current_map) self.bfs() #co ma robić przy każdym FPS'ie def updateFPS(self): pass #co ma zrobić przy każdym ruchu <------------------------- najważniejsze def updateTile(self, model): #aktualne pola (do debugu) sensor = self.saper.sensor() #print(sensor[0]) #print(sensor[1]) #print(sensor[2]) #print("-------") #podniesienie bomby jeśli jest jakaś na tym polu self.saper.pick_up(model) #poruszenie się if self.user_controlled: self.minesweeper_controls() return self.way_controls() def minesweeper_controls(self): keys = pygame.key.get_pressed() if keys[pygame.K_DOWN]: self.saper.move(0) elif keys[pygame.K_UP]: self.saper.move(180) elif keys[pygame.K_LEFT]: self.saper.move(270) elif keys[pygame.K_RIGHT]: self.saper.move(90) def chaos_controls(self): dir = randrange(4) if dir==0: self.saper.rotate("N") elif dir==1: self.saper.rotate("S") elif dir==2: self.saper.rotate("W") elif dir==3: self.saper.rotate("E") self.saper.move() def way_controls(self): if type(self.the_way) is list and len(self.the_way)>0: way = self.the_way.pop(0) if way=="move": self.saper.move() elif way=="left" or way=="right": self.saper.rotate(way) else: self.saper.rotate(way) self.saper.move() elif len(self.current_map.encounters)!=0: self.bfs() def bfs(self): def mojafunkcja(ileczasu, jakdaleko, jaktrudno, jakciezko): return ((200-ileczasu)+(200-jakdaleko*10))-jaktrudno*jakciezko def fitness(x, y, z, w): #funkcja do ewaluacji ans = mojafunkcja(x, y, z, w) return abs(ans-400) dists = [] # how long way is to all encounters from start([0, 0]) ranked = [] for encounter in self.current_map.encounters: dists.append(abs(self.saper.position_x - encounter.position_x) + abs(self.saper.position_y - encounter.position_y)) for a in self.current_map.mines: ranked.append((fitness(a.explosion_timer, (abs(self.saper.position_x - encounter.position_x) + abs(self.saper.position_y - encounter.position_y)), a.difficulty, a.weight), a)) ranked.sort() #posortowana lista najlepszych wyborów dla min if ranked: print(ranked[0][0]) indx = ranked[0][1].position_x indy = ranked[0][1].position_y else: ind = dists.index(min(dists)) indx = self.current_map.encounters[ind].position_x indy = self.current_map.encounters[ind].position_y goal_state = [indx, indy] print(f'We go to {goal_state}') find_path = bfs.BFS(self.saper, self.window) tmp = find_path.graphsearch([], [], bfs.BFS.successor, goal_state) #print(f'tmp = {tmp}') if tmp is None: raise Exception("Error, path does not exist") else: self.the_way = tmp