用PYGAME制作一个飞机大战游戏

首先,你要先安装pygame

可以看https://blog.csdn.net/qq_39480940/article/details/127621519

然后,本次会用到一些函数(pygame的函数)

(pygame.init() 这个是初始化函数,只要加在开头就可以了

pygame.image.load(path)导入图片,path是图片路径

screen = pygame.display.set_mode(size,pygame.FULLSCREEN)这里是设置窗口,我这里设置的是全屏,大家也可以根据个人喜好调整窗口大小,具体参数可以百度,这里就不列出来水字数了

pygame.display.set_caption(title)这是设置你的程序的标题

pygame.time.get_ticks()获取游戏时间

pygame.time.wait(t)暂停t毫秒

screen.blit(img,pos)在屏幕为pos的位置建立图片

pygame.key.get_pressed()检测按键

for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

这段话是为了让你能够退出程序

这两张图片是我做这个游戏使用的,最左边是我们自己的战机,第二个是子弹,敌机大家就把第一张图垂直翻转一下,偷个小懒,hiahia

第一步解决一下飞机的移动问题:

定义一个position表示飞机的坐标

 pressed = pygame.key.get_pressed() 读取哪个键正在被按着
    speed = 8
    if pressed[pygame.K_UP]:方向键上
        if position[1]>=0:
            position[1]-= speed      
    if pressed[pygame.K_LEFT]:方向键左
        if position[0]>=0:
            position[0] -= speed
    if pressed[pygame.K_DOWN]:方向键下
        if position[1]<=700:
            position[1] += speed
    if pressed[pygame.K_RIGHT]:方向键右
        if position[0]<=1400:
            position[0] += speed

第二步 实现按空格进行攻击:

定义全局变量t(时间)

x(子弹横坐标)

y(子弹纵坐标)

tot(子弹总数)

 接上一步的pressed

if pressed[pygame.K_SPACE]:按着空格
        q = pygame.time.get_ticks() 求当前时间
        if q-t>=500: 判断当前时间与上一次攻击的差值,攻击时间总要有一个攻击间隔吧()
            attack(position)攻击!

def attack(position):
    global tot
    global x
    global y
    global t
    tot+=1 子弹总数增加
    x.append(position[0])从当前位置发射子弹
    y.append(position[1])从当前位置发射子弹
    t = pygame.time.get_ticks() 记录这一次攻击的时间

第三步 随机生成敌机

这里要用随机数函数,所以需要用到random库

记得import random哦

我这里用xx和yy数组维护敌机坐标

qq维护上一台飞机生成的时间,score表示击落飞机的得分,这样可以使分数越高,飞机生成越快

 qq = pygame.time.get_ticks()
    if qq-tt>=max(500,3000-2*score):   计算一下与上台飞机的间隔时间
        cnt+=1
        xx.append(random.randint(0,1400)) 横坐标随机,如果你的窗口大小与我不一样,记得改变最远的横坐标值
        yy.append(0)     从屏幕最上方出现,所以y值为0
        tt = pygame.time.get_ticks() 记录当前飞机的时间

第四步 判断子弹是否与敌机接触以及敌机是否与自己接触:

pygame里有一个sprite模块,但我用这个模块的时候出了点小bug,所以这里用坐标判断子弹是否跟敌机有一个接触,但这样是按照矩阵来判定,并不精确哦

 for j in range(head,tot):
        for k in range(head2,cnt):
            if use[j]==0 and use2[k]==0:
                if yy[k]<=y[j] and y[j]-yy[k]<=150:
                    if x[j]-xx[k]>=-40 and x[j]-xx[k]<=150:
                        use[j]=1
                        use2[k]=1
                        score+=100

这个是判断敌机与子弹接触,有了接触就给这个子弹和敌机打上标记,不再显示他们的图像了,同时增加100分

 for j in range(head2,cnt):
        if use2[j]!=1:
            if yy[j]<=position[1] and position[1]-yy[j]<=150:
                if xx[j]>= position[0] and xx[j]-position[0]<=163:
                    ok = 1 
                    break 
                if xx[j]<=position[0] and position[0]-xx[j]<=163:
                    ok = 1 
                    break
            if yy[j]>=position[1] and yy[j]-position[1]<=150:
                if xx[j]>= position[0] and xx[j]-position[0]<=163:
                    ok = 1 
                    break 
                if xx[j]<=position[0] and position[0]-xx[j]<=163:
                    ok = 1 
                    break

这里是判断敌机与自己有没有接触,有的话标记ok,就game over了。当然这里可以用曼哈顿距离判断,我当时没想那么多,就直接写的繁琐了点

第五步:把所有板块拼接,整合成完整的游戏

import pygame
import sys
import string
import random
import os
# 初始化pygame
pygame.init()
# 定义变量
path = os.path.abspath('.')
size = width, height = 1920,1080
bg = (255, 255, 255)
# 加载logo图
score = 0
path1 = path+"\plane fight\plane.png"
path2 = path+"\plane fight\\bullet.png"
path3 = path+"\plane fight\enemy.png"
img = pygame.image.load(path1)
# 获取图像的位置
bullet = pygame.image.load(path2)
enemy = pygame.image.load(path3)
global position
position = [700,700]
# 创建一个主窗口
screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
# 标题
pygame.display.set_caption("打飞机")
global ok
ok = 0
global tot
tot = 0
global x
global y
x = []
y = []
global t
t = pygame.time.get_ticks()
head = 0 
head2 = 0
def attack():
    global tot
    global x
    global y
    global position
    global t
    tot+=1
    x.append(position[0])
    y.append(position[1])
    global ok
    ok = 1 
    t = pygame.time.get_ticks()
    
f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',50)
# 生成文本信息,第一个参数文本内容;第二个参数,字体是否平滑;
# 第三个参数,RGB模式的字体颜色;第四个参数,RGB模式字体背景颜色;
text = f.render("GAME OVER",True,(255,0,0),(0,0,0))
#获得显示对象的rect区域坐标
textRect =text.get_rect()
# 设置显示对象居中
textRect.center = (200,200)
tt = 0 
xx = []
yy = []
cnt = 0
use = [0]*1000000
use2 = [0]*1000000
while True:
    # 设置初始值
    #position2 = [10,10]
    qq = pygame.time.get_ticks()
    if qq-tt>=max(500,3000-2*score):
        cnt+=1
        xx.append(random.randint(0,1400))
        yy.append(0)
        tt = pygame.time.get_ticks()
    for j in range(head,tot):
        if use[j]!=1:
            y[j]-=8
            if y[j]<-100:
                head+=1
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        # 图像移动 KEYDOWN 键盘按下事件
        # 通过 key 属性对应按键
    pressed = pygame.key.get_pressed()
    speed = 8
    
    if pressed[pygame.K_UP]:
        if position[1]>=0:
            position[1]-= speed      
    if pressed[pygame.K_LEFT]:
        if position[0]>=0:
            position[0] -= speed
    if pressed[pygame.K_DOWN]:
        if position[1]<=700:
            position[1] += speed
    if pressed[pygame.K_RIGHT]:
        if position[0]<=1400:
            position[0] += speed
    if pressed[pygame.K_SPACE]:
        q = pygame.time.get_ticks()
        if q-t>=500:
            attack()
    # 填充背景
    screen.fill(bg)
    # 放置图片
    for j in range(head,tot):
        if use[j]!=1:
            screen.blit(bullet,[x[j],y[j]])
    for j in range(head2,cnt):
        if use2[j]!=1:
            screen.blit(enemy,[xx[j],yy[j]])
    txt = f.render(str(score),True,(255,0,0),(0,0,0))
    txtRect =txt.get_rect()
    txtRect.center = (1400,100)
    screen.blit(txt,txtRect)
    screen.blit(img,position)
    # 更新显示界面
    pygame.display.flip()
    pygame.time.wait(10)
    for j in range(head,tot):
        for k in range(head2,cnt):
            if use[j]==0 and use2[k]==0:
                if yy[k]<=y[j] and y[j]-yy[k]<=150:
                    #print(yy[k],y[j])
                    if x[j]-xx[k]>=-40 and x[j]-xx[k]<=150:
                        use[j]=1
                        use2[k]=1
                        score+=100
    ok = 0
    for j in range(head2,cnt):
        if use2[j]!=1:
            if yy[j]<=position[1] and position[1]-yy[j]<=150:
                if xx[j]>= position[0] and xx[j]-position[0]<=163:
                    ok = 1 
                    break 
                if xx[j]<=position[0] and position[0]-xx[j]<=163:
                    ok = 1 
                    break
            if yy[j]>=position[1] and yy[j]-position[1]<=150:
                if xx[j]>= position[0] and xx[j]-position[0]<=163:
                    ok = 1 
                    break 
                if xx[j]<=position[0] and position[0]-xx[j]<=163:
                    ok = 1 
                    break
    if ok == 1 :
        screen.blit(text,textRect)
        while True:
            pygame.display.flip()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
    for j in range(head2,cnt):
        yy[j]+=4
        if yy[j]>=800:
            head2+=1

细心的同学会发现,我这里的路径用到一个叫os的东东。

os其实是一个获取当前目录的模块,这样你把这个游戏发给好友,他们保存的目录不一样,也能获取到你图片的位置了(我是把图片保存在当前目录下的文件夹“plane fight”中的)

最后一步:生成exe

只有源代码没有exe也太难受了吧!

这里给大家放一个百度上这一步教程的链接https://www.codenong.com/cs106933785/

大家照着百度教的学就ok了

那本次教程到此结束,有缘再见QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值