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

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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 学习资料: Pygame官网 pygame系列 PyGame - Python Wiki 用Python和Pyga...
    水之心阅读 257评论 0 0
  • Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而...
    Cestine阅读 782评论 0 1
  • 总体目录 1.1、项目准备 1.2、使用 pygame 创建图形窗口 1.3、理解 图像 并实现图像绘制 1.4...
    IIronMan阅读 6,235评论 2 19
  • 身边多数朋友小两口经常性吵架打架,是否这对于他们来说也是种乐趣呢?一年中不停的吵吵闹闹分分 合合,分手时说过无数次...
    丁大叮阅读 859评论 0 2
  • 序,爱就是性。 爱缘何是性? 爱是生命的伟大力量,爱的生命如何精彩?爱的生命怎么样价值连城 ? 爱是一种面向朝阳的...
    量子哥阅读 1,414评论 22 28