def redraw(self, cords): self.percent = clamp(cords[0] / (Set_W - 20), 1) self.image = pg.Surface([Set_W - 20, 25]) self.image.fill((210, 210, 210)) pg.draw.line(self.image, (0, 0, 130), (0, 13), (Set_W - 20, 13)) pg.draw.rect(self.image, (0, 0, 0), (clamp(cords[0] - 17, Set_W - 37), 0, 15, 25)) if self.focus: pg.draw.circle(self.image, (255, 255, 255), (clamp(int(self.percent * (Set_W - 20)) - 7, Set_W - 27) - 2, 13), 3)
def __init__(self, x, y, length, diam=50, side=1): super().__init__() self.x = x self.y = y self.side = side self.length = length self.diam = diam self.angle = acos(clamp(length / diam * side, 1, -1)) self.color1 = (192 + 63 * sin(self.angle), 0, 0) self.color2 = (length / diam * 200, length / diam * 200, length / diam * 200) self.color3 = (0, 192 - 63 * sin(self.angle), 0) self.gen1 = create_sprite(0, y, 10, 10, self.color1) self.link = create_sprite(x + 10, y + 3, length, 4, self.color2) self.gen2 = create_sprite(0, y, 10, 10, self.color3) if side == 1: self.gen1.rect.x = x self.gen2.rect.x = x + 10 + length else: self.gen1.rect.x = x + 10 + length self.gen2.rect.x = x self.link.rect.x = x + 10 self.link.rect.y = y + 3 self.add([self.link, self.gen1, self.gen2]) self.mem = [self.gen1, self.link, self.gen2]
def __init__(self, x, y, st=0): super().__init__() self.x = x self.y = y self.percent = st self.focus = 0 self.image = pg.Surface([Set_W - 20, 25]) self.image.fill((210, 210, 210)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y pg.draw.line(self.image, (0, 0, 130), (0, 13), (Set_W - 20, 13)) pg.draw.rect(self.image, (0, 0, 0), (int(st * (Set_W - 20)), 0, 15, 25)) pg.draw.circle(self.image, (255, 255, 255), (clamp(int(st * (Set_W - 20)), Set_W - 27) + 7, 13), 3)
def go_to_targer(self, targ): x_t = targ.rect.x y_t = targ.rect.y for i in range(self.speed): if fabs(self.body.rect.x - x_t) > fabs(self.body.rect.y - y_t): if self.body.rect.x > x_t: self.body.rect.x -= 1 self.sens_circ.rect.x -= 1 else: self.body.rect.x += 1 self.sens_circ.rect.x += 1 else: if self.body.rect.y > y_t: self.body.rect.y -= 1 self.sens_circ.rect.y -= 1 else: self.body.rect.y += 1 self.sens_circ.rect.y += 1 self.energy = clamp(self.energy - 0.005, 10) r = clamp(int(self.color1[0] * self.energy)) if self.energy > 5.5: r = clamp(int((self.energy - 5.5) * 255)) g = clamp(int(self.color1[1] * self.energy)) if self.energy > 8.5: g = clamp(int((self.energy - 8.5) * 255)) b = clamp(int(self.color1[2] * self.energy / 5.5)) self.sens_circ.image = pg.Surface([self.sens * 2, self.sens * 2]) self.sens_circ.image.fill((0, 0, 0)) self.sens_circ.image.set_colorkey((0, 0, 0)) pg.draw.circle(self.sens_circ.image, self.color2, (self.sens, self.sens), self.sens) self.body.image.fill((r, g, b)) self.sens_circ.image.blit(self.brd_info, (18, 12 + 3 * HCR)) self.enrg_info = self.f.render( str(self.energy)[:5], 1, (255, 255, 255)) # self.days_info = self.f.render(str(self.days), 1, (255, 255, 255)) # self.speed_info = self.f.render(str(self.speed), 1, (255, 255, 255)) # self.birth_info = self.f.render(str(self.birth_enr), 1, (255, 255, 255)) self.sens_circ.image.blit(self.enrg_info, (18, 12)) # self.sens_circ.image.blit(self.days_info, (36, 12 + 3 * HCR)) # self.sens_circ.image.blit(self.speed_info, (11, 25)) # self.sens_circ.image.blit(self.birth_info, (11 + 4*WCR, 25)) if not self.energy: return 0 return 1
def go_to_target(self, targ): x_t = targ.rect.x y_t = targ.rect.y # высчитывание новых координат for i in range(self.speed): if fabs(self.body.rect.x - x_t) > fabs(self.body.rect.y - y_t): if self.body.rect.x > x_t: self.body.rect.x -= 1 self.sens_circ.rect.x -= 1 else: self.body.rect.x += 1 self.sens_circ.rect.x += 1 else: if self.body.rect.y > y_t: self.body.rect.y -= 1 self.sens_circ.rect.y -= 1 else: self.body.rect.y += 1 self.sens_circ.rect.y += 1 # затрата на передвижение self.energy = clamp(self.energy - 0.006 * self.weight / 64) # расчёт цвета в зависимости от количества энергии r = clamp(int(self.color1[0] * self.energy)) if self.energy > 5.5: r = clamp(int((self.energy - 5.5) * 255)) g = clamp(int(self.color1[1] * self.energy)) if self.energy > 8.5: g = clamp(int((self.energy - 8.5) * 255)) b = clamp(int(self.color1[2] * self.energy / 5.5)) # обновление размеров поверхности при мутации у особи гена размера тела if self.body.rect.w != self.w: self.body.image = pg.Surface([self.w, self.h]) self.body.rect.w = self.w self.body.rect.x += (self.w - self.body.rect.w) // 2 self.weight = self.w * self.h if self.body.rect.h != self.h: self.body.image = pg.Surface([self.w, self.h]) self.body.rect.h = self.h self.body.rect.y -= (self.h - self.body.rect.h) // 2 self.weight = self.w * self.h # отрисовка особи с обновлёнными координатами self.sens_circ.image = pg.Surface( [self.sens * 2 + self.w - 5, self.sens * 2 + self.h - 5]) self.sens_circ.image.fill((0, 0, 0)) self.sens_circ.image.set_colorkey((0, 0, 0)) pg.draw.ellipse(self.sens_circ.image, self.color2, self.sens_circ.image.get_rect()) if self.focus: pg.draw.rect(self.sens_circ.image, (255, 215, 0), (self.body.rect.x - 2 - self.sens_circ.rect.x, self.body.rect.y - 2 - self.sens_circ.rect.y, self.body.rect.w + 4, self.body.rect.h + 4)) self.body.image.fill((r, g, b)) self.sens_circ.image.blit(self.brd_info, (18, 12 + 3 * HCR)) # дополнительная информация self.enrg_info = self.f.render( str(self.energy)[:5], 1, (255, 255, 255)) # self.days_info = self.f.render(str(self.days), 1, (255, 255, 255)) # self.speed_info = self.f.render(str(self.speed), 1, (255, 255, 255)) # self.birth_info = self.f.render(str(self.birth_enr), 1, (255, 255, 255)) self.sens_circ.image.blit(self.enrg_info, (18, 12)) # self.sens_circ.image.blit(self.days_info, (36, 12 + 3 * HCR)) # self.sens_circ.image.blit(self.speed_info, (11, 25)) # self.sens_circ.image.blit(self.birth_info, (11 + 4*WCR, 25)) if not self.energy: self.dead() return 0 return 1
def fading(self): self.image.fill((clamp(self.color[0] - STEP_FAD), clamp(self.color[1] + STEP_FAD), 0)) self.color = (clamp(self.color[0] - STEP_FAD), clamp(self.color[1] + STEP_FAD), 0)