飞机大战
import random
import pygame
import time
import sys
WINDOWS_H = 768
WINDOWS_W = 512
ENEMY_COUNT = 8
ENEMY_SPEED = 10
HERO_PLANE_SPEED = 12
HERO_PLANE_BULLET_SPEED = 14
class Item:
def __init__(self, img, x, y):
self.x = x
self.y = y
self.img = pygame.image.load(img)
class Boss(Item):
def __init__(self, img, x, y):
super(Boss, self).__init__(img, x, y)
self.move = "左"
self.boss_bullets = []
def boss_move(self):
if self.x >= 0 and self.move == "左":
self.x -= 3
else:
self.move = "右"
if self.x <= WINDOWS_W - 50 and self.move == "右":
self.x += 3
else:
self.move = "左"
def boss_fire(self):
bullet = Bullet("res/bullet_2.png", self.x + 50 - 10, self.y + 68)
self.boss_bullets.append(bullet)
class Map(Item):
def __init__(self, img, x, y):
super(Map, self).__init__(img, x, y)
self.x2 = x
self.y2 = y - WINDOWS_H
self.img2 = pygame.image.load(img)
def move_down(self):
self.y += 4
self.y2 += 4
class Enemy(Item):
def __init__(self, img, x, y):
super(Enemy, self).__init__(img, x, y)
self.enemy_is_hited = False
self.move = "左"
def move_down(self):
self.y += ENEMY_SPEED
def enemy_move(self):
if self.x >= 0 and self.move == "左":
self.x -= 1
else:
self.move = "右"
if self.x <= WINDOWS_W - 50 and self.move == "右":
self.x += 1
else:
self.move = "左"
class Bullet(Item):
def move_up(self):
self.y -= HERO_PLANE_BULLET_SPEED
def move_down(self):
self.y += HERO_PLANE_BULLET_SPEED
def __del__(self):
print("子弹消失了")
def hero_bullet_is_hited(self, enemy_plane):
bullet_rect = pygame.Rect(self.x, self.y, 20, 31)
enemy_rect = pygame.Rect(enemy_plane.x, enemy_plane.y, 100, 68)
flag = pygame.Rect.colliderect(bullet_rect, enemy_rect)
return flag
class HeroPlane(Item):
def __init__(self, img, x, y):
super(HeroPlane, self).__init__(img, x, y)
self.bullets = []
def move_left(self):
self.x -= HERO_PLANE_SPEED
def move_right(self):
self.x += HERO_PLANE_SPEED
def move_up(self):
self.y -= HERO_PLANE_SPEED
def move_down(self):
self.y += HERO_PLANE_SPEED
def fire(self):
bullet = Bullet("res/bullet_9.png", self.x + 50 - 10, self.y - 31)
self.bullets.append(bullet)
def hero_enemy_hited(self, enemy_plane):
hero_rect = pygame.Rect(self.x, self.y, 100, 68)
enemy_rect = pygame.Rect(enemy_plane.x, enemy_plane.y, 100, 68)
flag = pygame.Rect.colliderect(hero_rect, enemy_rect)
return flag
class Game:
def __init__(self):
pygame.init()
pygame.mixer.music.load("./res/bg2.ogg")
pygame.mixer.music.play(-1)
self.boom_sound = pygame.mixer.Sound("./res/baozha.ogg")
self.shoot_sound = pygame.mixer.Sound("./res/bullet2.wav")
self.gameover_sound = pygame.mixer.Sound("./res/gameover.wav")
self.window = pygame.display.set_mode((WINDOWS_W, WINDOWS_H))
self.map = Map("res/img_bg_level_2.jpg", 0, 0)
self.hero_plane = HeroPlane("res/hero.png", WINDOWS_W / 2 - 50, WINDOWS_H * 2 / 3)
self.enemy_planes = []
for i in range(ENEMY_COUNT):
enemy_plane = Enemy("res/img-plane_%d.png" % (random.randint(1, 7)), random.randint(0, 412),
random.randint(-2000, -68))
self.enemy_planes.append(enemy_plane)
self.score = 0
self.is_start = False
self.is_over = False
self.eneny_boom_lst = []
for i in range(1, 8):
eneny_boom = pygame.image.load("res/bomb-%d.png" % i)
self.eneny_boom_lst.append(eneny_boom)
self.boos = Boss("res/img-plane_1.png", WINDOWS_W / 2 - 50, 0)
def draw_boss(self):
if self.score >= 50:
self.window.blit(self.boos.img, (self.boos.x, self.boos.y))
self.boos.boss_move()
num = random.randint(1, 80)
if num == 1:
self.boos.boss_fire()
for bullet in self.boos.boss_bullets:
self.window.blit(bullet.img, (bullet.x, bullet.y))
def draw_map(self):
self.window.blit(self.map.img, (self.map.x, self.map.y))
self.window.blit(self.map.img2, (self.map.x2, self.map.y2))
if self.map.y > 768:
self.map.y = 0
self.map.y2 = -768
def draw_hero_plane(self):
for enemy_plane in self.enemy_planes:
if self.hero_plane.hero_enemy_hited(enemy_plane):
print("游戏结束")
for bomb in self.eneny_boom_lst:
self.window.blit(bomb, (self.hero_plane.x, self.hero_plane.y))
self.update()
self.gameover_sound.play()
self.is_over = True
self.window.blit(self.hero_plane.img, (self.hero_plane.x, self.hero_plane.y))
def draw_hero_bullet(self):
out_bullets = []
for bullet in self.hero_plane.bullets:
if bullet.y < -30:
out_bullets.append(bullet)
else:
for enemy_plane in self.enemy_planes:
if bullet.hero_bullet_is_hited(enemy_plane):
for bomb in self.eneny_boom_lst:
self.window.blit(bomb, (bullet.x, bullet.y))
out_bullets.append(bullet)
enemy_plane.enemy_is_hited = True
self.boom_sound.play()
self.score += 10
break
else:
self.window.blit(bullet.img, (bullet.x, bullet.y))
for bullet in out_bullets:
self.hero_plane.bullets.remove(bullet)
def draw_enemy_plane(self):
for enemy_plane in self.enemy_planes:
if enemy_plane.y > 768 or enemy_plane.enemy_is_hited == True:
enemy_plane.__init__("res/img-plane_%d.png" % (random.randint(1, 7)), random.randint(0, 412),
random.randint(-2000, -68))
self.window.blit(enemy_plane.img, (enemy_plane.x, enemy_plane.y))
def draw_text(self, content, score, font_size, position):
font_obj = pygame.font.Font("res/SIMHEI.TTF", font_size)
if self.score == 0:
text_obj = font_obj.render("%s" % (content), 1, (255, 255, 255))
else:
text_obj = font_obj.render("%s%d" % (content, score), 1, (255, 255, 255))
self.window.blit(text_obj, position)
def draw(self):
self.draw_map()
self.draw_hero_plane()
self.draw_hero_bullet()
self.draw_enemy_plane()
self.draw_boss()
self.draw_text("得分:", self.score, 30, (30, 30))
def update(self):
pygame.display.update()
def event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.hero_plane.fire()
self.shoot_sound.play()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
if self.hero_plane.x > 0:
self.hero_plane.move_left()
elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
if self.hero_plane.x < 412:
self.hero_plane.move_right()
if keys[pygame.K_UP] or keys[pygame.K_w]:
if self.hero_plane.y > 0:
self.hero_plane.move_up()
elif keys[pygame.K_DOWN] or keys[pygame.K_s]:
if self.hero_plane.y < 700:
self.hero_plane.move_down()
def action(self):
for bullet in self.hero_plane.bullets:
bullet.move_up()
for enemy_plane in self.enemy_planes:
enemy_plane.move_down()
enemy_plane.enemy_move()
self.map.move_down()
for bullet in self.boos.boss_bullets:
bullet.move_down()
def wait_input(self):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
sys.exit()
if event.key == pygame.K_RETURN:
if self.is_over:
self.__init__()
self.is_start = True
return
def game_start(self):
self.draw_map()
self.draw_text("飞机大战", self.score, 40, (WINDOWS_W / 3, WINDOWS_H / 3))
self.draw_text("按enter开始游戏,按Esc退出游戏", self.score, 30, (WINDOWS_W / 14, WINDOWS_H / 2))
self.update()
self.wait_input()
time.sleep(0.01)
def game_over(self):
self.draw_map()
self.draw_text("战机被击落,分数是:", self.score, 35, (100, 250))
self.draw_text("按enter开始游戏,按Esc退出游戏", self.score, 30, (100, 350))
self.update()
self.wait_input()
time.sleep(0.01)
def run(self):
while True:
if not self.is_start:
self.game_start()
self.draw()
self.update()
self.event()
self.action()
if self.is_over:
pygame.mixer.music.stop()
self.game_over()
time.sleep(0.01)
def main():
game = Game()
game.run()
if __name__ == '__main__':
main()