diff --git a/__pycache__/agent.cpython-39.pyc b/__pycache__/agent.cpython-39.pyc index 554b1b5..b585069 100644 Binary files a/__pycache__/agent.cpython-39.pyc and b/__pycache__/agent.cpython-39.pyc differ diff --git a/__pycache__/astar.cpython-39.pyc b/__pycache__/astar.cpython-39.pyc new file mode 100644 index 0000000..55b9af0 Binary files /dev/null and b/__pycache__/astar.cpython-39.pyc differ diff --git a/__pycache__/bfs.cpython-39.pyc b/__pycache__/bfs.cpython-39.pyc index 4cb36bf..7e95420 100644 Binary files a/__pycache__/bfs.cpython-39.pyc and b/__pycache__/bfs.cpython-39.pyc differ diff --git a/__pycache__/config.cpython-39.pyc b/__pycache__/config.cpython-39.pyc index 1d156d6..4585920 100644 Binary files a/__pycache__/config.cpython-39.pyc and b/__pycache__/config.cpython-39.pyc differ diff --git a/__pycache__/genetic.cpython-39.pyc b/__pycache__/genetic.cpython-39.pyc new file mode 100644 index 0000000..06e04ed Binary files /dev/null and b/__pycache__/genetic.cpython-39.pyc differ diff --git a/__pycache__/map_add_ons.cpython-39.pyc b/__pycache__/map_add_ons.cpython-39.pyc index a75d2a1..461ef46 100644 Binary files a/__pycache__/map_add_ons.cpython-39.pyc and b/__pycache__/map_add_ons.cpython-39.pyc differ diff --git a/__pycache__/mobs.cpython-39.pyc b/__pycache__/mobs.cpython-39.pyc index 62dd100..0e80dd9 100644 Binary files a/__pycache__/mobs.cpython-39.pyc and b/__pycache__/mobs.cpython-39.pyc differ diff --git a/__pycache__/nn.cpython-39.pyc b/__pycache__/nn.cpython-39.pyc new file mode 100644 index 0000000..7f22e64 Binary files /dev/null and b/__pycache__/nn.cpython-39.pyc differ diff --git a/genetic.py b/genetic.py new file mode 100644 index 0000000..782dc08 --- /dev/null +++ b/genetic.py @@ -0,0 +1,52 @@ +# wygenerowanie populacji polozenia mobow na mapie - Archer, Infantry, Flower, Rocks, Grass, Blank +# Fitness +# Crossover +# Mutation + + + +import random +import pygame + + +TILE_SIZE = 64 +TYPES = ['A', 'I', "F", 'R', 'G', 'B'] +MAP_TILES_LIST = list() +population = list() +max_population = 168 - 1 +population_size = 50 + +class Genetic(): + + def generate_population(): + if population_size > 168: + print("GENETIC: Podana populacja przekracza limit miejsc na mapie") + pygame.quit() + + for i in range(155): + MAP_TILES_LIST.append(i) + random.shuffle(MAP_TILES_LIST) + if 14 in MAP_TILES_LIST: + MAP_TILES_LIST.remove(14) + if 131 in MAP_TILES_LIST: + MAP_TILES_LIST.remove(131) + + for i in range(population_size): + tile = MAP_TILES_LIST.pop() + type = random.choice(TYPES) + object = (tile,type) + population.append(object) + + if type == 'A': + TYPES.remove('A') + if type == 'I': + TYPES.remove('I') + + print(population) + return population + + def get_cell_x_y_cord(x,y): + cell_x = x // TILE_SIZE + cell_y = y // TILE_SIZE + return cell_x, cell_y + diff --git a/main.py b/main.py index d3c5f7c..6a7903e 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ from mobs import * from bfs import * from nn import * from astar import * +from genetic import * class Game: @@ -29,6 +30,7 @@ class Game: self.bfs = Bfs(self) self.nn = NeuralN() self.astar = Astar(self) + self.genetic = Genetic() self.cell_costs = [[1 for _ in range(TILE_SIZE)] for _ in range(TILE_SIZE)] self.obstacles = [[False for _ in range(TILE_SIZE)] for _ in range(TILE_SIZE)] @@ -49,27 +51,41 @@ class Game: self.little_rock_sprites = pygame.sprite.LayeredUpdates() self.agent = Agent(self,1,1) - self.archer_ork = Archer_ork(self,10,10) - self.obstacles[10][10] = True - self.bfs.enemy_cells.append(self.bfs.get_cell_number(self.archer_ork.x,self.archer_ork.y)) - self.infantry_ork = Infantry_ork(self,10,4) - self.obstacles[10][4] = True - self.bfs.enemy_cells.append(self.bfs.get_cell_number(self.infantry_ork.x,self.infantry_ork.y)) - self.sauron = Sauron(self, 1, 10) self.obstacles[1][10] = True self.bfs.enemy_cells.append(self.bfs.get_cell_number(self.sauron.x,self.sauron.y)) - self.flower = Health_flower(self, 8,2) + + + self.list_object = list() + self.list_object = Genetic.generate_population() + l = len(self.list_object) + while l > 0: + obj = self.list_object.pop() + x,y = self.bfs.get_coordinates(obj[0]) + cell_x, cell_y = Genetic.get_cell_x_y_cord(x,y) + l=l-1 + if obj[1] == 'A': + self.archer_ork = Archer_ork(self,cell_x,cell_y) + self.obstacles[cell_x][cell_y] = True + self.bfs.enemy_cells.append(self.bfs.get_cell_number(self.archer_ork.x,self.archer_ork.y)) + if obj[1] == 'I': + self.infantry_ork = Infantry_ork(self,cell_x,cell_y) + self.obstacles[cell_x][cell_y] = True + self.bfs.enemy_cells.append(self.bfs.get_cell_number(self.infantry_ork.x,self.infantry_ork.y)) + if obj[1] == 'F': + self.flower = Health_flower(self,cell_x,cell_y) + if obj[1] == 'R': + self.rock = Rocks(self,cell_x,cell_y) + self.obstacles[cell_x][cell_y] = True + self.bfs.wall_cells.append(self.bfs.get_cell_number(self.rock.x,self.rock.y)) + if obj[1] == 'G': + self.grass = Grass(self,cell_x,cell_y) + self.cell_costs[cell_x][cell_y] = 5 + if obj[1] == 'B': + continue + - for y in range (2,5): - for x in range (2): - self.grass = Grass(self,x,y) - self.cell_costs[x][y] = 5 - for y in range(5): - self.rock = Rocks(self,3,y) - self.obstacles[3][y] = True - self.bfs.wall_cells.append(self.bfs.get_cell_number(self.rock.x,self.rock.y)) def update(self): @@ -92,6 +108,14 @@ class Game: mouse_presses = pygame.mouse.get_pressed() if mouse_presses[0]: + gx = self.archer_ork.x + gy = self.archer_ork.y + a_cell_x, a_cell_y = Genetic.get_cell_x_y_cord(gx,gy) + gx2 = self.infantry_ork.x + gy2 = self.infantry_ork.y + i_cell_x, i_cell_y = Genetic.get_cell_x_y_cord(gx2,gy2) + + x = self.sauron.x y = self.sauron.y goal = x//TILE_SIZE,y//TILE_SIZE @@ -100,8 +124,8 @@ class Game: prediction = "SAURON" while True: #do poprawienia poprawne rozpoznawanie póki co nie będzie działać dobrze, program się będzie zawieszać if prediction == "SAURON" and self.agent.level < 3: - x = self.archer_ork.x - y = self.archer_ork.y + x = self.archer_ork.x, + y = self.archer_ork.y, goal = x//TILE_SIZE,y//TILE_SIZE mob_image = self.archer_ork.image_path prediction = self.prediction_road(x,y,mob_image) @@ -111,7 +135,7 @@ class Game: self.move_agent(self.astar.a_star(goal)) elif prediction == "ORK_INFANTRY": - self.obstacles[10][4] = False + self.obstacles[i_cell_x][i_cell_y] = False self.move_agent(self.astar.a_star(goal)) if self.agent.current_health < self.agent.max_health: goal = (self.flower.x//TILE_SIZE, self.flower.y//TILE_SIZE) @@ -123,13 +147,13 @@ class Game: prediction = self.prediction_road(x,y,mob_image) prediction = "SAURON" elif prediction == "ORK_ARCHER": - self.obstacles[10][10] = False + self.obstacles[a_cell_x][a_cell_y] = False self.move_agent(self.astar.a_star(goal)) if self.agent.current_health < self.agent.max_health: goal = (self.flower.x//TILE_SIZE, self.flower.y//TILE_SIZE) self.move_agent(self.astar.a_star(goal)) - x = self.infantry_ork.x - y = self.infantry_ork.y + x = self.infantry_ork.x, + y = self.infantry_ork.y, goal = x//TILE_SIZE,y//TILE_SIZE mob_image = self.infantry_ork.image_path prediction = self.prediction_road(x,y,mob_image)