Advertisement
Guest User

Untitled

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