fork(1) download
  1. #!!! Создаём окно игры и подлодку
  2.  
  3. from tkinter import *
  4.  
  5. #Окно
  6. HEIGHT = 500
  7. WIDTH = 800
  8. window = Tk()
  9. window.title('Bubble Blaster')
  10.  
  11. #Холст
  12. c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue')
  13. c.pack()
  14.  
  15.  
  16. #Подлодка-игрок
  17. ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red') #красный треугльник
  18. ship_id2 = c.create_oval(0, 0, 30, 30, outline='red') #красный круг без заливки
  19. SHIP_R = 15 #Радиус (размер) подлодки
  20. MID_X = WIDTH / 2 #В этих двух переменных -
  21. MID_Y = HEIGHT / 2 #координаты середины экрана
  22. c.move(ship_id, MID_X, MID_Y) #Перемещает обе части подлодки
  23. c.move(ship_id2, MID_X, MID_Y) #в середину экрана
  24.  
  25.  
  26. #!!! Управление подлодкой
  27.  
  28. SHIP_SPD = 10 #Расстояние на которое сдвигается подлодка при нажатии клавиши
  29. def move_ship(event):
  30. if event.keysym == 'Up':
  31. c.move(ship_id, 0, -SHIP_SPD) #Двигает обе части подлодки вверх
  32. c.move(ship_id2, 0, -SHIP_SPD)
  33. elif event.keysym == 'Down':
  34. c.move(ship_id, 0, SHIP_SPD)
  35. c.move(ship_id2, 0, SHIP_SPD)
  36. elif event.keysym == 'Left':
  37. c.move(ship_id, -SHIP_SPD, 0)
  38. c.move(ship_id2, -SHIP_SPD, 0)
  39. elif event.keysym == 'Right':
  40. c.move(ship_id, SHIP_SPD, 0)
  41. c.move(ship_id2, SHIP_SPD, 0)
  42. c.bind_all('<Key>', move_ship) #Указывает, что надо вызывать функцию move_ship при нажатии любой клавиши.
  43.  
  44.  
  45. #!!! Пузыри
  46.  
  47. from random import randint
  48.  
  49. bub_id = list() # Создаёт пустые списки для хранения имени (bub_id),
  50. bub_r = list() # радиуса (bub_r) и
  51. bub_speed = list() # скорости (bub_speed) каждого пузыря.
  52.  
  53. MIN_BUB_R = 10 # Минимальный радиус пузыря: 10,
  54. MAX_BUB_R = 30 # максимальный: 30.
  55. MAX_BUB_SPD = 10 # Максимальная скорость пузыря.
  56. GAP = 100
  57.  
  58. def create_bubble():
  59. x = WIDTH + GAP # Задаёт позицию пузыря (GAP нужен, чтобы пузырь точно был за
  60. # видимым экраном)
  61. y = randint(0, HEIGHT) # на холсте
  62.  
  63. r = randint(MIN_BUB_R, MAX_BUB_R) # Выбирает случайный радиус пузыря от
  64. # минимального до максимального значения
  65. id1 = c.create_oval(x-r, y-r, x+r, y+r, outline='white') # Рисуем пузыри
  66.  
  67. bub_id.append(id1) # Добавляет имя,
  68. bub_r.append(r) # радиус
  69. bub_speed.append(randint(1, MAX_BUB_SPD)) # и скорость пузыря в списки.
  70.  
  71.  
  72. #!!! Движение пузырей
  73.  
  74. def move_bubbles():
  75. for i in range(len(bub_id)): # По очереди берёт каждый пузырь из списка
  76. c.move(bub_id[i], -bub_speed[i], 0) # Двигает пузырь с его скоростью
  77.  
  78. def get_coords(id_num):
  79. pos = c.coords(id_num)
  80. x = (pos[0] + pos[2])/2 # Вычисляет X-координату середины пузыря
  81. y = (pos[1] + pos[3])/2 # Вычисляет Y-координату середины пузыря
  82. return x, y
  83.  
  84. from time import sleep, time # Загружает нужные функции из модуля Time
  85. BUB_CHANGE = 10
  86. #MAIN GAME LOOP ГЛАВНЫЙ ЦИКЛ ИГРЫ!!!
  87. while True:
  88. if randint(1, BUB_CHANGE) == 1:# Выбирает случайное число от 1 до 10. Если случай-
  89. # ное число = 1, создаёт новый пузырь (в среднем это 1 случай из 10, так что пузырей
  90. # будет не слишком много)
  91.  
  92. create_bubble() # Вызывает функцию
  93. move_bubbles() # Вызывает функцию Двигает пузыри
  94. clean_up_bubs() # Удаляет пузыри, уплывшие за экран.
  95. window.update() # Обновляет окно, чтобы перерисовывать пузыри в новых позициях
  96. sleep(0.01) # Замедляет игру, чтобы играть было не слишком сложно
  97.  
  98.  
  99. #!!! Пузыри лопаются
  100.  
  101. def del_bubble(i): # Удаляет пузырь, имя которого в i
  102. del bub_r[i] # Удаляет пузырь из списка радиусов
  103. del bub_speed[i] # и скоростей
  104. c.delete(bub_id[i]) # Удаляет пузырь с холста
  105. del bub_id[i] # Удаляет пузырь из списка имён
  106.  
  107. def clean_up_bubs(): # Удаляет пузыри, уплывшие за пределы холста
  108. for i in range(len(bub_id)-1, -1, -1): # Обратный цикл по списку пузырей -
  109. # чтобы избежать ошибки работы for при удалении пузырей
  110. x, y = get_coords(bub_id[i]) # Находит координаты пузыря
  111. if x < -GAP:
  112. del_bubble(i) # Если пузырь уплыл за экран, его нужно удалить, иначе он будет
  113. # замедлять игру (-GAP, чтобы пузырь уплыл за экран полностью, а потом там пропал)
  114.  
  115.  
  116.  
  117.  
Runtime error #stdin #stdout #stderr 0.03s 76608KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "./prog.py", line 8, in <module>
  File "/usr/lib/python3.5/tkinter/__init__.py", line 1880, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable