def __init__(self, surface, target, dna=None, start=None): self.surface = surface self.target = target x = surface.get_width() y = surface.get_height() if not start: self.start = Vector2D(x / 2, y - 100) else: self.start = start self.pos = self.start.add(Vector2D(0, -20)) self.velocity = Vector2D.zero_vector() gravity = Vector2D(0, 9.807) zero = Vector2D.zero_vector() self.acceleration = zero if dna: self.dna = dna else: self.dna = DNA() self.done = False self.detonated = False self.crashed = False self.step = 0 self.fitness = 0 self.distances = [] self.obstacle = pg.Rect((x * 0.30, y * 0.6), (x * 0.4, 20)) self.isParent = False self.min_dist = 99999
def update(self): gravity = Vector2D(0, 9.807) zero = Vector2D.zero_vector() if self.pos.distance(self.target) < self.min_dist: self.min_dist = self.pos.distance(self.target) # if self.pos.x > self.surface.get_width() or self.pos.x < 0: # self.crashed = True # # # if self.pos.y > self.surface.get_height() or self.pos.y < 0: # self.crashed = True if self.obstacle.collidepoint(*self.pos()): self.crashed = True if self.pos.distance(self.target) < 20: self.done = True self.pos = Vector2D(*self.target()) if not self.done: self.distances.append(self.pos.distance(self.target)) self.apply_force(gravity.div(200)) self.apply_force(self.dna.genes[self.step]) self.velocity = self.velocity.add(self.acceleration) self.pos = self.pos.add(self.velocity) self.acceleration = zero self.step += 1 else: pass
def __init__(self, lifespan=None, genes=None): if not lifespan: self.lifespan = 300 else: self.lifespan = lifespan if genes: self.genes = genes else: self.genes = [] force = Vector2D.zero_vector() for _ in range(self.lifespan): g_force = force.random_vector() g_force.set_magnitude(0.1) self.genes.append(g_force) self.isMutant = False