飞机大战
学习来自:B站“麦叔编程”
--兴趣使人快乐!
源码
# coding:utf-8
'打飞机ybt'
import pygame
import random
import mathfrom 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 overfor i in enemies:win.blit(i.img,(i.x,i.y))i.x += i.stepif (i.x > 736 or i.x <0):i.step*=-1 #*-1改变增量正负号i.y+=40if i.y >=450:over =Trueprint ("game over")enemies.clear() #列表清空敌人#计算飞机到敌人的距离;勾股定理#欧几里得距离
def distance(bx, by, ex, ey):a = bx - exb = by - eyreturn 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 scorefor i in enemies:if distance(self.x,self.y,i.x,i.y) < 30:#判断子弹到敌人的距离小于30#击中后移除敌人hits.play() #播放击中音乐bullets.remove(self)i.reset() #重置敌人位置score+=1breakbullets = [] #子弹类收集列表
#显示子弹方法
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: #飞机大小占64flyx=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 = 3elif i.key == pygame.K_LEFT: # LEFT 向右方向键flyStep = -3elif 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工具