美文网首页
用pygame实现的飞机大战小游戏

用pygame实现的飞机大战小游戏

作者: 喔平凡心 | 来源:发表于2018-12-03 21:49 被阅读0次

pygame

Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言汇编语言)束缚。

首先需要导入pygame模块

import pygame                   
from pygame.locals import *     #locals里有event.get方法,获取键盘操作

窗口标题

pygame.display.set_caption("窗口名称")

加载图片

pygame.image.load(文件路径)

音乐

pygame.mixer.init()                      #混音器初始化
pygame.mixer.music.load(文件路径)        #加载背景音      mp3或wav格式
pygame.mixer.music.set_volume(0.2)      #设置音量,区间为0-1
pygame.mixer.Sound(文件路径).play()            #加载音乐并播放      wav或ogg格式

字体

pygame.font.SysFont("Arial",30)        #加载系统字体Arial   无法加载中文字体
pygame.font.Font("")                   #加载字体   这个可以加载中文字体,
                                       #但必须写系统的绝对路径,如下图
所示,字体名可以打开字体属性查看
字体路径
字体名称

页面刷新

pygame.display.update()

判断两个对象大小是否重叠

pygame.Rect.colliderect((pygame.Rect(x,y,x的数值,y的数值), #第一个对象的数值
                         pygame.Rect(x,y,x的数值,y的数值)))#第二个对象的数值

按键映射

        pygame.event.get()                  #获取键值
        event.type==QUIT                  #关闭
        event.type==KEYDOWN         #按下键的情况
        pressed = pygame.key.get_pressed()  # 轮询键盘接口,返回的是所有按下键值的元组
        if pressed[pygame.K_a] or pressed[pygame.K_LEFT]:  # 按下a或左键 向左移动
            hero.move_left()
        if pressed[pygame.K_w] or pressed[pygame.K_UP]:
            hero.move_up()
        if pressed[pygame.K_s] or pressed[pygame.K_DOWN]:
            hero.move_down()
        if pressed[pygame.K_d] or pressed[pygame.K_RIGHT]:
            hero.move_right()
        pygame.key.set_repeat(10,10)            # pygame.key.set_repeat(10,10)多次按一个键时的处理方法
                                              # 第一次按键事件等待10毫秒再发出,后续事件间隔10毫秒 

自己写的飞机大战

import pygame
import sys
from pygame.locals import *     #locals里有event.get方法,获取键盘操作
import random
class Hero():               #本机
    def __init__(self,img,x,y,window):
        self.img=pygame.image.load(img)
        self.x=x
        self.y=y
        self.window=window

    def display(self):      #本机显示
        self.window.blit(self.img,(self.x,self.y))

    def move_left(self):    #左移动
        if self.x<-30:
            pass
        else:
            self.x -= 3

    def move_right(self):   #右移动
        if self.x>330:
            pass
        else:
            self.x += 3

    def move_up(self):      #上移动
        if self.y<50:
            pass
        else:
            self.y -= 3

    def move_down(self):    #下移动
        if self.y>550:
            pass
        else:
            self.y += 3
    def control(self,hero):
        pressed = pygame.key.get_pressed()  # 轮询键盘接口,返回的是所有按下键值的元组
        if pressed[pygame.K_a] or pressed[pygame.K_LEFT]:  # 按下a或左键 向左移动
            hero.move_left()
        if pressed[pygame.K_w] or pressed[pygame.K_UP]:
            hero.move_up()
        if pressed[pygame.K_s] or pressed[pygame.K_DOWN]:
            hero.move_down()
        if pressed[pygame.K_d] or pressed[pygame.K_RIGHT]:
            hero.move_right()

    def fire(self):         #本机生产子弹
        hero_bullet=Bullet(".\image\\bullet2.png",self.x+50,self.y-20,self.window)
        # self.fire_list.append(hero_bullet)
        biu_list.append(hero_bullet)

    def fire_biu(self):     #子弹发射并显示
        for b in biu_list:
            b.run()
            b.display()

    def if_boool(self,dj):                  #判断本机与敌机相撞
        if pygame.Rect.colliderect(pygame.Rect(self.x,self.y,100,124),
                                pygame.Rect(dj.x,dj.y,51,39)):
            return True
        else:
            return False

class Bullet():                 #本机子弹
    def __init__(self,img,x,y,window):
        self.img=pygame.image.load(img)
        self.x=x
        self.y=y
        self.window=window

    def display(self):          #子弹显示
        self.window.blit(self.img,(self.x,self.y))

    def run(self):              #子弹运动
        self.y-=1

    def if_bool(self,dj):       #判断子弹是否与敌机相撞
        if pygame.Rect.colliderect(pygame.Rect(self.x,self.y,7,18),     #判断子弹大小是否与敌机大小重合
                                pygame.Rect(dj.x,dj.y,51,39)):
            return True
        else:
            return False

class Enemy():                  #敌机

    def __init__(self, img, x, y, window):
        self.img = pygame.image.load(img)
        self.x = x
        self.y = y
        self.window = window
        self.is_bool = False

    def run(self):              #敌机运动
        self.y+=1
        if self.y>height:
            self.x=random.randint(0,350)
            self.y=random.randint(0,100)

    def enemy_display(self):    #敌机显示
        if self.is_bool:
            self.is_bool=False
            self.x=random.randint(0,350)
            self.y=random.randint(0,100)
        self.window.blit(self.img,(self.x,self.y))

class Dj_Bullet():                 #敌机子弹
    def __init__(self,img,x,y,window):
        self.img=pygame.image.load(img)
        self.x=x
        self.y=y
        self.window=window

    def display(self):          #子弹显示
        self.window.blit(self.img,(self.x+25,self.y+60))

    def run(self,enemy):              #子弹运动
        self.y+=3
        if self.y>=652:
            self.y=enemy.y
            self.x=enemy.x
    def if_boom(self,hero):       #判断子弹是否与本机相撞
        if pygame.Rect.colliderect(pygame.Rect(self.x,self.y,7,18),     #判断子弹大小是否与敌机大小重合
                                pygame.Rect(hero.x,hero.y,102,126)):
            return True
        else:
            return False

width = 400                     #游戏界面宽度
height = 652                    #游戏界面高度
enemy_list=[]                   #敌机列表
biu_list=[]                     #本机子弹列表
dj_biu_list=[]                  #敌机子弹列表
score = 0                       #得分
def main():                                             #主函数
    global score
    pygame.init()                                       #游戏初始化
    pygame.mixer.init()                                 #混音器初始化
    pygame.mixer.music.load(".\music\main.wav")                 #载入背景音,可用MP3,wav
    pygame.mixer.music.set_volume(0.2)                  #设置音量
    pygame.mixer.music.play(-1)                         #播放,-1代表循环
    biu_sound=pygame.mixer.Sound(".\music\\biu.wav")             #载入其他音乐,只能使用wav和ogg
    biu_sound.set_volume(0.6)
    boom_sound=pygame.mixer.Sound(".\music\\boom.wav")
    boom_sound.set_volume(0.6)
    font = pygame.font.Font("C:\Windows\Fonts\simyou.ttf", 30)  # 载入字体
    pygame.display.set_caption("飞机大战")               #设置窗口名称
    window=pygame.display.set_mode((width,height))      #display显示
    bg_img=pygame.image.load(".\image\\background.png")          #载入背景图
    hero=Hero(".\image\me.png",150,528,window)                  #载入本机图片
    enemy=Enemy(".\image\enemy1.png",random.randint(0,350),random.randint(0,100),window)
    dj_bullet = Dj_Bullet(".\image\\bullet1.png", enemy.x,enemy.y,window)
    dj_biu_list.append(dj_bullet)
    enemy_list.append(enemy)

    # pygame.key.set_repeat(10,10)            # pygame.key.set_repeat(10,10)多次按一个键时的处理方法
                                              # 第一次按键事件等待10毫秒再发出,后续事件间隔10毫秒
    while True:
        window
        window.blit(bg_img,(0,0))                        #blit显示
        hero.display()
        hero.fire_biu()
        text1 = font.render(f"得分:{score}", 1, (0, 0, 0))
        window.blit(text1, (0, 0))

        for dj_b in dj_biu_list:              #敌机子弹运行
            dj_b.display()
            dj_b.run(enemy)

        for fire_i in biu_list:                         #判断子弹与敌机是否相撞
            for dj_i in enemy_list:
                if fire_i.if_bool(dj_i):
                    boom_sound.play()
                    biu_list.remove(fire_i)
                    window.blit(pygame.image.load(".\image\enemy1_down3.png"),(dj_i.x,dj_i.y))
                    score+=10
                    pygame.display.update()
                    pygame.time.delay(50)
                    enemy.x=random.randint(0,350)
                    enemy.y=0

        for dj in enemy_list:     #判断本机与敌机相撞
            if hero.if_boool(dj):
                boom_sound.play()
                window.blit(pygame.image.load(".\image\me_destroy_3.png"), (hero.x, hero.y))
                window.blit(pygame.image.load(".\image\enemy1_down3.png"), (dj.x, dj.y))
                pygame.display.update()
                pygame.time.delay(50)
                enemy.x=random.randint(0,350)
                enemy.y=0
                hero.x=0
                hero.y=528

        for dj_i in dj_biu_list:                         #判断敌机子弹与本机是否相撞
            if dj_i.if_boom(hero):
                boom_sound.play()
                window.blit(pygame.image.load(".\image\me_destroy_3.png"), (hero.x, hero.y))
                pygame.display.update()
                pygame.time.delay(50)
                dj_i.x=enemy.x
                dj_i.y=enemy.y
                hero.x=0
                hero.y=528

        for e in enemy_list:    #敌机启动
            e.run()
            e.enemy_display()

        pygame.display.update()

        for event in pygame.event.get():
            if event.type==QUIT:        #设置关闭
                    sys.exit()
                    pygame.quit()
            elif event.type==KEYDOWN:    #设置按下键的情况

                if event.key==K_SPACE:  #空格键开火
                    print("space")
                    hero.fire()
                    biu_sound.play()
        hero.control(hero)

if __name__ == '__main__':
    main()

相关文章

  • 用pygame实现的飞机大战小游戏

    pygame Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时...

  • Pygame 实现飞机大战

    运行效果 材质资源链接 提取码:e7rh

  • Java+swing版飞机大战

    Java小游戏实训——飞机大战 一、实验目的 使用Java+swing实现飞机大战小游戏 二、实验要求 1.掌握J...

  • 2018-04-09

    pygame打飞机小游戏的部分功能总结-1 首先装好pygame,然后在游戏运行的函数开始一定要进行pygame的...

  • 【pygame】面向对象实现飞机大战

    【写在前面】:本人在网上,似乎还没有找到关于飞机大战的完整程序。基本都是讲了一些比较琐碎的小知识点。那么本篇文章呢...

  • python pygame实现飞机大战游戏

    1.引言 1.1 项目背景 python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译...

  • 飞机大战

    安装pygame 1,首先安装pygame 2,验证是否安装pygame 如果安装上那就完成下列步骤,完成飞机大战...

  • 程序员式浪漫:Python 带你看雪啦!

    一、具体介绍 动态版的实现主要是依靠 pygame 这个模块,从绘制到实现动态移动,最初的想法是按照飞机大战的思路...

  • 程序员式浪漫:Python 带你看雪啦!

    一、具体介绍 动态版的实现主要是依靠 pygame 这个模块,从绘制到实现动态移动,最初的想法是按照飞机大战的思路...

  • 飞机大战model.py

    model.py """ 飞机大战:1.0 """ import pygame import random imp...

网友评论

      本文标题:用pygame实现的飞机大战小游戏

      本文链接:https://www.haomeiwen.com/subject/nsgscqtx.html