zoukankan      html  css  js  c++  java
  • 基于pygame实现飞机大战【面向过程】

    一.简介

      pygame
    顶级pygame包
    pygame.init - 初始化所有导入的pygame模块
    pygame.quit - uninitialize所有pygame模块
    pygame.error - 标准的pygame例外
    pygame.get_error - 获取当前错误消息
    pygame.set_error - 设置当前的错误消息
    pygame.get_sdl_version - 获取SDL的版本号
    pygame.get_sdl_byteorder - 获取SDL的字节顺序
    pygame.register_quit - 注册pygame退出时要调用的函数
    pygame.encode_string - 编码Unicode或字节对象
    pygame.encode_file_path - 将Unicode或字节对象编码为文件系统路径

    pygame包代表其他人使用的顶级包。Pygame本身被分解成许多子模块,但这不会影响使用pygame的程序。

    为方便起见,pygame中的大多数顶级变量都放在名为“pygame.locals”的模块中。除了'import pygame'之外,这意味着与'from pygame.locals import *一起使用 

    当你'导入pygame'时,会自动导入所有可用的pygame子模块。请注意,某些pygame模块被视为“可选”,可能无法使用。在这种情况下,pygame将提供占位符对象而不是模块,可用于测试可用性。

    pygame.init
    初始化所有导入的pygame模块
    init() - >(numpass,numfail)

    初始化所有导入的pygame模块。如果模块失败,则不会引发异常,但如果成功那么失败的总数将作为元组返回。您始终可以手动初始化单个模块,但pygame.init()初始化所有导入的pygame模块是一种方便的方法来启动所有操作。init()各个模块功能会在失败时引发异常。

    您可能希望单独初始化不同的模块以加速您的程序或不使用您的游戏没有的东西。

    init()不止一次调用它是安全的:重复调用将不起作用。即使您拥有pygame.quit()所有模块也是如此

    pygame.quit
    uninitialize所有pygame模块
    退出() - >无

    取消初始化之前已初始化的所有pygame模块。当Python解释器关闭时,无论如何调用此方法,因此您的程序不应该需要它,除非它想要终止其pygame资源并继续。不止一次调用此函数是安全的:重复调用无效。

    注意,pygame.quit()取消初始化所有pygame模块不会退出程序。考虑让你的程序以与普通python程序结束相同的方式结束。

    异常pygame.error
    标准的pygame例外
    raise pygame.error(message)

    pygame或SDL操作失败时会引发此异常您可以捕获任何预期的问题并处理错误。始终会引发有关问题的描述性消息的异常。

    派生自RuntimeError异常,也可用于捕获这些引发的错误。

    pygame.get_error
    获取当前错误消息
    get_error() - > errorstr

    SDL维护内部错误消息。引发pygame.error()标准的pygame异常时,通常会给你这条消息您很少需要调用此函数。

    pygame.set_error
    设置当前的错误消息
    set_error(error_msg) - >无

    SDL维护内部错误消息。引发pygame.error()标准的pygame异常时,通常会给你这条消息您很少需要调用此函数。

    pygame.get_sdl_version
    获取SDL的版本号
    get_sdl_version() - > major,minor,patch

    返回SDL的三个版本号此版本在编译时构建。它可用于检测pygame可能无法使用哪些功能。

    get_sdl_version是pygame 1.7.0中的新功能

    pygame.get_sdl_byteorder
    获取SDL的字节顺序
    get_sdl_byteorder() - > int

    返回SDL的字节顺序它返回LIL_ENDIAN小端字节顺序和BIG_ENDIAN大端字节顺序。

    get_sdl_byteorder是pygame 1.8中的新功能

    pygame.register_quit
    注册pygame退出时要调用的函数
    register_quit(callable) - > None

    pygame.quit()未初始化所有pygame模块时,将调用所有已注册的退出函数。Pygame模块在初始化时会自动执行此操作。常规pygame用户不需要此功能。

    pygame.encode_string
    编码Unicode或字节对象
    encode_string([obj [,encoding [,errors [,etype]]]]) - > bytes或None

    obj:如果是Unicode,则编码; if bytes,返回不变; 如果有的话,返回None; 如果没有给出,则引发SyntaxError。

    encoding(string):如果存在,则使用编码。默认为'unicode_escape'。

    errors(string):如果给出,如何处理不可编码的字符。默认为'backslashreplace'。

    etype(异常类型):如果给定,则为编码错误引发异常类型。默认值为UnicodeEncodeError,由返回 PyUnicode_AsEncodedString()对于默认编码和错误值,应该没有编码错误。

    此函数用于编码文件路径。支持关键字参数。

    在pygame 1.9.2中添加(主要用于单元测试)

    pygame.encode_file_path
    将Unicode或字节对象编码为文件系统路径
    encode_file_path([obj [,etype]]) - > bytes或None

    obj:如果是Unicode,则编码; if bytes,返回不变; 如果有的话,返回None; 如果没有给出,则引发SyntaxError。

    etype(异常类型):如果给定,则为编码错误引发异常类型。默认值为UnicodeEncodeError,由返回 PyUnicode_AsEncodedString()

    此函数用于编码pygame中的文件路径。编码是由返回的编解码器sys.getfilesystemencoding()支持关键字参数。

    在pygame 1.9.2中添加(主要用于单元测试)

    pygame.version
    包含版本信息的小模块
    pygame.version.ver - 版本号作为字符串
    pygame.version.vernum - 版本的整数整数
    pygame.version.rev - 构建的存储库修订版

    这个模块会自动导入到pygame包中,并提供一些变量来检查已经导入的pygame版本。

    pygame.version.ver
    版本号作为字符串
    ver ='1.2'

    这是表示为字符串的版本。它也可以包含一个微型版本号e.g.,'1.5.2'

    pygame.version.vernum
    版本的整数整数
    vernum =(1,5,3)

    该版本的变量可以很容易地与相同格式的其他版本号进行比较。检查pygame版本号的示例如下所示:

    if pygame.version.vernum < (1, 5):
        print 'Warning, older version of pygame (%s)' %  pygame.version.ver
        disable_advanced_features = True
    pygame.version.rev
    构建的存储库修订版
    rev ='a6f89747b551 +'

    从中构建此程序包的存储库检出的Mercurial节点标识符。如果标识符以加号'+'结尾,则包中包含未提交的更改。请在错误报告中包含此修订号,特别是对于非发布的pygame构建。

    二.代码实现

      1 # -*- coding: utf-8 -*-
      2 """
      3 Created on Sat Jan 30 12:21:29 2019
      4 
      5 @author: zhen
      6 """
      7 
      8 import pygame
      9 import time
     10 import random
     11 from pygame.locals import *
     12 """
     13     1.搭建界面,主要是完成窗口和背景图片
     14 """
     15 
     16 
     17 def main():
     18     # 1.创建一个窗口,用来显示内容
     19     screen = pygame.display.set_mode((480, 620), 0, 32)
     20     # 设置名称
     21     pygame.display.set_caption('飞机大战')
     22     # 2.创建一个和窗口大小一样的图片用来充当背景
     23     background = pygame.image.load("D:图片stars2.jpg")
     24     # 3.创建飞机
     25     plane = pygame.image.load("D:图片hero3.png")
     26     # 4.创建敌机
     27     dj = pygame.image.load("D:图片dj1.png")
     28     # 创建飞机坐标变量
     29     x = 220
     30     y = 570
     31     # 创建敌机初始坐标
     32     djx = 0
     33     djy = 0
     34     # 设置敌机移动方向
     35     dj_move_direct = "right"
     36     # 创建友军飞机子弹
     37     fires = []
     38     x_loc = []
     39     y_loc = []
     40     # 创建友军子弹的初始位置
     41     fx = x + 20
     42     fy = 540
     43     # 友军子弹,默认不显示
     44     fire_show = "false"
     45     # 创建敌机子弹
     46     djzds = []
     47     djx_loc = []
     48     djy_loc = []
     49     # 敌机子弹初始位置
     50     djzdx = 0
     51     djzdy = 0
     52     while True:
     53         # 设定需要显示的背景图片,把背景图片覆盖窗口
     54         screen.blit(background, (0, 0))
     55         # 显示飞机
     56         screen.blit(plane, (x, y))
     57         # 显示友军子弹
     58         if fire_show == "true":
     59             for i in range(len(fires)):
     60                 if fire_show == "true":
     61                     y_loc[i] = y_loc[i]-5
     62                     screen.blit(fires[i], (x_loc[i], y_loc[i]))
     63 
     64         # 显示敌机
     65         screen.blit(dj, (djx, djy))
     66         # 敌机自动移动
     67         if djx > 400:
     68             dj_move_direct = "left"
     69         elif djx < 0:
     70             dj_move_direct = "right"
     71 
     72         if dj_move_direct == "right":
     73             djx += 1
     74         else:
     75             djx -= 1
     76 
     77         # 添加敌机子弹
     78         rand = random.randint(1, 100)
     79         if rand == 6 or rand == 8:
     80             djzd = pygame.image.load("D://图片/zd3.png")
     81             djzds.append(djzd)
     82             djx_loc.append(djx + 30)
     83             djy_loc.append(djy + 40)
     84         # 显示敌机子弹
     85         for i in range(len(djzds)):
     86             djy_loc[i] = djy_loc[i] + 5
     87             screen.blit(djzds[i], (djx_loc[i], djy_loc[i]))
     88         # 更新需要显示的内容
     89         pygame.display.update()
     90         # 获取事件
     91         for event in pygame.event.get():
     92             # 判断是否点击了退出按钮
     93             if event.type == QUIT:
     94                 print("exit")
     95                 exit()
     96             elif event.type == KEYDOWN:
     97                 # 检测是否是按键A或左方向键
     98                 if event.key == K_a or event.key == K_LEFT:
     99                     print("event.key == K_a or event.key == K_LEFT")
    100                     if x > 0:
    101                         x -= 10
    102                 # 检测是否是按键D或右方向键
    103                 elif event.key == K_d or event.key == K_RIGHT:
    104                     print("event.key == K_d or event.key == K_RIGHT")
    105                     if x < 420:
    106                         x += 10
    107                 elif event.key == K_SPACE:
    108                     fire_show = "true"
    109                     # 创建新的友军子弹,面向过程编程已经出现麻烦的情况了,坐标要分开放置
    110                     fire = pygame.image.load("D://图片/fire5.png")
    111                     fires.append(fire)
    112                     x_loc.append(x + 20)
    113                     y_loc.append(fy)
    114                     print("fire")
    115         # 休眠
    116         time.sleep(0.01)
    117 
    118 
    119 if __name__ == "__main__":
    120     main()

    三.结果

      敌机开火&同时开火

    四.分析

      使用pygame编写一些小型游戏简洁易上手,在使用面向过程的编码方式编写时,随着逻辑复杂提高,代码的不断增加的情况下,编码越卖越复杂且难以修改,建议使用面向对象的编码方式!

     五.素材

      敌机:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_dj1.png

      敌机子弹:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_zd3.png

      友军:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_hero3.png

      友军子弹:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_fire5.png

  • 相关阅读:
    delphi 常用的将窗口置前的函数
    delphi中Message消息的使用方法
    批处理 删除文件
    CDR话单主要字段介绍
    集成学习算法总结----Boosting和Bagging
    Benchmark简介
    脚本中export不起作用的原因分析
    RAID详解[RAID0/RAID1/RAID10/RAID5]
    基于DPI(深度报文解析)的应用识别
    DPI (Deep Packet Inspection) 深度包检测技术
  • 原文地址:https://www.cnblogs.com/yszd/p/10349804.html
Copyright © 2011-2022 走看看