基于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
- if pygame.version.vernum < (1, 5):
pygame.version.
rev
-
构建的存储库修订版rev ='a6f89747b551 +'
从中构建此程序包的存储库检出的Mercurial节点标识符。如果标识符以加号'+'结尾,则包中包含未提交的更改。请在错误报告中包含此修订号,特别是对于非发布的pygame构建。
二.代码实现
- # -*- coding: utf-8 -*-
- """
- Created on Sat Jan 30 12:21:29 2019
- @author: zhen
- """
- import pygame
- import time
- import random
- from pygame.locals import *
- """
- 1.搭建界面,主要是完成窗口和背景图片
- """
- def main():
- # 1.创建一个窗口,用来显示内容
- screen = pygame.display.set_mode((480, 620), 0, 32)
- # 设置名称
- pygame.display.set_caption('飞机大战')
- # 2.创建一个和窗口大小一样的图片用来充当背景
- background = pygame.image.load("D:\图片\stars2.jpg")
- # 3.创建飞机
- plane = pygame.image.load("D:\图片\hero3.png")
- # 4.创建敌机
- dj = pygame.image.load("D:\图片\dj1.png")
- # 创建飞机坐标变量
- x = 220
- y = 570
- # 创建敌机初始坐标
- djx = 0
- djy = 0
- # 设置敌机移动方向
- dj_move_direct = "right"
- # 创建友军飞机子弹
- fires = []
- x_loc = []
- y_loc = []
- # 创建友军子弹的初始位置
- fx = x + 20
- fy = 540
- # 友军子弹,默认不显示
- fire_show = "false"
- # 创建敌机子弹
- djzds = []
- djx_loc = []
- djy_loc = []
- # 敌机子弹初始位置
- djzdx = 0
- djzdy = 0
- while True:
- # 设定需要显示的背景图片,把背景图片覆盖窗口
- screen.blit(background, (0, 0))
- # 显示飞机
- screen.blit(plane, (x, y))
- # 显示友军子弹
- if fire_show == "true":
- for i in range(len(fires)):
- if fire_show == "true":
- y_loc[i] = y_loc[i]-5
- screen.blit(fires[i], (x_loc[i], y_loc[i]))
- # 显示敌机
- screen.blit(dj, (djx, djy))
- # 敌机自动移动
- if djx > 400:
- dj_move_direct = "left"
- elif djx < 0:
- dj_move_direct = "right"
- if dj_move_direct == "right":
- djx += 1
- else:
- djx -= 1
- # 添加敌机子弹
- rand = random.randint(1, 100)
- if rand == 6 or rand == 8:
- djzd = pygame.image.load("D://图片/zd3.png")
- djzds.append(djzd)
- djx_loc.append(djx + 30)
- djy_loc.append(djy + 40)
- # 显示敌机子弹
- for i in range(len(djzds)):
- djy_loc[i] = djy_loc[i] + 5
- screen.blit(djzds[i], (djx_loc[i], djy_loc[i]))
- # 更新需要显示的内容
- pygame.display.update()
- # 获取事件
- for event in pygame.event.get():
- # 判断是否点击了退出按钮
- if event.type == QUIT:
- print("exit")
- exit()
- elif event.type == KEYDOWN:
- # 检测是否是按键A或左方向键
- if event.key == K_a or event.key == K_LEFT:
- print("event.key == K_a or event.key == K_LEFT")
- if x > 0:
- x -= 10
- # 检测是否是按键D或右方向键
- elif event.key == K_d or event.key == K_RIGHT:
- print("event.key == K_d or event.key == K_RIGHT")
- if x < 420:
- x += 10
- elif event.key == K_SPACE:
- fire_show = "true"
- # 创建新的友军子弹,面向过程编程已经出现麻烦的情况了,坐标要分开放置
- fire = pygame.image.load("D://图片/fire5.png")
- fires.append(fire)
- x_loc.append(x + 20)
- y_loc.append(fy)
- print("fire")
- # 休眠
- time.sleep(0.01)
- if __name__ == "__main__":
- 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
基于pygame实现飞机大战【面向过程】的更多相关文章
- 基于Python的飞机大战游戏
前几天决定学Python,上网找了教程看了两天,和C比起来面向对象的特性真的都很便捷,有了类开发各种敌机,子弹什么的都很方便. 在此要感谢开发pygame模块的开发人员,真的很好用(逃 效果图↓ 主函 ...
- 飞机大战-面向对象-pygame
飞机大战 最近学习了python的面向对象,对面向对象的理解不是很深刻. 面向对象是数据和函数的'打包整理',将相关数据和处理数据的方法集中在一个地方,方便使用和管理. 本着学习的目的,在网上找了这个 ...
- JS是面向过程、面向对象还是基于对象?面向对象的代码体现
一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)
接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...
- Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?
目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...
- 基于C# WinForms窗体——飞机大战
原文:基于C# WinForms窗体——飞机大战 using System; using System.Collections.Generic; using System.ComponentModel ...
- pyinstaller相关问题 & pygame文件打包成exe文件 & 武装飞船 & 飞机大战
自己照书写了一个飞机大战游戏的python程序,想把它打包成一个exe文件,在查阅相关教程并经过数次尝试后终于成功. 安装打包应用 pyinstaller 在cmd命令窗口下pip install p ...
- 11.pygame飞机大战游戏整体代码
主程序 # -*- coding: utf-8 -*- # @Time: 2022/5/20 22:26 # @Author: LiQi # @Describe: 主程序 import pygame ...
- 【二十】mysqli基于面向过程与面向对象的编程
面向过程的方式 musqli扩展库操作mysql数据库步骤: 1.获取连接并选择数据库 //语法 mysqli_connect(host,username,password,dbname,port,s ...
随机推荐
- 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储
容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...
- Code Complete-13/7/23
What is "construction"? Hava u ever used construction paper to make some things?What i ...
- SpringCloud2.0入门3-新的eureka依赖
前言 Springboot2.0推出有一段时间了,是要学习1.5+还是从2.0开始?犹豫的原因是资料不全,目前现有的资料大部分是1.0的.但作为学习者,肯定要学习最新的.不如,先试试. 搭建Eurek ...
- MFC控件编程之复选框单选框分组框
MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...
- 谈谈 JAVA 的对象序列化
所谓的『JAVA 对象序列化』就是指,将一个 JAVA 对象所描述的所有内容以文件 IO 的方式写入二进制文件的一个过程.关于序列化,主要涉及两个流,ObjectInputStream 和 Objec ...
- python的Web框架,Django自定义过滤器及标签
代码布局 有的时候框架给的过滤器不够用,需要自定义一些过滤器,所以就需要我们自己来定义一些过滤器等 自定义代码放置的路径 某个app特用(独有)的 - app 目录下的 templatetags文件夹 ...
- Perl面向对象(3):解构——对象销毁
本系列: Perl面向对象(1):从代码复用开始 Perl面向对象(2):对象 Perl面向对象(3):解构--对象销毁 第3篇依赖于第2篇,第2篇依赖于1篇. perl中使用引用计数的方式管理内存, ...
- Django 系列博客(三)
Django 系列博客(三) 前言 本篇博客介绍 django 的前后端交互及如何处理 get 请求和 post 请求. get 请求 get请求是单纯的请求一个页面资源,一般不建议进行账号信息的传输 ...
- Java核心技术 对象与类
对象与对象变量: 要想使用对象,就必须首先构造对象,并指定其初始状态,然后,对对象应用方法. 在Java中,使用构造器构造新实例.构造器是一种特殊的方法,用来构造并初始化对象. 在实际开发中,通常需要 ...
- 动态规划法(十)最长公共子序列(LCS)问题
问题介绍 给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...