Advertisement
Guest User

Game

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