IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 可切换开始,战斗,结算三界面的飞机小对决 ,模块化,pygame,Rect,exe打包 -> 正文阅读

[游戏开发]可切换开始,战斗,结算三界面的飞机小对决 ,模块化,pygame,Rect,exe打包

模块化拆分飞机小对决

一,类的创建

1,基类创建

2,子弹类创建

3,我方飞机类与敌方飞机类的创建

二,各个对象之间的互相影响的逻辑函数

1,击败函数

2,子弹回收函数

3,随机持续出现敌机函数

三,三个界面的搭建

1,开始介绍界面

2,战斗界面

3,结束结算界面

四,键盘事件,音乐,对象等硬件的搭建函数

1,键盘事件的获取与设置

2,音乐创建加入

3,对象创建

五,主函数

六,打包为exe

一(1):

import pygame
import sys
import time
import random
from pygame.locals import *             #  加此语句使用键盘事件

ii=0
score=0
class Base(object):
    '''
    所有的基类
    '''
    def __init__(self,filepath):
        '''
        基本属性属性
        :param filepath: 文件位置
        '''
        self.x=0
        self.y=0
        self.rect=pygame.Rect(0,0,350,500)                      #50只是初始化矩形的值  后续会做动态改动
        self.image=pygame.image.load(filepath)
        self.bulletlist=[]  #用于飞机类发射子弹
        pass
    pass

ii变量用于界面转换,score用于计分
pygame基础的了解
Rect获取对象的矩形,方便击败逻辑的判断
一(2),

class Bullet(Base):
    '''
    子弹类
    '''
    def __init__(self):
        super().__init__(filepath='./feitu/bullet.png')
        self.rect=pygame.Rect(self.x,self.y,10,10)     #获取子弹矩形区域
        self.pw=0                        #设置子弹没有碰到飞机的初始状态
        # self.pd=0                                       #设置子弹没有碰到敌方飞机的初始状态
        self.fa=0                     #0代表由我方发射  1代表由敌方发射
        pass
    def move(self):
        if self.fa==0:
            self.y-=5
            pass
        if self.fa==1:
            self.y+=5
            pass
        pass
    def judge(self):
        if self.y<-10 or self.y>500:
            return True
        else:
            return False
        pass
    pass

judge函数判断子弹是否出界,此处也可以用矩形方法判断(自由发挥,@我评论,谢谢 )
一(3):
我方飞机类:

class Woplane(Base):
    '''创造我方飞机类'''
    def __init__(self):
        super(Woplane, self).__init__(filepath='./plane1.1/wo.png')
        self.x=150
        self.y=450
        self.rect=pygame.Rect(self.x,self.y,50,50)#动态获取飞机矩形
        self.fail=0      #辅助判断是否被击中  0为未击中
        pass
    def mvr(self):
        '''
        右移
        '''
        if self.x<300:
            self.x+=12.5
            pass
        pass
    def mvl(self):
        '''
        left
        '''
        if self.x>0:
            self.x-=12.5
            pass
        pass
    def mvu(self):
        '''
        up
        '''
        if self.y>0:
            self.y-=12.5
            pass
        pass
    def mvd(self):
        '''
        down
        '''
        if self.y<450:
            self.y+=12.5
            pass
        pass
    def keydown(self):
        pass
    def keyup(self):
        pass
    def presskey(self): #持续按压产生的移动,
        pass
    def fire(self):
        bullet=Bullet()
        bullet.x=self.x+20   #重置子弹的初始坐标
        bullet.y=self.y-11
        self.bulletlist.append(bullet)
        pass
    pass

ps: 由于使用持续按压函数时键盘事件不好操纵,会无法使用单点键盘移动。与时间的调节有关。(哪个小伙伴试出来合适的了记得@我评论,谢谢)
敌方飞机类

class Diplane(Base):
    '''创造敌方飞机类'''
    def __init__(self):
        super().__init__(filepath='./plane1.1/di.png')
        self.x=150
        self.y=0
        self.rect=pygame.Rect(self.x,self.y,50,50)
        self.fail=0                         #辅助判断是否被击中 0为未击中
        self.direction='r'  # 辅助控制敌机随机移动
        pass
    def __del__(self):
        pass
    def move(self):
        '''
        敌机随机左右移动
        '''
        if self.direction=='r':
            if self.x<300:
                self.x+=25
                pass
        elif self.direction == 'l':
            if self.x>0:
                self.x-=25
                pass
            pass
        pass
    def fire(self):
        '''
        敌机随机开火
        '''
        num=random.randint(1,30)  #此处一个random控制move,fire函数
        if num==10:
            self.direction='r'
            pass
        elif num==20:
            self.direction='l'
            pass
        else:
            self.direction='s'
        if num==8 or num==22:
            bullet = Bullet()
            bullet.x=self.x+20
            bullet.y=self.y+50
            bullet.fa=1
            self.bulletlist.append(bullet)
        pass
    pass

ps:可以分离random操作,更方便控制
二(1):击败函数

def ji(screen,planefa,plane_fail):
    '''
    判断是否击中,并展示击中特效
    :param planefa: 发射子弹的飞机
    :param plane_fail: 被击中的飞机
    :return:
    '''
    for bullet in planefa.bulletlist:
        bullet.rect[0]=bullet.x                  # 动态改变子弹矩形位置
        bullet.rect[1]=bullet.y
        # print(bullet.rect)                     # 测试语句
        # print(plane_fail.rect)
        # print(planefa.rect)
        # screen.blit(bao.image,(planefa.x,planefa.y))
        if pygame.Rect.colliderect(bullet.rect,plane_fail.rect):  # 判断是否击中
            del bullet
            screen.blit(bao.image,(plane_fail.x,plane_fail.y))    # 为什莫用while不显示?
            plane_fail.fail=1
            # print('fhbrugr.................')测试语句
        pass
    pass

ps : bao.image为击败爆炸特效图片
这里我想用while循环使得特效多停留一会,但是加入后总是出错
Rect.colliderect等拓展函数链接
二(2):子弹回收

def zihui(screen,self):
    '''
    管理子弹的显示
    :param screen: 显示窗口
    :param self: 飞机
    :return:
    '''
    bulletlist1 = []
    for bullet1 in self.bulletlist:
        screen.blit(bullet1.image,(bullet1.x,bullet1.y))    #遍历并显示子弹
        bullet1.move()
        if bullet1.judge():                                 # 判断子弹是否越界
            bulletlist1.append(bullet1)
            pass
        pass
    for bullet2 in bulletlist1:
        self.bulletlist.remove(bullet2)
        del bullet2
        pass
    pass

ps: 不要直接在bulletlist里面进行del操作,容易报错
二(3):随机持续出现敌机

def suiji():
    '''持续出现敌机'''
    global score
    if dilist[0].fail == 1:
        di = Diplane()
        dilist.append(di)
        del dilist[0]
        num = random.randint(0,250)
        dilist[0].x = num  #出现的敌机位置随机
        dilist[0].fail = 0
        score += 1
    pass

ps: 用dilist[0]代表当前敌机

三(1):开始介绍页面
开始介绍页面:

def kai():
    '''开始画面的展示'''
    t1='Welcome to plane'                                   #设置文字内容
    t2='asdw control move;' \
       ' e control attack'
    t3='If you want to start; ' \
       'please enter'
    t1_font=pygame.font.SysFont('Arial',33)                 #设置文字  格式及大小 并创建文字对象
    t2_font = pygame.font.SysFont('Arial',20)
    t3_font = pygame.font.SysFont('Arial',20)
    t1_surf=t1_font.render(t1,1,(255,255,0))                #设置文字颜色
    t2_surf = t2_font.render(t2, 1, (150,36,5))
    t3_surf = t3_font.render(t3, 1, (100,50,90))
    screen.blit(kai_background.image,(0,0))                       #显示开始背景
    screen.blit(t1_surf,(20,50))                            #显示文字以及背景
    screen.blit(t2_surf,(20,120))
    screen.blit(t3_surf, (20, 200))
    pass

字体简化设置函数:

def font(content,style,height,r,g,b,x,y):
    '''
    字体创建函数
    :param content: 字体内容
    :param style: 字体样式
    :param height: 字体高度
    :param r: 字体RGB
    :param g:
    :param b:
    :param x: 字体位置
    :param y:
    :return:
    '''
    s0=content
    s0_font=pygame.font.SysFont(style,height)
    s0_surf=s0_font.render(s0,1,(r,g,b))
    screen.blit(s0_surf,(x,y))
    pass

》》》字体详解(pygame.font)

三(2):战斗界面

def zhan():
    '''战斗画面的展示'''
    global ii                # 标记以下出现的ii与score为全局变量
    global score                 
    screen.blit(zhan_background.image,(0,0))#战斗背景展示
    screen.blit(wo.image,(wo.x,wo.y))
    screen.blit(dilist[0].image,(dilist[0].x,dilist[0].y))
    wo.rect[0]=wo.x                              # 动态改变矩形位置
    wo.rect[1]=wo.y
    dilist[0].rect[0]=dilist[0].x
    dilist[0].rect[1] = dilist[0].y
    zihui(screen,wo)                             # 展示  移动 回收子弹
    zihui(screen,dilist[0])
    ji(screen,wo,dilist[0])                      # 判断是否被击中
    ji(screen,dilist[0],wo)
    dilist[0].move()                             # 敌机随机移动并发射
    dilist[0].fire()
    if wo.fail==1:   # 判断我方飞机是否失败  引入ii  使其能够转入结算页面
        ii+=1
        pass
    suiji()
    # s0='score'+str(score)              # 未采用font函数
    # s0_font=pygame.font.SysFont('corbel',30)
    # s0_surf=s0_font.render(s0,1,(200,38,48))
    # screen.blit(s0_surf,(0,470))
    font('score'+str(score),'corbel',30,200,30,50,0,470)   # 采用font函数创建字体
    pass

ps: 此处用到的wo,dilist[0],screen,等会在下面的模块创建
三(3):结束画面的展示

def jiesuan():
    '''结算画面的展示'''
    screen.blit(jie_background.image,(0,0))#显示背景
    font('HAPPY GAME','calibri',40,240,90,80,10,50)
    font('You score is >>'+str(score),'calibri',40,240,90,80,10,100)
    font('If you want again>>>press <shift>','calibri',20,255,80,40,10,160)
    lotime=time.strftime('%Y/%M/%d',time.localtime())                           # 可以利用time模块添加历史记录功能
    font('Time is>>>'+lotime, 'calibri',20, 255, 80, 40, 10, 190)
    # pygame.init()
    wo.bulletlist.clear()
    dilist[0].bulletlist.clear()
    wo.x=150
    wo.y=450
    pass

ps:此处可以增添历史记录功能(感兴趣的小伙伴可以自己发挥,记得@我评论,谢谢)
四(1):键盘事件

def event_control(plane):
    global ii
    global score
    eventlist = pygame.event.get()   #获取键盘事件
    for i in eventlist:
        if i.type == QUIT:
            print('退出')
            sys.exit()
            pass
        elif i.type == KEYDOWN:
            if i.key == K_a or i.type == K_LEFT:#控制移动
                print('左')
                plane.mvl()
                pass
            elif i.key == K_d or i.type == K_RIGHT:
                print('右')
                plane.mvr()
                pass
            elif i.key == K_w or i.type == K_UP:
                print('上')
                print(i.key)
                plane.mvu()
                pass
            elif i.key == K_s or i.type == K_DOWN :
                print('下')
                print(type(K_s))                            # 测试语句
                plane.mvd()
                pass
            elif i.key == K_e:
                print('e')
                print(i.type)
                plane.fire()
                pass

            elif i.key==K_RETURN and ii==0:
                ii+=1
                print(ii)
                pass
            elif i.key==K_RSHIFT or i.key==K_LSHIFT:   #代表结束后按下shift键后重启游戏
                ii=1
                wo.fail=0
                score=0
                pass
            # plane.keydown(i.key)
            pass
        elif i.type==KEYUP :  #keyup 与 keydown是用于持续按压的设置,供参考
            plane.keyup()
        pass
    pass

》》》》键盘事件详解
四(2):音乐创建加入

def music():
    # 添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./feitu/b.mp3')
    pygame.mixer.music.set_volume(0.04)
    pygame.mixer.music.play(-1)
    pass

ps:音乐(music模块)的详解(致谢来自江南的你)
四(3):对象创建

kai_background=Base('./plane1.1/kai.png')           # 创建开始背景对象
zhan_background=Base('./plane1.1/zhan.png')         # 创建战斗背景图
jie_background=Base('./plane1.1/ji.png')            # 创建结算背景图
bao=Base('./plane1.1/bao.png')                      # 创键爆炸图
wo=Woplane()
di=Diplane()																	# 敌机,我机创建
dilist=[]																			# 敌机列表,用于持续出现敌机
dilist.append(di)


五:主函数

if __name__=='__main__':
    pygame.init()
    pygame.font.init()
    clock=pygame.time.Clock()                         # 设置游戏时钟
    # 创建一个窗口
    screen=pygame.display.set_mode((350,500))
    #设置一个标题
    pygame.display.set_caption('飞机小对决')
    music()
    # global ii
    # ii = 0
    while True:
        clock.tick(20)                  #设置每秒执行次数
        event_control(wo)
        if ii==0:
            kai()
            # print(ii)                 # 测试语句
            # i+=1
            pass
        elif ii==1:
            zhan()
            # i+=1
            pass
        else:
            jiesuan()
            pass
        pygame.display.update()
        pygame.event.get()
        pass
    pass
    

六,打包为exe
使用PyInstaller生成exe文件


关于pygame模块不了解的地方可以去看 来自江南的你
他的文章将的很好

[成品下载]链接: https://pan.baidu.com/s/1UV4UCg2LZfHGThlitCaNRw
提取码: kvfm
复制这段内容后打开百度网盘手机App,操作更方便哦

觉得不错留个赞哦,谢谢

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:17:25  更:2021-10-17 12:17:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:40:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码