Advertisement
Guest User

Nik's_Homework2

a guest
Dec 17th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.74 KB | None | 0 0
  1. import math
  2. import os
  3. import random
  4. import time
  5. import turtle
  6.  
  7. screen = turtle.Screen()
  8.  
  9. BASE_PATH = os.path.dirname(os.path.dirname(__file__))
  10. ENEMY_COUNT = 5
  11. BASE_X, BASE_Y = 0, -300
  12. BUILDIG_INFOS = {
  13.     'house': [BASE_X - 500, BASE_Y],
  14.     'kremlin': [BASE_X - 200, BASE_Y],
  15.     'nuclear': [BASE_X + 200, BASE_Y],
  16.     'skyscraper': [BASE_X + 400, BASE_Y]
  17. }
  18.  
  19. score = 0
  20. class Missile:
  21.  
  22.     def __init__(self, x, y, color, x2, y2):
  23.         self.color = color
  24.         # screen = turtle.Screen()
  25.         # pic_path = os.path.join(BASE_PATH, "images", "Circular_Blaze.gif")
  26.         # screen.addshape(pic_path)
  27.         # turtle.shape(pic_path)
  28.         pen = turtle.Turtle(visible=False)
  29.         pen.speed(0)
  30.         pen.color(color)
  31.         pen.pensize(5.5)
  32.         pen.penup()
  33.         pen.setpos(x=x, y=y)
  34.         pen.pendown()
  35.         heading = pen.towards(x2, y2)
  36.         pen.setheading(heading)
  37.         pen.showturtle()
  38.         self.pen = pen
  39.  
  40.         if color == "white":
  41.             window.register_shape(os.path.join(BASE_PATH, "images", "UFO.gif"))
  42.             pen.shape(os.path.join(BASE_PATH, "images", "UFO.gif"))
  43.             pen.resizemode()
  44.  
  45.         if color == "red":
  46.             window.register_shape(os.path.join(BASE_PATH, "images", "EnemyShip.gif"))
  47.             pen.shape(os.path.join(BASE_PATH, "images", "EnemyShip.gif"))
  48.             pen.resizemode()
  49.  
  50.         self.state = 'launched'
  51.         self.target = x2, y2
  52.         self.radius = 0
  53.  
  54.     def step(self):
  55.         global score
  56.         if self.state == 'launched':
  57.             self.pen.forward(6)
  58.             if self.pen.distance(x=self.target[0], y=self.target[1]) < 20:
  59.                 self.state = 'explode'
  60.                 self.pen.shape('circle')
  61.         elif self.state == 'explode':
  62.             self.radius += 1
  63.             if self.radius > 5:
  64.                 self.pen.clear()
  65.                 self.pen.hideturtle()
  66.                 self.state = 'dead'
  67.             else:
  68.                 self.pen.shapesize(self.radius)
  69.         elif self.state == 'dead':
  70.             self.pen.clear()
  71.             self.pen.hideturtle()
  72.             score += 5
  73.  
  74.     def distance(self, x, y):
  75.         return self.pen.distance(x=x, y=y)
  76.  
  77.     @property
  78.     def x(self):
  79.         return self.pen.xcor()
  80.  
  81.     @property
  82.     def y(self):
  83.         return self.pen.ycor()
  84.  
  85.  
  86. class Building:
  87.     INITIAL_HEALTH = 1000
  88.  
  89.     def __init__(self, x, y, name):
  90.         self.name = name
  91.         self.x = x
  92.         self.y = y
  93.         self.health = self.INITIAL_HEALTH
  94.  
  95.         pen = turtle.Turtle()
  96.         pen.hideturtle()
  97.         pen.speed(0)
  98.         pen.penup()
  99.         pen.setpos(x=self.x, y=self.y)
  100.         pic_path = os.path.join(BASE_PATH, "images", self.get_pic_name())
  101.         window.register_shape(pic_path)
  102.         pen.shape(pic_path)
  103.         pen.showturtle()
  104.         self.pen = pen
  105.  
  106.         title = turtle.Turtle(visible=False)
  107.         title.speed(0)
  108.         title.penup()
  109.         title.setpos(x=self.x, y=self.y - 85)
  110.         title.color('white')
  111.         title.write(str(self.health), align="center", font=["Arial", 20, "bold"])
  112.         self.title = title
  113.         self.title_health = self.health
  114.  
  115.     def get_pic_name(self):
  116.         if self.health < self.INITIAL_HEALTH * 0.2:
  117.             return f"{self.name}_3.gif"
  118.         if self.health < self.INITIAL_HEALTH * 0.8:
  119.             return f"{self.name}_2.gif"
  120.         return f"{self.name}_1.gif"
  121.  
  122.     def draw(self):
  123.         pic_name = self.get_pic_name()
  124.         pic_path = os.path.join(BASE_PATH, "images", pic_name)
  125.         if self.pen.shape() != pic_path:
  126.             window.register_shape(pic_path)
  127.             self.pen.shape(pic_path)
  128.         if self.health != self.title_health:
  129.             self.title_health = self.health
  130.             self.title.clear()
  131.             self.title.write(str(self.title_health), align="center", font=["Arial", 20, "bold"])
  132.  
  133.     def is_alive(self):
  134.         return self.health >= 0
  135.  
  136.  
  137. class MissileBase(Building):
  138.     INITIAL_HEALTH = 2000
  139.  
  140.     def get_pic_name(self):
  141.         for missile in our_missiles:
  142.             if missile.distance(self.x, self.y) < 50:
  143.                 pic_name = f"{self.name}_opened.gif"
  144.                 break
  145.         else:
  146.             pic_name = f"{self.name}.gif"
  147.         return pic_name
  148.  
  149.  
  150. def fire_missile(x, y):
  151.     info = Missile(color='white', x=BASE_X, y=BASE_Y + 30, x2=x, y2=y)
  152.     our_missiles.append(info)
  153.  
  154.  
  155. def fire_enemy_missile():
  156.     x = random.randint(-600, 600)
  157.     y = 400
  158.     alive_buildings = [building for building in buildings if building.is_alive()]
  159.     if alive_buildings:
  160.         target = random.choice(alive_buildings)
  161.         info = Missile(color='red', x=x, y=y, x2=target.x, y2=target.y)
  162.         enemy_missiles.append(info)
  163.  
  164.  
  165. def move_missiles(missiles):
  166.     for missile in missiles:
  167.         missile.step()
  168.  
  169.     dead_missiles = [missile for missile in missiles if missile.state == 'dead']
  170.     for dead in dead_missiles:
  171.         missiles.remove(dead)
  172.  
  173.  
  174. def check_enemy_count():
  175.     if len(enemy_missiles) < ENEMY_COUNT:
  176.         fire_enemy_missile()
  177.  
  178.  
  179. def check_interceptions():
  180.     for our_missile in our_missiles:
  181.         if our_missile.state != 'explode':
  182.             continue
  183.         for enemy_missile in enemy_missiles:
  184.             if enemy_missile.distance(our_missile.x, our_missile.y) < our_missile.radius * 10:
  185.                 enemy_missile.state = 'dead'
  186.  
  187.  
  188. def game_over():
  189.     return base.health < 0
  190.  
  191.  
  192. def check_impact():
  193.     for enemy_missile in enemy_missiles:
  194.         if enemy_missile.state != 'explode':
  195.             continue
  196.         for building in buildings:
  197.             if enemy_missile.distance(building.x, building.y) < enemy_missile.radius * 10:
  198.                 building.health -= 100
  199.                 print(f'{building.name} - {building.health}')
  200.  
  201. def draw_buildings():
  202.     for building in buildings:
  203.         building.draw()
  204.  
  205.  
  206. window = turtle.Screen()
  207. window.setup(1200 + 3, 800 + 3)
  208. window.screensize(1200, 800)
  209.  
  210.  
  211. def game():
  212.     global our_missiles, enemy_missiles, buildings, base
  213.  
  214.     window.clear()
  215.     window.bgpic(os.path.join(BASE_PATH, "images", "background.png"))
  216.     window.tracer(n=2)
  217.     window.onclick(fire_missile)
  218.  
  219.     our_missiles = []
  220.     enemy_missiles = []
  221.     buildings = []
  222.  
  223.     base = MissileBase(x=BASE_X, y=BASE_Y, name='base')
  224.     buildings.append(base)
  225.  
  226.     for name, position in BUILDIG_INFOS.items():
  227.         building = Building(x=position[0], y=position[1], name=name)
  228.         buildings.append(building)
  229.  
  230.     while True:
  231.         window.update()
  232.         if game_over():
  233.             break
  234.         draw_buildings()
  235.         check_impact()
  236.         check_enemy_count()
  237.         check_interceptions()
  238.         move_missiles(missiles=our_missiles)
  239.         move_missiles(missiles=enemy_missiles)
  240.         time.sleep(.01)
  241.  
  242.     pen = turtle.Turtle(visible=False)
  243.     pen.speed(0)
  244.     pen.penup()
  245.     pen.color('red')
  246.     pen.write('game over', align="center", font=["Arial", 80, "bold"])
  247.     pen.color('white')
  248.     # pen.setpos(x=725, y=75)
  249.     if score <= 0:
  250.         pen.write('YOUR SCORE IS SO SMALL', align="center", font=["Arial", 25, "bold"])
  251.     else:
  252.         pen.write('YOUR SCORE IS - %s' % (score), align="center", font=["Arial", 25, "bold"])
  253.  
  254. while True:
  255.     game()
  256.     answer = window.textinput(title='Привет!', prompt='Хотите сыграть еще? д/н')
  257.     if answer.lower() not in ('д', 'да','Д','Да' 'y', 'yes', 'Yes', 'Y', 'n', 'no', 'No'):
  258.         break
  259.     pen = turtle.Turtle()
  260.     pen.color('red')
  261.     randint = random.randint(1,150)
  262.     for x in range(randint,250):
  263.         for y in range(randint,250):
  264.             pen.forward(x)
  265.             if y % 2 == 0:
  266.                 pen.left(y)
  267.  
  268.     pen.move(0,0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement