Advertisement
Chl_Snt

Two balls

Apr 12th, 2025
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.07 KB | None | 0 0
  1. import tkinter as tk
  2. import math
  3. import random
  4.  
  5. # Кол-во шариков
  6. BALL_COUNT = 500
  7.  
  8. # Диапазоны параметров
  9. SPEED_RANGE = (1, 5)
  10. RADIUS_RANGE = (5, 20)
  11. COLORS = ["red", "green", "blue", "orange", "purple", "cyan", "magenta"]
  12.  
  13. # Окно и холст
  14. root = tk.Tk()
  15. root.geometry("800x600")
  16. root.title("Тысяча мячиков")
  17. canvas = tk.Canvas(root, bg="white")
  18. canvas.pack(fill=tk.BOTH, expand=True)
  19.  
  20. # Цель — положение мыши
  21. target_x = 300
  22. target_y = 200
  23.  
  24. def update_target(event):
  25.     global target_x, target_y
  26.     target_x = event.x
  27.     target_y = event.y
  28.  
  29. canvas.bind("<Motion>", update_target)
  30.  
  31. # Один шарик: координаты, радиус, скорость, цвет и ID на canvas
  32. balls = []
  33.  
  34. for _ in range(BALL_COUNT):
  35.     r = random.randint(*RADIUS_RANGE)
  36.     x = random.randint(r, 800 - r)
  37.     y = random.randint(r, 600 - r)
  38.     color = random.choice(COLORS)
  39.     speed = random.uniform(*SPEED_RANGE)
  40.     ball_id = canvas.create_oval(x - r, y - r, x + r, y + r, fill=color, outline="")
  41.     balls.append({"x": x, "y": y, "r": r, "speed": speed, "id": ball_id})
  42.  
  43. # Изменение цвета случайного шарика при клике
  44. def change_random_color(event):
  45.     ball = random.choice(balls)
  46.     new_color = random.choice(COLORS)
  47.     canvas.itemconfig(ball["id"], fill=new_color)
  48.  
  49. canvas.bind("<Button-1>", change_random_color)
  50.  
  51. # Обновление положения шариков
  52. def move_balls():
  53.     for ball in balls:
  54.         dx = target_x - ball["x"]
  55.         dy = target_y - ball["y"]
  56.         dist = math.hypot(dx, dy)
  57.  
  58.         if dist > 1:
  59.             step_x = ball["speed"] * dx / dist
  60.             step_y = ball["speed"] * dy / dist
  61.             ball["x"] += step_x
  62.             ball["y"] += step_y
  63.             r = ball["r"]
  64.             canvas.coords(ball["id"],
  65.                           ball["x"] - r, ball["y"] - r,
  66.                           ball["x"] + r, ball["y"] + r)
  67.     root.after(16, move_balls)
  68.  
  69. move_balls()
  70. root.mainloop()
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement