не отображаются рабочие муравьи и строители
добавь сюда начальное количество муравьев в улей
import pygame
import sys
import random
import math

Инициализация Pygame
pygame.init()

Настройки экрана
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Игра про муравьев")

Цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BROWN = (139, 69, 19)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
ORANGE = (255, 165, 0)
MAGENTA = (255, 0, 255)
YELLOW = (255, 255, 0)

Настройки феромонов
PHEROMONE_DECAY = 0.98 # Коэффициент затухания
PHEROMONE_LIFETIME = 100 # Максимальное время жизни феромона

Загрузка изображений (замените на пути к вашим изображениям)
Здесь используются простые круги, но вы можете загрузить спрайты
def draw_circle(surface, color, position, radius):
pygame.draw.circle(surface, color, position, radius)

Класс Еды
class Food:
def init(self, x, y):
self.x = x
self.y = y
self.radius = 4


def draw(self):
    draw_circle(screen, BLACK, (self.x, self.y), self.radius)
Класс Феромона
class Pheromone:
def init(self, x, y, p_type):
self.x = x
self.y = y
self.type = p_type # 'food' или 'hive'
self.strength = 255 # Начальная сила феромона


def evaporate(self):
    self.strength *= PHEROMONE_DECAY

def is_depleted(self):
    return self.strength < 50  # Порог исчезновения

def draw(self):
    if self.type == 'food':
        color = (0, 0, 255, int(self.strength))  # Синий для еды
    else:
        color = (255, 0, 0, int(self.strength))  # Красный для улья

    # Создаём поверхность с поддержкой альфа-канала для прозрачности
    pheromone_surface = pygame.Surface((10, 10), pygame.SRCALPHA)
    pygame.draw.circle(pheromone_surface, color, (5, 5), 5)
    screen.blit(pheromone_surface, (self.x - 5, self.y - 5))
Класс Улей
class Hive:
def init(self, x, y):
self.x = x
self.y = y
self.food = 100
self.size = 20


def draw(self):
    draw_circle(screen, BROWN, (self.x, self.y), self.size)
Класс Королева
class Queen:
def init(self, hive):
self.hive = hive
self.cooldown = 0 # Перезарядка для создания муравьёв


def update(self, workers, defenders, builders):
    if self.hive.food >= 10 and self.cooldown == 0:
        # Простая логика создания муравьёв
        choice = random.choice(['worker', 'defender', 'builder'])
        if choice == 'worker':
            workers.append(Worker(self.hive.x, self.hive.y))
        elif choice == 'defender':
            defenders.append(Defender(self.hive.x, self.hive.y))
        elif choice == 'builder':
            builders.append(Builder(self.hive.x, self.hive.y))
        self.hive.food -= 10
        self.cooldown = 50  # Количество кадров до следующего создания
    if self.cooldown > 0:
        self.cooldown -= 1

def draw(self):
    # Рисуем королеву как красный круг
    draw_circle(screen, RED, (self.hive.x, self.hive.y), 10)
Класс Базового Муравья
class Ant:
def init(self, x, y):
self.x = x
self.y = y
self.speed = 2
self.color = BLACK
self.radius = 5


def move_towards(self, target_x, target_y):
    dx = target_x - self.x
    dy = target_y - self.y
    dist = math.hypot(dx, dy)
    if dist == 0:
        return
    dx, dy = dx / dist, dy / dist
    self.x += dx * self.speed
    self.y += dy * self.speed

def move_randomly(self):
    angle = random.uniform(0, 2 * math.pi)
    self.x += math.cos(angle) * self.speed
    self.y += math.sin(angle) * self.speed
    # Ограничение движения по экрану
    self.x = max(0, min(WIDTH, self.x))
    self.y = max(0, min(HEIGHT, self.y))

def draw(self):
    draw_circle(screen, self.color, (int(self.x), int(self.y)), self.radius)
Класс Защитника
class Defender(Ant):
def init(self, x, y):
super().init(x, y)
self.color = BLUE
self.radius = 7
self.target = None


def update(self, enemies):
    if enemies:
        # Найти ближайшего врага
        self.target = min(enemies, key=lambda e: math.hypot(self.x - e.x, self.y - e.y))
        self.move_towards(self.target.x, self.target.y)
        # Атаковать врага (здесь просто удаляем врага при приближении)
        if math.hypot(self.x - self.target.x, self.y - self.target.y) < self.radius + self.target.radius:
            enemies.remove(self.target)
Класс Работника
class Worker(Ant):
def init(self, x, y):
super().init(x, y)
self.color = GREEN
self.radius = 5
self.carrying = False
self.target = None
self.pheromones = [] # Список феромонов, которые оставляет муравей


def find_nearest_food(self, foods):
    if not foods:
        return None
    return min(foods, key=lambda f: math.hypot(self.x - f.x, self.y - f.y))

def follow_pheromones(self, pheromones, p_type):
    # Фильтруем феромоны по типу
    relevant = [p for p in pheromones if p.type == p_type]
    if not relevant:
        return None
    # Найти ближайший феромон
    nearest = min(relevant, key=lambda p: math.hypot(self.x - p.x, self.y - p.y))
    return nearest

def update(self, hive, foods, pheromones):
    # Добавляем феромон при движении к еде или обратно к улью
    if self.carrying:
        pheromone_type = 'hive'
    else:
        pheromone_type = 'food'
    pheromones.append(Pheromone(self.x, self.y, pheromone_type))

    if self.carrying:
        # Идём к улью
        if not self.target:
            self.target = (hive.x, hive.y)
        self.move_towards(self.target[0], self.target[1])
        if math.hypot(self.x - hive.x, self.y - hive.y) < self.radius + hive.size:
            hive.food += 5
            self.carrying = False
            self.target = None
    else:
        # Ищем еду
        if not self.target:
            # Ищем ближайший феромон к еде
            pheromone = self.follow_pheromones(pheromones, 'food')
            if pheromone:
                self.target = (pheromone.x, pheromone.y)
            else:
                # Если нет феромонов, ищем ближайшую еду
                food = self.find_nearest_food(foods)
                if food:
                    self.target = (food.x, food.y)
                else:
                    self.move_randomly()
        if self.target:
            self.move_towards(self.target[0], self.target[1])
            # Проверяем, достигли ли еды
            for food in foods:
                if math.hypot(self.x - food.x, self.y - food.y) < self.radius + food.radius:
                    self.carrying = True
                    foods.remove(food)
                    self.target = (hive.x, hive.y)
                    break
Класс Строителя
class Builder(Ant):
def init(self, x, y):
super().init(x, y)
self.color = ORANGE
self.radius = 6
self.carrying = False
self.target = None


def find_nearest_food(self, foods):
    if not foods:
        return None
    return min(foods, key=lambda f: math.hypot(self.x - f.x, self.y - f.y))

def follow_pheromones(self, pheromones, p_type):
    # Фильтруем феромоны по типу
    relevant = [p for p in pheromones if p.type == p_type]
    if not relevant:
        return None
    # Найти ближайший феромон
    nearest = min(relevant, key=lambda p: math.hypot(self.x - p.x, self.y - p.y))
    return nearest

def update(self, hive, foods, pheromones):
    # Добавляем феромон при движении к еде или обратно к улью
    if self.carrying:
        pheromone_type = 'hive'
    else:
        pheromone_type = 'food'
    pheromones.append(Pheromone(self.x, self.y, pheromone_type))

    if self.carrying:
        # Идём к улью
        if not self.target:
            self.target = (hive.x, hive.y)
        self.move_towards(self.target[0], self.target[1])
        if math.hypot(self.x - hive.x, self.y - hive.y) < self.radius + hive.size:
            hive.food += 3
            self.carrying = False
            self.target = None
    else:
        # Ищем еду
        if not self.target:
            # Ищем ближайший феромон к еде
            pheromone = self.follow_pheromones(pheromones, 'food')
            if pheromone:
                self.target = (pheromone.x, pheromone.y)
            else:
                # Если нет феромонов, ищем ближайшую еду
                food = self.find_nearest_food(foods)
                if food:
                    self.target = (food.x, food.y)
                else:
                    self.move_randomly()
        if self.target:
            self.move_towards(self.target[0], self.target[1])
            # Проверяем, достигли ли еды
            for food in foods:
                if math.hypot(self.x - food.x, self.y - food.y) < self.radius + food.radius:
                    self.carrying = True
                    foods.remove(food)
                    self.target = (hive.x, hive.y)
                    break
Класс Врага
class Enemy:
def init(self):
self.x = random.choice([0, WIDTH])
self.y = random.randint(0, HEIGHT)
self.speed = 1
self.color = MAGENTA
self.radius = 8


def move_towards_hive(self, hive):
    dx = hive.x - self.x
    dy = hive.y - self.y
    dist = math.hypot(dx, dy)
    if dist == 0:
        return
    dx, dy = dx / dist, dy / dist
    self.x += dx * self.speed
    self.y += dy * self.speed

def draw(self):
    draw_circle(screen, self.color, (int(self.x), int(self.y)), self.radius)
Инициализация объектов
hive = Hive(WIDTH//2, HEIGHT//2)
queen = Queen(hive)
workers = [Worker(hive.x, hive.y)]
defenders = [Defender(hive.x, hive.y)]
builders = [Builder(hive.x, hive.y)]
enemies = []
enemy_spawn_timer = 0

Инициализация еды
foods = []

Добавим начальные источники еды
for _ in range(20):
fx = random.randint(50, WIDTH-50)
fy = random.randint(50, HEIGHT-50)
# Убедимся, что еда не слишком близко к улью
if math.hypot(fx - hive.x, fy - hive.y) > 50:
foods.append(Food(fx, fy))

Список феромонов
pheromones = []

Основной игровой цикл
clock = pygame.time.Clock()
running = True
while running:
clock.tick(60) # 60 FPS
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False


# Обновление игры
queen.update(workers, defenders, builders)

# Обновление муравьев
for worker in workers:
    worker.update(hive, foods, pheromones)
for builder in builders:
    builder.update(hive, foods, pheromones)
for defender in defenders:
    defender.update(enemies)
for enemy in enemies:
    enemy.move_towards_hive(hive)

# Спавн врагов
enemy_spawn_timer += 1
if enemy_spawn_timer > 120:  # Каждые 2 секунды
    enemies.append(Enemy())
    enemy_spawn_timer = 0

# Обновление феромонов
for p in pheromones[:]:
    p.evaporate()
    if p.is_depleted():
        pheromones.remove(p)

# Проверка проигрыша (если враги достигли улья)
for enemy in enemies:
    if math.hypot(enemy.x - hive.x, enemy.y - hive.y) < hive.size:
        print("Улей был уничтожен! Игра окончена.")
        running = False

# Рендеринг
screen.fill(WHITE)

# Отрисовка феромонов
for p in pheromones:
    p.draw()

# Отрисовка еды
for food in foods:
    food.draw()

# Отрисовка остальных объектов
hive.draw()
queen.draw()
for worker in workers:
    worker.draw()
for builder in builders:
    builder.draw()
for defender in defenders:
    defender.draw()
for enemy in enemies:
    enemy.draw()

# Отображение количества еды
font = pygame.font.SysFont(None, 24)
food_text = font.render(f'Еда: {hive.food}', True, BLACK)
screen.blit(food_text, (10, 10))

pygame.display.flip()
pygame.quit()
sys.exit()