基于pygame实现飞机大战【面向过程】

时间:2023-01-16 11:47:07

一.简介

  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构建。

二.代码实现

 # -*- 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实现飞机大战【面向过程】

基于pygame实现飞机大战【面向过程】

四.分析

  使用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实现飞机大战【面向过程】的更多相关文章

  1. 基于Python的飞机大战游戏

    前几天决定学Python,上网找了教程看了两天,和C比起来面向对象的特性真的都很便捷,有了类开发各种敌机,子弹什么的都很方便. 在此要感谢开发pygame模块的开发人员,真的很好用(逃 效果图↓ 主函 ...

  2. 飞机大战-面向对象-pygame

    飞机大战 最近学习了python的面向对象,对面向对象的理解不是很深刻. 面向对象是数据和函数的'打包整理',将相关数据和处理数据的方法集中在一个地方,方便使用和管理. 本着学习的目的,在网上找了这个 ...

  3. JS是面向过程、面向对象还是基于对象?面向对象的代码体现

    一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...

  4. 基于Cocos2d-x-1&period;0&period;1的飞机大战游戏开发实例(中)

    接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...

  5. Python飞机大战实例有感——pygame如何实现&OpenCurlyDoubleQuote;切歌”以及多曲重奏?

    目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...

  6. 基于C&num; WinForms窗体——飞机大战

    原文:基于C# WinForms窗体——飞机大战 using System; using System.Collections.Generic; using System.ComponentModel ...

  7. pyinstaller相关问题 &amp&semi; pygame文件打包成exe文件 &amp&semi; 武装飞船 &amp&semi; 飞机大战

    自己照书写了一个飞机大战游戏的python程序,想把它打包成一个exe文件,在查阅相关教程并经过数次尝试后终于成功. 安装打包应用 pyinstaller 在cmd命令窗口下pip install p ...

  8. 【二十】mysqli基于面向过程与面向对象的编程

    面向过程的方式 musqli扩展库操作mysql数据库步骤: 1.获取连接并选择数据库 //语法 mysqli_connect(host,username,password,dbname,port,s ...

  9. 基于Cocos2d-x-1&period;0&period;1的飞机大战游戏开发实例(下)

    在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人 ...

随机推荐

  1. Webpack中hash与chunkhash的区别,以及js与css的hash指纹解耦方案

    文件的hash指纹通常作为前端静态资源实现增量更新的方案之一,Webpack是目前最流行的开源编译工具之一,其强大的功能也带来很多坑(当然,大部分麻烦其实都可以在官方文档中找到答案). 比如,在Web ...

  2. (转) jsp页面 URL传中文参数到Action里面出现乱码

    jsp页面 URL传中文参数到Action里面出现乱码,方法如下: 第一种:在Action中用 new String(str.getBytes("ISO8859_1"), &quo ...

  3. js中各种事件的兼容性

    1给元素绑定一个事件 ie8attachEvent(on+"事件",event); 高级浏览器 addEventListener("事件",event,fals ...

  4. jquery 获取设置值、添加元素详解

    jQuery 获取内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变得很容易 ...

  5. 原生js获取Html元素的实际宽度高度

    第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...

  6. Gtest打桩函数

    假设Client的定义如下 class Client { ...... public: virtual bool GetData(std::string& data); ...... }; 我 ...

  7. linux 设置 jdk环境变量

    1.安装jdk  tar zxvf jdk-8u112-linux-i586.tar.gz 2.设置环境变量:vi /etc/profile 输入i加入内容如下:export JAVA_HOME=/u ...

  8. Latex居中

    居中文本 环境:\begin{center} 第一行\\第二行\\...第n行 \end{center}.可以用\\[长度]来插入可以省略的额外行间距.在一个环境内部,可以用命令\centering来 ...

  9. 测试AtomicInteger与普通int值在多线程下的递增操作

    日期: 2014年6月10日 作者: 铁锚 Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下: java.util.concurrent.atomic.AtomicB ...

  10. 【托业】【怪兽】TEST01

    101. respectable 值得尊敬的(形容人或事物) respectful 态度恭敬的(形容人) respecting 关于…… respective 各自的 102. hardly 几乎没有 ...