Advertisement
Guest User

VyacheslavM

a guest
Dec 14th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.31 KB | None | 0 0
  1. import math
  2. import turtle
  3. import random
  4. import time
  5.  
  6. window = turtle.Screen()
  7. window.setup(1200, 800)
  8. window.bgpic("images/background.png")
  9. # window.tracer(n=2)
  10.  
  11. BASE_X, BASE_Y = 0, -300
  12.  
  13. # Запускаем ракеты из верхней части экрана, которую определяем как количество пикселей по высоте /2
  14. ENEMY_TOP_Y = window.window_height() / 2
  15. # Максимальное количество одновременно создаваемых вражеских ракет
  16. ENEMY_ON_SCREEN = 3
  17. # Интервас с которым они создаются (сек.)
  18. TIME_TO_CREAT_ENEMY = 1
  19.  
  20. def calc_heading(x1, y1, x2, y2):
  21.     dx = x2 - x1
  22.     dy = y2 - y1
  23.     length = (dx ** 2 + dy ** 2) ** 0.5
  24.     cos_alpha = dx / length
  25.     alpha = math.acos(cos_alpha)
  26.     alpha = math.degrees(alpha)
  27.     if dy < 0:
  28.         alpha = -alpha
  29.     return alpha
  30.  
  31.  
  32. def fire_missile(x, y):
  33.     missile = turtle.Turtle(visible=False)
  34.     missile.speed(0)
  35.     missile.color('white')
  36.     missile.penup()
  37.     missile.setpos(x=BASE_X, y=BASE_Y)
  38.     missile.pendown()
  39.     heading = calc_heading(x1=BASE_X, y1=BASE_Y, x2=x, y2=y)
  40.     missile.setheading(heading)
  41.     missile.showturtle()
  42.     info = {'missile': missile, 'target': [x, y],
  43.             'state': 'launched', 'radius': 0}
  44.     our_missiles.append(info)
  45.  
  46.  
  47. def fire_enemy_missile():
  48.     enemy_missile = turtle.Turtle(visible=False)
  49.     enemy_missile.speed(0)
  50.     enemy_missile.color('red')
  51.     enemy_missile.penup()
  52.     # Задаем область по оси X, в которой создаются вражеские ракеты +/- 20 чтобы не создавались по краям экрана
  53.     width_x = (window.window_width() / 2)
  54.     random_x = random.randint(-width_x + 20, width_x - 20)
  55.     enemy_missile.setpos(x=random_x, y=ENEMY_TOP_Y)
  56.     enemy_missile.pendown()
  57.     enemy_missile.setheading(270)
  58.     enemy_missile.showturtle()
  59.     enemy_info = {'enemy_missile': enemy_missile, 'enemy_state': 'launched', 'enemy_radius': 0}
  60.     enemy_missiles.append(enemy_info)
  61.  
  62.  
  63. window.onclick(fire_missile)
  64.  
  65.  
  66. enemy_missiles = []
  67. our_missiles = []
  68. start_time = time.time()
  69. while True:
  70.     window.update()
  71.     # Создаем новые ракеты через заданный интервал времени и в количестве, не превышающем заданное
  72.     if time.time() > start_time + TIME_TO_CREAT_ENEMY and len(enemy_missiles) < ENEMY_ON_SCREEN:
  73.         fire_enemy_missile()
  74.         start_time = time.time()
  75.         # print(len(enemy_missiles))
  76.     for info in our_missiles:
  77.         state = info['state']
  78.         missile = info['missile']
  79.         if state == 'launched':
  80.             missile.forward(4)
  81.             target = info['target']
  82.             if missile.distance(x=target[0], y=target[1]) < 20:
  83.                 info['state'] = 'explode'
  84.                 missile.shape('circle')
  85.         elif state == 'explode':
  86.             info['radius'] += 1
  87.             if info['radius'] > 5:
  88.                 missile.clear()
  89.                 missile.hideturtle()
  90.                 info['state'] = 'dead'
  91.             else:
  92.                 missile.shapesize(info['radius'])
  93.  
  94.     dead_missiles = [info for info in our_missiles if info['state'] == 'dead']
  95.     for dead in dead_missiles:
  96.         our_missiles.remove(dead)
  97.  
  98.     for info in enemy_missiles:
  99.         enemy_state = info['enemy_state']
  100.         enemy_missile = info['enemy_missile']
  101.         if enemy_state == 'launched':
  102.             enemy_missile.forward(4)
  103.             # Когда координаты вражеской ракеты = координатам базы по оси Y
  104.             if enemy_missile.ycor() == BASE_Y:
  105.                 info['enemy_state'] = 'explode'
  106.                 enemy_missile.shape('circle')
  107.         elif enemy_state == 'explode':
  108.             info['enemy_radius'] += 1
  109.             if info['enemy_radius'] > 5:
  110.                 enemy_missile.clear()
  111.                 enemy_missile.hideturtle()
  112.                 info['enemy_state'] = 'dead'
  113.             else:
  114.                 enemy_missile.shapesize(info['enemy_radius'])
  115.     dead_enemy_missiles = [info for info in enemy_missiles if info['enemy_state'] == 'dead']
  116.     for dead in dead_enemy_missiles:
  117.         enemy_missiles.remove(dead)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement