Опыт работы с нейронными сетями и простой код на Ассемблере.

Тема в разделе "WASM.BEGINNERS", создана пользователем dcc0, 17 май 2026.

Метки:
  1. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    376
    Код (Python):
    1. import pygame
    2. import random
    3. import math
    4.  
    5. # Инициализация Pygame
    6. pygame.init()
    7.  
    8. # Настройки экрана
    9. WIDTH, HEIGHT = 800, 600
    10. screen = pygame.display.set_mode((WIDTH, HEIGHT))
    11. pygame.display.set_caption("Струя воды из пожарного крана")
    12.  
    13. # Цвета
    14. WHITE = (255, 255, 255)
    15. BLACK = (0, 0, 0)
    16. RED = (200, 0, 0)
    17. GRAY = (80, 80, 80)
    18. BLUE_SHADES = [(0, 100, 255), (0, 150, 255), (100, 200, 255), (150, 220, 255)]
    19.  
    20. # Параметры крана (сопло в левом углу)
    21. CRANE_X, CRANE_Y = 30, HEIGHT // 2 - 20  # позиция сопла
    22.  
    23. class WaterDrop:
    24.     """Класс одной капли/частицы воды"""
    25.     def __init__(self):
    26.         # Начальная позиция (из сопла крана)
    27.         self.x = CRANE_X + 10
    28.         self.y = CRANE_Y + 10
    29.        
    30.         # Угол разлета струи (от -45 до +45 градусов от горизонтали)
    31.         angle = random.uniform(-math.pi / 3, math.pi / 3)
    32.         # Базовая скорость (напор воды)
    33.         base_speed = random.uniform(6, 12)
    34.        
    35.         # Вектор скорости
    36.         self.vx = base_speed * math.cos(angle) * random.uniform(0.8, 1.2)
    37.         self.vy = base_speed * math.sin(angle) * random.uniform(0.8, 1.2) + 1
    38.        
    39.         # Немного случайного разброса для реализма
    40.         self.vx += random.uniform(-0.5, 0.5)
    41.         self.vy += random.uniform(-0.5, 0.5)
    42.        
    43.         # Размер капли
    44.         self.size = random.randint(2, 5)
    45.         # Цвет (оттенок синего)
    46.         self.color = random.choice(BLUE_SHADES)
    47.         # Прозрачность (будем уменьшать со временем)
    48.         self.lifetime = random.randint(40, 80)
    49.         self.max_lifetime = self.lifetime
    50.        
    51.     def update(self):
    52.         """Обновление позиции и состояния капли"""
    53.         # Движение
    54.         self.x += self.vx
    55.         self.y += self.vy
    56.        
    57.         # Гравитация (тянет вниз)
    58.         self.vy += 0.15
    59.        
    60.         # Сопротивление воздуха (немного замедляем)
    61.         self.vx *= 0.999
    62.         self.vy *= 0.999
    63.        
    64.         # Уменьшаем время жизни
    65.         self.lifetime -= 1
    66.        
    67.         # Если капля упала на пол, она "разбивается" и исчезает быстрее
    68.         if self.y >= HEIGHT - 10:
    69.             self.lifetime = min(self.lifetime, 10)
    70.             self.vy *= -0.3  # небольшой отскок
    71.             self.vx *= 0.8
    72.        
    73.         # Не даем улететь слишком далеко вверх/вниз за экран
    74.         if self.y > HEIGHT + 50 or self.x > WIDTH + 50:
    75.             self.lifetime = 0
    76.        
    77.     def draw(self, surface):
    78.         """Отрисовка капли"""
    79.         if self.lifetime > 0:
    80.             # Прозрачность уменьшается к концу жизни
    81.             alpha = int(255 * (self.lifetime / self.max_lifetime))
    82.             # Создаем поверхность с альфа-каналом для капли
    83.             drop_surf = pygame.Surface((self.size * 2, self.size * 2), pygame.SRCALPHA)
    84.             pygame.draw.circle(drop_surf, (*self.color, alpha), (self.size, self.size), self.size)
    85.             surface.blit(drop_surf, (int(self.x - self.size), int(self.y - self.size)))
    86.  
    87. class WaterJet:
    88.     """Управляет потоком частиц"""
    89.     def __init__(self):
    90.         self.drops = []
    91.         self.spawn_rate = 8  # частиц за кадр
    92.        
    93.     def update(self):
    94.         # Создаем новые капли
    95.         for _ in range(self.spawn_rate):
    96.             self.drops.append(WaterDrop())
    97.        
    98.         # Обновляем существующие
    99.         for drop in self.drops:
    100.             drop.update()
    101.        
    102.         # Удаляем мертвые капли
    103.         self.drops = [d for d in self.drops if d.lifetime > 0]
    104.        
    105.         # Ограничиваем общее количество (для производительности)
    106.         if len(self.drops) > 1500:
    107.             self.drops = self.drops[-1200:]
    108.            
    109.     def draw(self, surface):
    110.         for drop in self.drops:
    111.             drop.draw(surface)
    112.  
    113. def draw_crane(surface):
    114.     """Рисует пожарный кран в левом углу"""
    115.     # Основание крана
    116.     pygame.draw.rect(surface, GRAY, (CRANE_X - 10, CRANE_Y + 15, 20, 40))
    117.     # Корпус
    118.     pygame.draw.rect(surface, RED, (CRANE_X - 5, CRANE_Y - 5, 10, 25))
    119.     # Головка (сопло)
    120.     pygame.draw.circle(surface, RED, (CRANE_X + 5, CRANE_Y + 5), 12)
    121.     pygame.draw.circle(surface, GRAY, (CRANE_X + 5, CRANE_Y + 5), 8)
    122.     # Вентиль (ручка)
    123.     pygame.draw.line(surface, RED, (CRANE_X - 15, CRANE_Y - 10), (CRANE_X + 5, CRANE_Y - 5), 4)
    124.     pygame.draw.circle(surface, RED, (CRANE_X - 15, CRANE_Y - 10), 4)
    125.     # Труба внизу
    126.     pygame.draw.rect(surface, GRAY, (CRANE_X + 2, CRANE_Y + 40, 6, 30))
    127.     # Блеск на сопле
    128.     pygame.draw.circle(surface, (200, 200, 200), (CRANE_X + 8, CRANE_Y + 2), 2)
    129.  
    130. # Основной цикл
    131. def main():
    132.     clock = pygame.time.Clock()
    133.     jet = WaterJet()
    134.     running = True
    135.    
    136.     # Для FPS и счетчика частиц
    137.     font = pygame.font.Font(None, 24)
    138.    
    139.     while running:
    140.         for event in pygame.event.get():
    141.             if event.type == pygame.QUIT:
    142.                 running = False
    143.             # Нажатие пробела увеличивает напор
    144.             if event.type == pygame.KEYDOWN:
    145.                 if event.key == pygame.K_SPACE:
    146.                     jet.spawn_rate = min(jet.spawn_rate + 2, 20)
    147.                 if event.key == pygame.K_DOWN:
    148.                     jet.spawn_rate = max(jet.spawn_rate - 2, 2)
    149.        
    150.         # Обновление
    151.         jet.update()
    152.        
    153.         # Рендеринг
    154.         screen.fill(BLACK)
    155.        
    156.         # Рисуем фон (пол)
    157.         pygame.draw.rect(screen, (30, 30, 40), (0, HEIGHT - 10, WIDTH, 10))
    158.        
    159.         # Рисуем кран
    160.         draw_crane(screen)
    161.        
    162.         # Рисуем струю
    163.         jet.draw(screen)
    164.        
    165.         # Статистика
    166.         fps = int(clock.get_fps())
    167.         info_text = f"Частиц: {len(jet.drops)}  |  FPS: {fps}  |  Напор: {jet.spawn_rate} (SPACE +, DOWN -)"
    168.         text_surf = font.render(info_text, True, WHITE)
    169.         screen.blit(text_surf, (10, 10))
    170.        
    171.         pygame.display.flip()
    172.         clock.tick(60)
    173.    
    174.     pygame.quit()
    175.  
    176. if __name__ == "__main__":
    177.     main()
     
    dcc0 нравится это.