Advertisement
Guest User

Untitled

a guest
Jan 8th, 2025
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. import pygame
  2. import math
  3. import random
  4.  
  5. # Настройки экрана
  6. WIDTH, HEIGHT = 800, 600
  7. FPS = 60
  8.  
  9. # Цвета
  10. BLUE = (0, 105, 148)
  11. DARK_BLUE = (0, 64, 128)
  12. WHITE = (255, 255, 255)
  13. BLACK = (0, 0, 0)
  14.  
  15. # Настройки жидкости
  16. GRID_SIZE = 10
  17. DAMPING = 0.98
  18.  
  19. # Инициализация Pygame
  20. pygame.init()
  21. screen = pygame.display.set_mode((WIDTH, HEIGHT))
  22. pygame.display.set_caption("2D Liquid Simulation")
  23. clock = pygame.time.Clock()
  24.  
  25. # Создание сетки для жидкости
  26. grid_width = WIDTH // GRID_SIZE
  27. grid_height = HEIGHT // GRID_SIZE
  28. grid = [[0 for _ in range(grid_width)] for _ in range(grid_height)]
  29. velocity = [[0 for _ in range(grid_width)] for _ in range(grid_height)]
  30.  
  31. # Функция для обновления сетки жидкости
  32. def update_liquid():
  33. for y in range(1, grid_height - 1):
  34. for x in range(1, grid_width - 1):
  35. avg = (
  36. grid[y - 1][x] +
  37. grid[y + 1][x] +
  38. grid[y][x - 1] +
  39. grid[y][x + 1]
  40. ) / 4
  41. velocity[y][x] += avg - grid[y][x]
  42. velocity[y][x] *= DAMPING
  43.  
  44. for y in range(grid_height):
  45. for x in range(grid_width):
  46. grid[y][x] += velocity[y][x]
  47.  
  48. # Функция для добавления возмущений в жидкость
  49. def disturb_liquid(cx, cy, radius, strength):
  50. for y in range(max(0, cy - radius), min(grid_height, cy + radius)):
  51. for x in range(max(0, cx - radius), min(grid_width, cx + radius)):
  52. dx = x - cx
  53. dy = y - cy
  54. if dx * dx + dy * dy <= radius * radius:
  55. grid[y][x] += strength
  56.  
  57. # Главный игровой цикл
  58. running = True
  59. ball = {
  60. "x": WIDTH // 2,
  61. "y": 0,
  62. "radius": 15,
  63. "vy": 0,
  64. "gravity": 0.5
  65. }
  66.  
  67. while running:
  68. for event in pygame.event.get():
  69. if event.type == pygame.QUIT:
  70. running = False
  71.  
  72. # Обновление жидкости
  73. update_liquid()
  74.  
  75. # Обновление позиции шара
  76. ball["vy"] += ball["gravity"]
  77. ball["y"] += ball["vy"]
  78.  
  79. # Проверка столкновения шара с жидкостью
  80. if ball["y"] // GRID_SIZE < grid_height:
  81. disturb_liquid(
  82. ball["x"] // GRID_SIZE,
  83. int(ball["y"] // GRID_SIZE),
  84. ball["radius"] // GRID_SIZE,
  85. strength=5
  86. )
  87.  
  88. # Ограничение шара снизу
  89. if ball["y"] > HEIGHT:
  90. ball["y"] = HEIGHT
  91. ball["vy"] = 0
  92.  
  93. # Отрисовка экрана
  94. screen.fill(BLACK)
  95.  
  96. # Отрисовка жидкости
  97. for y in range(grid_height):
  98. for x in range(grid_width):
  99. value = grid[y][x]
  100. color = (0, min(255, max(0, int(128 + value * 128))), min(255, max(0, int(255 + value * 255))))
  101. pygame.draw.rect(screen, color, (x * GRID_SIZE, y * GRID_SIZE, GRID_SIZE, GRID_SIZE))
  102.  
  103. # Отрисовка шара
  104. pygame.draw.circle(screen, WHITE, (ball["x"], int(ball["y"])), ball["radius"])
  105.  
  106. pygame.display.flip()
  107. clock.tick(FPS)
  108.  
  109. pygame.quit()
  110.  
Tags: Prog
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement