py飞机大战
飞机大战
学习来自:B站“麦叔编程”
--兴趣使人快乐!
源码
# coding:utf-8
'打飞机ybt'
import pygame
import random
import math
from time import sleep
# 初始化,必选项
pygame.init()
#设置窗口大小
win= pygame.display.set_mode((800,600)) #宽高
#设置标题
pygame.display.set_caption('ybt打飞机')
#加载图片
icon= pygame.image.load('ufo.png')
#设置图标
pygame.display.set_icon(icon)
#加载背景图片
bg= pygame.image.load('bg.png')
# #添加分数和设置字体
score=0
#freesansbold.ttf是pygame自带的字体,32是字体大小
font = pygame.font.Font('freesansbold.ttf',32)
def show_score():
s = f"score: {score}" #f字符串表示可以直接嵌入变量
# s,是输入的文本;True表示要是24位的颜色,(0,255,0)是三原色坐标
#font.render字体颜色设置
score_render = font.render(s,True,(0,255,0))
#放入背景位置
win.blit(score_render,(10,10))
#添加游戏结束字体
#游戏结束
over=False
font1 = pygame.font.Font('freesansbold.ttf',64)
def gameOver():
if over:
gameover = font1.render("Game Over",True,(0,255,0))
win.blit(gameover,(200,250))
#添加背景音乐
# pygame.mixer.music.load('bg.wav') #加载音乐
# pygame.mixer.music.play(-1) #单曲循环
#添加击中音效
hits = pygame.mixer.Sound('exp.wav')
#引入飞机图片
fly=pygame.image.load('player.png')
#设置飞机初始坐标
flyx = 400
flyy = 500
#设置飞机迈步
flyStep=0
#定义敌人类
class Enemy(object):
def __init__(self):
self.img =pygame.image.load('enemy.png')
self.x = random.randint(100, 700)
self.y= random.randint(70, 250)
self.step = random.randint(1,4)
#敌人被击中后恢复位置,其实就是随机又放回去了
def reset(self):
self.x = random.randint(100, 700)
self.y= random.randint(70, 250)
enemies = [] #设置敌人类收集列表
for i in range(5):
enemies.append(Enemy())
#敌人方法
def enemyM():
global over
for i in enemies:
win.blit(i.img,(i.x,i.y))
i.x += i.step
if (i.x > 736 or i.x <0):
i.step*=-1 #*-1改变增量正负号
i.y+=40
if i.y >=450:
over =True
print ("game over")
enemies.clear() #列表清空敌人
#计算飞机到敌人的距离;勾股定理#欧几里得距离
def distance(bx, by, ex, ey):
a = bx - ex
b = by - ey
return math.sqrt(a*a + b*b) #sqrt方法开根号,当然也可以**0.5 #不太明天为什么计算斜边(先记住方法即可)
#定义子弹类
class Bullet(object):
def __init__(self):
self.img = pygame.image.load('bullet.png')
self.x = flyx +16 #子弹挪到飞机中间
self.y = flyy + 10 #子弹挪到飞机上方
self.step = 30
#击中
def hit(self):
global score
for i in enemies:
if distance(self.x,self.y,i.x,i.y) < 30:#判断子弹到敌人的距离小于30
#击中后移除敌人
hits.play() #播放击中音乐
bullets.remove(self)
i.reset() #重置敌人位置
score+=1
break
bullets = [] #子弹类收集列表
#显示子弹方法
def showBullets():
for b in bullets:
win.blit(b.img,(b.x,b.y))
b.hit() #尝试是否击中
b.y -=b.step
#如果出界就移除
if b.y <0:
bullets.remove(b)
#设置飞机左右临界值和移动增减量
def flyM():
global flyx #设置左右宽度移动为全局变量
flyx+=flyStep
#设置右边界
if flyx > 736: #飞机大小占64
flyx=736
#设置左边界
if flyx < 0:
flyx = 0
#执行主程序
while True:
win.blit(bg,(0,0)) #引入背景图,并设置坐标(打开的界面右上角是0,0坐标),
# 必须放到其他图片前边,要不然背景图会被覆盖
show_score() #放入分数方法
for i in pygame.event.get(): # 返回事件,如:点击鼠标,关闭游戏页面等
if i.type == pygame.QUIT: # if 事件类型==pygame.QUIT游戏退出
break
# pygame.KEYDOWN 通过键盘事件控制
if i.type == pygame.KEYDOWN: # 按键盘就移动
if i.key == pygame.K_RIGHT: # RIGHT向右的方向键
flyStep = 3
elif i.key == pygame.K_LEFT: # LEFT 向右方向键
flyStep = -3
elif i.key == pygame.K_SPACE: #空格
print ('子弹发射')
#子弹类列表实例化
b = bullets.append(Bullet())
if i.type == pygame.KEYUP: # 不按就不动
flyStep = 0
#引入飞机图,设置飞机初始宽高
win.blit(fly,(flyx,flyy))
flyM()
enemyM()
showBullets()
gameOver()
pygame.display.update() #界面更新,必须放到最后
总结
坐标系总结
(0,0)原点
|——————————————————————————————————————————————————800
|
|
|
|
|
|
|
|
|——————————————————————————————————————————————————(800,600)
600
难点问题
遗留问题咨询的打飞机游戏问题:
1.为什么要使用斜边判断飞机与怪物的距离
欧式距离判断
2.png大小使用什么工具查看
ps工具