random first population - herbs random spawn works

This commit is contained in:
Mateusz 2020-05-28 23:57:27 +02:00
parent cf0a4be82f
commit 14850cd230
6 changed files with 41 additions and 169 deletions

View File

@ -459,155 +459,5 @@
"y": 15 "y": 15
}, },
"isPickupable" : false "isPickupable" : false
},
{
"name" : "herb1",
"position" : {
"x": 12,
"y": 2
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb2",
"position" : {
"x": 16,
"y": 2
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb3",
"position" : {
"x": 17,
"y": 5
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb4",
"position" : {
"x": 14,
"y": 7
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb5",
"position" : {
"x": 17,
"y": 17
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb6",
"position" : {
"x": 13,
"y": 17
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb7",
"position" : {
"x": 5,
"y": 15
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb8",
"position" : {
"x": 2,
"y": 9
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb9",
"position" : {
"x": 8,
"y": 5
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
},
{
"name" : "herb10",
"position" : {
"x": 11,
"y": 10
},
"isPickupable": true,
"effect" : {
"hp" : 0,
"stamina" : 0,
"thirst" : 0,
"hunger" : 0
},
"type" : "herb"
} }
] ]

View File

@ -5,8 +5,6 @@ from src.AI.GaTravelingForHerbs.GeneticAlgorithm import GeneticAlgorithm
START_COORD = [(6, 2)] START_COORD = [(6, 2)]
END_COORD = [(10, 7)] END_COORD = [(10, 7)]
COORDS = [(12, 2), (16, 2), (17, 5), (14, 7), (17, 17), (13, 17), (5, 15), (2, 9), (8, 5), (11, 10)]
class Traveling: class Traveling:
def __init__(self, coords): def __init__(self, coords):

View File

@ -251,5 +251,9 @@ class Entity(pygame.sprite.Sprite):
# If A* has ben called, move the entity # If A* has ben called, move the entity
self.updateEntityCoords() self.updateEntityCoords()
def __str__(self): # def __str__(self):
return "Entity - ID:{}, pos:({}x, {}y)".format(self.id, self.x, self.y) # return "Entity - ID:{}, pos:({}x, {}y)".format(self.id, self.x, self.y)
def __repr__(self):
coords = (self.x, self.y)
return str(coords)

View File

@ -1,8 +1,10 @@
import json import json
import random
from os import path from os import path
from pathlib import Path from pathlib import Path
import os import os
from random import sample from random import sample
from random import shuffle
import pygame import pygame
@ -13,7 +15,7 @@ from src.AI.DecisionTrees.TestDecisionTree import testDecisionTree
from src.AI.DecisionTrees.projectSpecificClasses.SurvivalClassification import SurvivalClassification from src.AI.DecisionTrees.projectSpecificClasses.SurvivalClassification import SurvivalClassification
from src.AI.GA import geneticAlgorithm from src.AI.GA import geneticAlgorithm
from src.AI.GaTravelingForHerbs.GeneticAlgorithm import GeneticAlgorithm from src.AI.GaTravelingForHerbs.GeneticAlgorithm import GeneticAlgorithm
from src.AI.GaTravelingForHerbs.Traveling import Traveling, START_COORD, COORDS, END_COORD from src.AI.GaTravelingForHerbs.Traveling import Traveling, START_COORD, END_COORD
from src.entities.Player import Player from src.entities.Player import Player
from src.game.EventManager import EventManager from src.game.EventManager import EventManager
from src.game.Map import Map from src.game.Map import Map
@ -410,6 +412,7 @@ class Game:
self.screen = Screen(self, self.config["window"]) self.screen = Screen(self, self.config["window"])
print("OK") print("OK")
# Initialize map
self.initializeMap(filesPath) self.initializeMap(filesPath)
# Initialize the player # Initialize the player
@ -417,25 +420,23 @@ class Game:
self.map.addEntity(self.player, DONTADD=True) self.map.addEntity(self.player, DONTADD=True)
self.eventManager = EventManager(self, self.player) self.eventManager = EventManager(self, self.player)
firstGeneration = [Traveling(START_COORD + sample(COORDS, len(COORDS)) + END_COORD) for _ in range(100)] self.travelCoords = random.sample(self.map.movableList(), 10)
mutationProbability = float(0.1) import ast
self.travelCoords = ast.literal_eval(str(self.travelCoords))
self.map.insertHerbs(self.travelCoords)
# Initialize genetic algorithm
firstGeneration = [Traveling(START_COORD + sample(self.travelCoords, len(self.travelCoords)) + END_COORD) for _
in range(100)]
mutationProbability = float(0.1)
ga = GeneticAlgorithm(firstGeneration, mutationProbability) ga = GeneticAlgorithm(firstGeneration, mutationProbability)
movementList = ga.listOfTravel() self.movementList = ga.listOfTravel()
self.entityToVisitList = [] self.entityToVisitList = []
for i in movementList: for i in self.movementList:
self.entityToVisitList.append(self.map.getEntityOnCoord(i)) self.entityToVisitList.append(self.map.getEntityOnCoord(i))
self.entityToVisitList.remove(self.entityToVisitList[0]) self.entityToVisitList.remove(self.entityToVisitList[0])
# for i in entityToVisitList:
# self.player.gotoToTarget(i, self.map)
# print("ile")
# Start game loop
self.mainLoop() self.mainLoop()

View File

@ -22,9 +22,10 @@ class Map:
""" """
# TODO: Should map be self-aware of its own loacation? # TODO: Should map be self-aware of its own loacation?
self.screen = screen self.screen = screen
# tekstowa macierz terenów # tekstowa macierz terenów
self.terrain = [] self.terrain = []
# tereny bez kolizji # tereny nie kolizyjne, potrzebne też do metody movableList, która zwraca tereny na których nie ma żadnych entity
self.terrainTilesList = [] self.terrainTilesList = []
# grupa objektów kolizyjnych (tereny kolizyjne i entities) # grupa objektów kolizyjnych (tereny kolizyjne i entities)
self.collidables = pygame.sprite.Group() self.collidables = pygame.sprite.Group()
@ -242,6 +243,20 @@ class Map:
return True return True
return False return False
def insertHerbs(self, coordsList):
nr = 1
for i in range(10):
entity = Pickupable("herb" + str(nr) + ".png", self.tileSize, coordsList[i], Statistics(0, 0, 0, 0), "herb")
self.entitiesRawData.append(entity)
self.addEntity(entity)
nr += 1
def movableList(self):
terrainList = self.terrainTilesList
for i in self.entitiesRawData:
terrainList.remove(self.getTileOnCoord((i.x, i.y)))
return terrainList
def __del__(self): def __del__(self):
for entity in self.entities.sprites(): for entity in self.entities.sprites():
entity.kill() entity.kill()

View File

@ -24,3 +24,7 @@ class TerrainTile(pygame.sprite.Sprite):
self.rect.x = x * tileSize self.rect.x = x * tileSize
self.rect.y = y * tileSize self.rect.y = y * tileSize
self.cost = cost self.cost = cost
def __repr__(self):
coords = (self.x, self.y)
return str(coords)