简单的飞机大战
Posted 予非池物
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的飞机大战相关的知识,希望对你有一定的参考价值。
import random
import pygame
import math
# 1.初始化界面
pygame.init()
screen = pygame.display.set_mode((800, 600)) # 设置显示窗口大小--参数是元组(宽,高)
pygame.display.set_caption("JerkOff ") # 设置标题
# 加图标
icon = pygame.image.load("ufo.png")
pygame.display.set_icon(icon)
# 加背景图
bgImg = pygame.image.load("bg.png")
# 添加背景音效
pygame.mixer.music.load("bg.wav")
pygame.mixer.music.play(-1) # -1 单曲循环一直不停
# 添加射中音效
bao_sound = pygame.mixer.Sound("exp.wav")
# 加飞机
playerImg = pygame.image.load("player.png")
# 飞机是移动的,位置定义成变量
playerX = 350
playerY = 500
playerStep = 0 # 移动步长(速度) 右移大于0,左移小于0(-5) 开始初始值为0 循环不动,否则自己就会移动
# 添加多个敌人
number_of_enemies = 6
# 分数
score = 0
font = pygame.font.Font("freesansbold.ttf", 32) # 自带字体不支持中文
# font = pygame.font.SysFont("simsunnsimsun",40) # 系统自带字体
def show_score():
text = f"score:{score}" # f让{}里面直接显示变量
score_render = font.render(text, True, (255, 255, 255)) # render渲染也就是显示 text显示的文字 True24位颜色 三原色三元组()--用三种基本的颜色红绿蓝
screen.blit(score_render, (10, 10))
class Enemy(object):
"""
敌人类:创建读个对象,产生多个敌人
"""
def __init__(self, enemy_type):
self.enemy_type = enemy_type
if self.enemy_type == 0:
self.img = pygame.image.load("enemy.png")
else:
self.img = pygame.image.load("enemy2.png")
self.x = random.randint(200, 600)
self.y = random.randint(50, 250)
self.step = random.randint(2, 6) # 敌人移动得速度
self.life = 60 # 血量
def show_enemy(self):
screen.blit(self.img, (self.x, self.y))
self.x += self.step
if self.life > 0:
self.blood()
# 控制敌人不出界
if self.x > 800 - 64 or self.x < 0: # 右边界
self.step *= -1
self.y += 40
def reset(self):
"""敌人被击中,重新开始"""
self.life -= 10
if self.life == 0:
self.x = random.randint(200, 600)
self.y = random.randint(50, 250)
self.life = 60
def blood(self):
"""血量"""
pygame.draw.rect(screen, (0, 255, 0), (self.x + 2, self.y, self.life, 2))
enemies = []
for i in range(number_of_enemies):
enemies.append(Enemy(random.randint(0, 2)))
class Bullet(object):
"""
子弹类:创建读个对象,产生多个子弹(连发)
"""
def __init__(self):
self.img = pygame.image.load("bullet.png")
self.x = playerX + 16 # (64-32)/2
self.y = playerY + 10
self.step = 10 # 子弹移动的速度
def show_bullet(self):
screen.blit(self.img, (self.x, self.y))
self.y -= self.step
def hit(self):
"""击中敌人"""
global score
for e in enemies:
if distance(self.x, self.y, e.x, e.y) < 30:
# 射中了
bullets.remove(self)
bao_sound.play()
if e.enemy_type == 0:
score += 50
else:
score += 100
e.reset() # 恢复位置
bullets = [] # 保存现有子弹,子弹可能飞出边界
def process_events():
"""监视键盘动作"""
global playerStep
global running
for event in pygame.event.get(): # 把所有用户的操作返回来,比如敲键盘、打字等
if event.type == pygame.QUIT: # 事件类型 如关闭它或敲了键盘的某个健
running = False
# 通过键盘事件控制飞机移动
if event.type == pygame.KEYDOWN: # 按下键盘 移动
if event.key == pygame.K_RIGHT: # 向右的方向键
playerStep = 5
elif event.key == pygame.K_LEFT: # 向左的方向健
playerStep = -5
elif event.key == pygame.K_SPACE: # 空格健,发送子弹
# 创建一枚子弹
bullets.append(Bullet())
if event.type == pygame.KEYUP: # 键盘抬起 不移动
playerStep = 0
# 游戏结束
is_over = False
over_font = pygame.font.Font("freesansbold.ttf", 32)
def check_is_over():
if is_over:
text = f"game is over" # f让{}里面直接显示变量
score_render = over_font.render(text, True,
(255, 0, 0)) # render渲染也就是显示 text显示的文字 True24位颜色 三原色三元组()--用三种基本的颜色红绿蓝
screen.blit(score_render, (300, 300))
def show_enemy_bullet():
global is_over
"""显示多个敌人,显示多枚子弹"""
for e in enemies:
e.show_enemy()
# 游戏结束
if e.y > 500 - 64:
# 敌人飞出界面
is_over = True
print("游戏结束了")
enemies.clear()
for b in bullets:
b.show_bullet()
b.hit()
# 子弹飞出界面
if b.y < 0:
bullets.remove(b)
def distance(bx, by, ex, ey):
x = bx - ex
y = by - ey
return math.sqrt(x * x + y * y)
def move_player():
"""移动玩家"""
global playerX, playerY, playerStep
screen.blit(playerImg, (playerX, playerY)) # 把飞机画在screen上
playerX += playerStep
# 控制飞机不出界
if playerX > 800 - 64: # 右边界
playerX = 800 - 64
if playerX < 0: # 左边界
playerX = 0
# 2.游戏主循环:游戏之所以有界面等在那里,是因为有个循环在那里
running = True
while running: # 此句下面什么也不加 界面就会卡在那里,什么也做不了,所以用event
screen.blit(bgImg, (0, 0)) # 把背景图画在screen上 坐标(0,0) 左上角0,0,先画背景,要不然会被盖住
process_events()
move_player()
show_enemy_bullet()
show_score()
check_is_over()
pygame.display.update() # 界面更新,这样画完的东西才能显示出来
# 3.接下来就是在while里画画,每一帧里铺上不同的画
注意:图片和各种音效的地址,上文代码结构如下:
以上是关于简单的飞机大战的主要内容,如果未能解决你的问题,请参考以下文章