import pygame
import random
import math
# 初始化
pygame.init()
screen = pygame.display.set_mode((600, 800))
pygame.display.set_caption("淋志打飞机")
icon = pygame.image.load("img.png")
pygame.display.set_icon(icon)
bgImg = pygame.image.load("imgbg.png")
# 得分
score = 0
# 是否结束游戏
is_over = True
# 字体
font = pygame.font.Font("freesansbold.ttf", 32)
over_font = pygame.font.Font("freesansbold.ttf", 64)
# 敌人数量
number_of_enemies = 6
# 玩家飞机
playerImg = pygame.image.load("player.png")
# 玩家初始位置
playerX = 250
playerY = 600
# 玩家键盘控制移动速度
key_move = 2
# 玩家移动速度
playerXStep = 0
playerYstep = 0
# 子弹发射
bullets = []
# 敌机
enemies = []
def show_score():
text = "score: {}".format(score)
score_render = font.render(text, True, (0, 255, 0))
screen.blit(score_render, (10, 10))
def check_is_over():
if not is_over:
text = "GAME OVER"
render = over_font.render(text, True, (255, 0, 0))
screen.blit(render, (100, 300))
# 碰撞距离
def distance(bx, by, ex, ey):
a = bx - ex
b = by - ey
return math.sqrt(a*a + b*b)
# 敌人类
class Enemy:
def __init__(self):
self.img = pygame.image.load("enemy2.png")
self.x = random.randint(0, 530)
self.y = 0
self.step = random.randint(1, 10)/10*random.choice([-1, 1])
def reset(self):
self.x = random.randint(0, 530)
self.y = 0
# 子弹类
class Bullet:
def __init__(self):
self.img = pygame.image.load("bomb.png")
self.x = playerX + 20
self.y = playerY + 10
self.step = 5
def hit(self):
global score
for e in enemies:
if distance(self.x, self.y, e.x, e.y) < 50:
bullets.remove(self)
e.reset()
score += 1
def show_bullet():
for b in bullets:
screen.blit(b.img, (b.x, b.y))
b.hit()
b.y -= b.step
if b.y < 0:
bullets.remove(b)
def show_emeny():
global playerX, playerY, is_over
for e in enemies:
screen.blit(e.img, (e.x, e.y))
if is_over:
e.x += e.step
if e.x > 530 or e.x < 0:
e.step *= -1
if is_over:
e.y += random.randint(1, 10)/10
if e.y > 800:
e.y = 0
if distance(playerX, playerY, e.x, e.y) < 50:
is_over = False
# 玩家控制
def move_player():
global playerX, playerY
playerX += playerXStep
playerY += playerYstep
if playerX > 500:
playerX = 500
if playerX < 0:
playerX = 0
if playerY > 700:
playerY = 700
if playerY < 0:
playerY = 0
def main():
global playerXStep, playerYstep
# 制造敌人
for i in range(number_of_enemies):
enemies.append(Enemy())
# 游戏主循环
running = True
while running:
screen.blit(bgImg, (0, 0))
show_score()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 键盘控制移动方向
if is_over and event.type == pygame.KEYDOWN:
# 玩家移动
if event.key == pygame.K_RIGHT:
playerXStep = key_move
elif event.key == pygame.K_LEFT:
playerXStep = -key_move
elif event.key == pygame.K_UP:
playerYstep = -key_move
elif event.key == pygame.K_DOWN:
playerYstep = key_move
# 玩家发射子弹
elif event.key == pygame.K_SPACE:
bullets.append(Bullet())
if is_over and event.type == pygame.KEYUP:
playerXStep = 0
playerYstep = 0
screen.blit(playerImg, (playerX, playerY))
move_player()
show_emeny()
show_bullet()
check_is_over()
pygame.display.update()
if __name__ == '__main__':
main()