Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import turtle
- import random
- window = turtle.Screen()
- window.setup(1200 + 3, 800 + 3)
- window.bgpic("images/background.png")
- window.screensize(1200, 800)
- #window.tracer(n=2)
- BASE_X, BASE_Y = 0, -300
- time_new = 1000
- time_old = 0
- def calc_heading(x1, y1, x2, y2):
- dx = x2 - x1
- dy = y2 - y1
- length = (dx ** 2 + dy ** 2) ** 0.5
- cos_alpha = dx / length
- alpha = math.acos(cos_alpha)
- alpha = math.degrees(alpha)
- if dy < 0:
- alpha = -alpha
- return alpha
- def fire_missile(x, y):
- missile = turtle.Turtle(visible=False)
- missile.speed(0)
- missile.color('white')
- missile.penup()
- missile.setpos(x=BASE_X, y=BASE_Y)
- missile.pendown()
- heading = calc_heading(x1=BASE_X, y1=BASE_Y, x2=x, y2=y)
- missile.setheading(heading)
- missile.showturtle()
- info = {'missile': missile, 'target': [x, y],
- 'state': 'launched', 'radius': 0}
- our_missiles.append(info)
- def fire_enemy_missile():
- enemy_missile = turtle.Turtle(visible=False)
- enemy_missile.speed(0)
- enemy_missile.color('red')
- enemy_missile.penup()
- x = random.randint(-600, 600)
- y = random.randint(350, 400)
- enemy_missile.setpos(x, y)
- enemy_missile.pendown()
- heading = calc_heading(x1 = x, y1 = y, x2 = BASE_X, y2 = BASE_Y)
- enemy_missile.setheading(heading)
- enemy_missile.showturtle()
- enemy_info = {'enemy_missile' : enemy_missile, 'enemy_state' : 'launched',
- 'radius' : 0}
- enemy_missiles.append(enemy_info)
- window.onclick(fire_missile)
- our_missiles = []
- enemy_missiles = []
- while True:
- window.update()
- # Каждый цикл прибавляем к таймеру 1, пытаемся сделать примитвный счетчик времени
- time_new +=1
- # Запуск новой ракеты, когда прошло нужное количесвтво тактов с запуска прошлой ракеты,
- # 50 тактов позволяют увидеть на экране до 4х ракет,
- # 100 тактов - 2 ракеты
- # начиная со 190 тактов вторая ракета на экране не успевает появиться до уничтожения первой
- # функция window.ontimer() работала как-то неправильно
- # но как таковой счетчик времени не удался, так как когда на экране нет ракет,
- # то такты проходят слишком быстро и следующая ракета вылетает сразуже
- # так что нет разницы между 200 и 10000 тактов
- if time_new-time_old >=150:
- fire_enemy_missile()
- time_old = time_new
- for info in our_missiles:
- state = info['state']
- missile = info['missile']
- if state == 'launched':
- missile.forward(4)
- target = info['target']
- if missile.distance(x=target[0], y=target[1]) < 20:
- info['state'] = 'explode'
- missile.shape('circle')
- elif state == 'explode':
- info['radius'] += 1
- if info['radius'] > 5:
- missile.clear()
- missile.hideturtle()
- info['state'] = 'dead'
- else:
- missile.shapesize(info['radius'])
- dead_missiles = [info for info in our_missiles if info['state'] == 'dead']
- for dead in dead_missiles:
- our_missiles.remove(dead)
- for enemy_info in enemy_missiles:
- enemy_state = enemy_info['enemy_state']
- enemy_missile = enemy_info['enemy_missile']
- if enemy_state == 'launched':
- enemy_missile.forward(4)
- if enemy_missile.distance(x = BASE_X, y = BASE_Y) < 20:
- enemy_info['enemy_state'] = 'explode'
- enemy_missile.shape('circle')
- elif enemy_state == 'explode':
- enemy_info['radius'] += 1
- if enemy_info['radius'] > 5:
- enemy_missile.clear()
- enemy_missile.hideturtle()
- enemy_info['enemy_state'] = 'dead'
- else:
- enemy_missile.shapesize(enemy_info['radius'])
- dead_enemy_missiles = [enemy_info for enemy_info in enemy_missiles if enemy_info['enemy_state'] == 'dead']
- for dead in dead_enemy_missiles:
- enemy_missiles.remove(dead)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement