第7章 sys_xlrd_os_pygame(Chapter 7 sys_ xlrd_ os_ pygame)

第7章

1.sys

  • sys模块提供了一系列有关Python运行环境的变量和函数。
  • sys.argv
    可以用sys.argv获取当前正在执行的命令行参数的参数列表(list)。 变量解释
    sys.argv[0]当前程序名
    sys.argv[1]第一个参数
    sys.argv[2]第二个参数
    len(sys.argv)-1 参数个数(减去文件名)
    import sysprint(sys.argv)print(sys.argv[0])print(sys.argv[1])print(“第二个参数:%s”%sys.argv[2])print(“参数个数:%s”%(len(sys.argv)-1))——————-结果:#python /root/mcw.py arg1 arg2[‘/root/mcw.py’, ‘arg1’, ‘arg2’]/root/mcw.py    #当前程序名arg1第二个参数:arg2参数个数:22) 如果执行用的相对路径,返回的是相对路径print(sys.argv[0])—————-结果:[root@xiaoma /root] test!#python ./mcw.py ./mcw.py#sys.argv =[‘/root/mcw.py’, ‘arg1’, ‘arg2’] ,列表第一个元素为程序执行相对路径,第二个元素开始为程序传参
import sysprint(sys.argv)print(sys.argv[0])print(sys.argv[1])print("第二个参数:%s"%sys.argv[2])print("参数个数:%s"%(len(sys.argv)-1))-------------------结果:#python /root/mcw.py arg1 arg2['/root/mcw.py', 'arg1', 'arg2']/root/mcw.py    #当前程序名arg1第二个参数:arg2参数个数:22) 如果执行用的相对路径,返回的是相对路径print(sys.argv[0])----------------结果:[root@xiaoma /root] test!#python ./mcw.py ./mcw.py#sys.argv =['/root/mcw.py', 'arg1', 'arg2'] ,列表第一个元素为程序执行相对路径,第二个元素开始为程序传参
  • sys.path
    返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    import sysprint(sys.path)———————结果:[‘D:\\aPython_full目录\\小马过河的代码练习’, ‘C:\\mcw’, ‘C:\\mcw\\venv\\Scripts\\python36.zip’, ‘C:\\python3\\DLLs’, ‘C:\\python3\\lib’, ‘C:\\python3’, ‘C:\\mcw\\venv’, ‘C:\\mcw\\venv\\lib\\site-packages’, ‘C:\\mcw\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg’, ‘C:\\mcw\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg’, ‘C:\\软件安装\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend’]添加系统环境变量:import sys,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print(BASE_DIR)#添加系统环境变量sys.path.append(BASE_DIR)print(sys.path)import syssys.path.append(“C:\python3\Scripts”)print(sys.path)——————结果:[‘D:\\………., ‘C:\\python3\\Scripts’]
import sysprint(sys.path)---------------------结果:['D:\\aPython_full目录\\小马过河的代码练习', 'C:\\mcw', 'C:\\mcw\\venv\\Scripts\\python36.zip', 'C:\\python3\\DLLs', 'C:\\python3\\lib', 'C:\\python3', 'C:\\mcw\\venv', 'C:\\mcw\\venv\\lib\\site-packages', 'C:\\mcw\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg', 'C:\\mcw\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'C:\\软件安装\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend']添加系统环境变量:import sys,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print(BASE_DIR)#添加系统环境变量sys.path.append(BASE_DIR)print(sys.path)import syssys.path.append("C:\python3\Scripts")print(sys.path)------------------结果:['D:\\.........., 'C:\\python3\\Scripts']
  • sys.platform
    获取当前执行环境的平台,如win32表示是Windows系统,linux2表示是linux平台
    print(sys.platform)————-结果:win32  ————-结果:[root@xiaoma /root] test!#python mcw.py linux2
print(sys.platform)-------------结果:win32  -------------结果:[root@xiaoma /root] test!#python mcw.py linux2
  • sys.exit(n)
    调用sys.exit(n)可以中途退出程序,当参数非0时,会引发一个SystemExit异常,从而可以在主程序中捕获该异常。
    #vim mcw.py import syssys.exit(3)———-结果:[root@xiaoma /root] test!#python mcw.py [root@xiaoma /root] test!#echo $?3
#vim mcw.py import syssys.exit(3)----------结果:[root@xiaoma /root] test!#python mcw.py [root@xiaoma /root] test!#echo $?3
  • sys.version
    获取Python解释程序的版本信息
    import sysprint(sys.version)————–结果:3.6.8 (tags/v3.6.8:3c6b436a57, Dec 23 2018, 23:31:17) [MSC v.1916 32 bit (Intel)]import sysprint(sys.version)————–结果:[root@xiaoma /root] test!#python mcw.py 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
import sysprint(sys.version)--------------结果:3.6.8 (tags/v3.6.8:3c6b436a57, Dec 23 2018, 23:31:17) [MSC v.1916 32 bit (Intel)]import sysprint(sys.version)--------------结果:[root@xiaoma /root] test!#python mcw.py 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
  • sys.getrefcount
    获取一个值的应用计数
    a = [11,22,33]b = aprint(sys.getrefcount(a))————–结果:3 #a,b,还有gerefcount方法三个都在使用这个列表
a = [11,22,33]b = aprint(sys.getrefcount(a))--------------结果:3 #a,b,还有gerefcount方法三个都在使用这个列表
  • sys.getrecursionlimit python默认支持的递归数量
  • sys.stdout.write     可以做输出重定向
    for i in range(3):    print(“魔降风云变”)import sysfor i in range(3):    sys.stdout.write(‘小马过河’)—————–结果:魔降风云变魔降风云变魔降风云变小马过河小马过河小马过河import sysfor i in range(3):    sys.stderr.write(‘小马过河’)——————结果:小马过河小马过河小马过河
    stdout 是一个类文件对象;调用它的 write 函数可以打印出你给定的任何字符串。 实际上,这就是 print 函数真正做的事情;它在你打印的字符串后面加上一个硬回车,然后调用 sys.stdout.write 函数。 在最简单的例子中,stdout 和 stderr 把它们的输出发送到相同的地方 和 stdout 一样,stderr 并不为你添加硬回车;如果需要,要自己加上。 stdout 和 stderr 都是类文件对象,但是它们都是只写的。 它们都没有 read 方法,只有 write 方法。然而,它们仍然是类文件对象,因此你可以将其它任何 (类) 文件对象赋值给它们来重定向其输出。
for i in range(3):    print("魔降风云变")import sysfor i in range(3):    sys.stdout.write('小马过河')-----------------结果:魔降风云变魔降风云变魔降风云变小马过河小马过河小马过河import sysfor i in range(3):    sys.stderr.write('小马过河')------------------结果:小马过河小马过河小马过河
  • sys.modules
    import sys,osprint(sys.modules.keys())———————–结果;dict_keys([‘builtins’, ‘sys’, ‘_frozen_importlib’, ‘_imp’, ‘_warnings’, ‘_thread’, ‘_weakref’, ‘_frozen_importlib_external’, ‘_io’, ‘marshal’, ‘nt’, ‘winreg’, ‘zipimport’, ‘encodings’, ‘codecs’, ‘_codecs’, ‘encodings.aliases’, ‘encodings.utf_8’, ‘_signal’, ‘__main__’, ‘encodings.latin_1’, ‘io’, ‘abc’, ‘_weakrefset’, ‘site’, ‘os’, ‘errno’, ‘stat’, ‘_stat’, ‘ntpath’, ‘genericpath’, ‘os.path’, ‘_collections_abc’, ‘_sitebuiltins’, ‘_bootlocale’, ‘_locale’, ‘encodings.gbk’, ‘_codecs_cn’, ‘_multibytecodec’, ‘sysconfig’, ‘encodings.cp437’, ‘sitecustomize’])
import sys,osprint(sys.modules.keys())-----------------------结果;dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'sysconfig', 'encodings.cp437', 'sitecustomize'])

2.xlrd

1.背景

  • 安装模板:
    #到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。#在cmd命令行输入:pip install xlrd
#到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。#在cmd命令行输入:pip install xlrd
  • xlrd介绍:xlrd是python环境下对excel中的数据进行读取的一个模板,可以进行的操作有: 读取有效单元格的行数、列数
    读取指定行(列)的所有单元格的值
    读取指定单元格的值
    读取指定单元格的数据类型

2.常用函数

  • 打开文件(获取一个工作表):
    import xlrddata = xlrd.open_workbook(“01.xls”)#打开当前目录下名为01.xls的文档#此时data相当于指向该文件的指针table = data.sheet_by_index(0)#通过索引获取,例如打开第一个sheet表格table = data.sheet_by_name(“sheet1”)#通过名称获取,如读取sheet1表单table = data.sheets()[0]#通过索引顺序获取# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象names = data.sheet_names()    #返回book中所有工作表的名字data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕
import xlrddata = xlrd.open_workbook("01.xls")#打开当前目录下名为01.xls的文档#此时data相当于指向该文件的指针table = data.sheet_by_index(0)#通过索引获取,例如打开第一个sheet表格table = data.sheet_by_name("sheet1")#通过名称获取,如读取sheet1表单table = data.sheets()[0]#通过索引顺序获取# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象names = data.sheet_names()    #返回book中所有工作表的名字data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕
  • 对行进行操作:
    nrows = table.nrows  #获取该sheet中的有效行数table.row(rowx)  #返回由该行中所有的单元格对象组成的列表table.row_slice(rowx)  #返回由该列中所有的单元格对象组成的列表table.row_types(rowx, start_colx=0, end_colx=None)    #返回由该行中所有单元格的数据类型组成的列表table.row_values(rowx, start_colx=0, end_colx=None)   #返回由该行中所有单元格的数据组成的列表table.row_len(rowx) #返回该列的有效单元格长度
nrows = table.nrows  #获取该sheet中的有效行数table.row(rowx)  #返回由该行中所有的单元格对象组成的列表table.row_slice(rowx)  #返回由该列中所有的单元格对象组成的列表table.row_types(rowx, start_colx=0, end_colx=None)    #返回由该行中所有单元格的数据类型组成的列表table.row_values(rowx, start_colx=0, end_colx=None)   #返回由该行中所有单元格的数据组成的列表table.row_len(rowx) #返回该列的有效单元格长度
  • 对列进行操作:
    ncols = table.ncols#获取列表的有效列数table.col(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_slice(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_types(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据类型组成的列表table.col_values(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据组成的列表
ncols = table.ncols#获取列表的有效列数table.col(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_slice(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_types(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据类型组成的列表table.col_values(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据组成的列表
  • 对单元格进行操作:
    table.cell(rowx, colx)  # 返回单元格对象table.cell_type(rowx, colx)  # 返回单元格中的数据类型table.cell_value(rowx,colx)   #返回单元格中的数据
table.cell(rowx, colx)  # 返回单元格对象table.cell_type(rowx, colx)  # 返回单元格中的数据类型table.cell_value(rowx,colx)   #返回单元格中的数据

3.os

  • os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法。更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.html

    os.path.abspath(path)
    返回path规范化的绝对路径。
    os.path.abspath(‘test.csv’) ‘C:\\Python25\\test.csv’ os.path.abspath(‘c:\\test.csv’) ‘c:\\test.csv’ os.path.abspath(‘../csv\\test.csv’) ‘C:\\csv\\test.csv’

    os.path.split(path)
    将path分割成目录和文件名二元组返回。
    os.path.split(‘c:\\csv\\test.csv’) (‘c:\\csv’, ‘test.csv’) \>>> os.path.split(‘c:\\csv\\’) (‘c:\\csv’, ”)

    os.path.dirname(path)
    返回path的目录。其实就是os.path.split(path)的第一个元素。
    os.path.dirname(‘c:\\csv\test.csv’) ‘c:\\’ os.path.dirname(‘c:\\csv’) ‘c:\\’

    os.path.basename(path)
    返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
    os.path.basename(‘c:\\test.csv’)
    ‘test.csv’
    os.path.basename(‘c:\\csv’)
    ‘csv’ (这里csv被当作文件名处理了)
    os.path.basename(‘c:\\csv\\’)

    os.path.commonprefix(list)
    返回list中,所有path共有的最长的路径。
    os.path.commonprefix([‘/home/td’,’/home/td/ff’,’/home/td/fff’])
    ‘/home/td’

    os.path.exists(path)
    如果path存在,返回True;如果path不存在,返回False。
    os.path.exists(‘c:\\’)
    True
    os.path.exists(‘c:\\csv\\test.csv’)
    False

    os.path.isabs(path)
    如果path是绝对路径,返回True。

    os.path.isfile(path)
    如果path是一个存在的文件,返回True。否则返回False。
    os.path.isfile(‘c:\\boot.ini’)
    True
    os.path.isfile(‘c:\\csv\\test.csv’)
    False
    os.path.isfile(‘c:\\csv\\’)
    False

    os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False。
    \>>> os.path.isdir(‘c:\\’)
    True
    \>>> os.path.isdir(‘c:\\csv\\’)
    False
    \>>> os.path.isdir(‘c:\\windows\\test.csv’)
    False

    os.path.join(path1[, path2[, …]])
    将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
    os.path.join(‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘windows\temp’, ‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘/home/aa’,’/home/aa/bb’,’/home/aa/bb/c’)
    ‘/home/aa/bb/c’

    os.path.normcase(path)
    在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
    \>>> os.path.normcase(‘c:/windows\\system32\\’)
    ‘c:\\windows\\system32\\’

    os.path.normpath(path)
    规范化路径。
    os.path.normpath(‘c://windows\\System32\\../Temp/’)
    ‘c:\\windows\\Temp’

    os.path.splitdrive(path)
    返回(drivername,fpath)元组
    os.path.splitdrive(‘c:\\windows’)
    (‘c:’, ‘\\windows’)

    os.path.splitext(path)
    分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
    os.path.splitext(‘c:\\csv\\test.csv’)
    (‘c:\\csv\\test’, ‘.csv’)

    os.path.getsize(path)
    返回path的文件的大小(字节)。
    os.path.getsize(‘c:\\boot.ini’)
    299L

    os.path.getatime(path)
    返回path所指向的文件或者目录的最后存取时间。

    os.path.getmtime(path)
    返回path所指向的文件或者目录的最后修改时间

  • os.path.abspath(path)
    返回path规范化的绝对路径。
    os.path.abspath(‘test.csv’) ‘C:\\Python25\\test.csv’ os.path.abspath(‘c:\\test.csv’) ‘c:\\test.csv’ os.path.abspath(‘../csv\\test.csv’) ‘C:\\csv\\test.csv’
os.path.abspath('test.csv') 'C:\\Python25\\test.csv' os.path.abspath('c:\\test.csv') 'c:\\test.csv' os.path.abspath('../csv\\test.csv') 'C:\\csv\\test.csv' 
  • os.path.split(path)
    将path分割成目录和文件名二元组返回。
    os.path.split(‘c:\\csv\\test.csv’) (‘c:\\csv’, ‘test.csv’) \>>> os.path.split(‘c:\\csv\\’) (‘c:\\csv’, ”)
os.path.split('c:\\csv\\test.csv') ('c:\\csv', 'test.csv') \>>> os.path.split('c:\\csv\\') ('c:\\csv', '') 
  • os.path.dirname(path)
    返回path的目录。其实就是os.path.split(path)的第一个元素。
    os.path.dirname(‘c:\\csv\test.csv’) ‘c:\\’ os.path.dirname(‘c:\\csv’) ‘c:\\’
 os.path.dirname('c:\\csv\test.csv') 'c:\\'  os.path.dirname('c:\\csv') 'c:\\' 
  • os.path.basename(path)
    返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
    os.path.basename(‘c:\\test.csv’)
    ‘test.csv’
    os.path.basename(‘c:\\csv’)
    ‘csv’ (这里csv被当作文件名处理了)
    os.path.basename(‘c:\\csv\\’)
os.path.basename('c:\\test.csv') 
'test.csv' 
os.path.basename('c:\\csv') 
'csv' (这里csv被当作文件名处理了) 
os.path.basename('c:\\csv\\') 
'' 
  • os.path.commonprefix(list)
    返回list中,所有path共有的最长的路径。
    os.path.commonprefix([‘/home/td’,’/home/td/ff’,’/home/td/fff’])
    ‘/home/td’
os.path.commonprefix(['/home/td','/home/td/ff','/home/td/fff']) 
'/home/td' 
  • os.path.exists(path)
    如果path存在,返回True;如果path不存在,返回False。
    os.path.exists(‘c:\\’)
    True
    os.path.exists(‘c:\\csv\\test.csv’)
    False
 os.path.exists('c:\\') 
True 
 os.path.exists('c:\\csv\\test.csv') 
False 
  • os.path.isabs(path)
    如果path是绝对路径,返回True。
  • os.path.isfile(path)
    如果path是一个存在的文件,返回True。否则返回False。
    os.path.isfile(‘c:\\boot.ini’)
    True
    os.path.isfile(‘c:\\csv\\test.csv’)
    False
    os.path.isfile(‘c:\\csv\\’)
    False
 os.path.isfile('c:\\boot.ini') 
True 
 os.path.isfile('c:\\csv\\test.csv') 
False 
 os.path.isfile('c:\\csv\\') 
False 
  • os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False。
    \>>> os.path.isdir(‘c:\\’)
    True
    \>>> os.path.isdir(‘c:\\csv\\’)
    False
    \>>> os.path.isdir(‘c:\\windows\\test.csv’)
    False
\>>> os.path.isdir('c:\\') 
True 
\>>> os.path.isdir('c:\\csv\\') 
False 
\>>> os.path.isdir('c:\\windows\\test.csv') 
False 
  • os.path.join(path1[, path2[, …]])
    将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
    os.path.join(‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘windows\temp’, ‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘/home/aa’,’/home/aa/bb’,’/home/aa/bb/c’)
    ‘/home/aa/bb/c’
os.path.join('c:\\', 'csv', 'test.csv') 
'c:\\csv\\test.csv' 
os.path.join('windows\temp', 'c:\\', 'csv', 'test.csv') 
'c:\\csv\\test.csv' 
os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c') 
'/home/aa/bb/c' 
  • os.path.normcase(path)
    在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
    \>>> os.path.normcase(‘c:/windows\\system32\\’)
    ‘c:\\windows\\system32\\’
\>>> os.path.normcase('c:/windows\\system32\\') 
'c:\\windows\\system32\\' 
  • os.path.normpath(path)
    规范化路径。
    os.path.normpath(‘c://windows\\System32\\../Temp/’)
    ‘c:\\windows\\Temp’
os.path.normpath('c://windows\\System32\\../Temp/') 
'c:\\windows\\Temp' 
  • os.path.splitdrive(path)
    返回(drivername,fpath)元组
    os.path.splitdrive(‘c:\\windows’)
    (‘c:’, ‘\\windows’)
os.path.splitdrive('c:\\windows') 
('c:', '\\windows') 
  • os.path.splitext(path)
    分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
    os.path.splitext(‘c:\\csv\\test.csv’)
    (‘c:\\csv\\test’, ‘.csv’)
os.path.splitext('c:\\csv\\test.csv') 
('c:\\csv\\test', '.csv') 
  • os.path.getsize(path)
    返回path的文件的大小(字节)。
    os.path.getsize(‘c:\\boot.ini’)
    299L
os.path.getsize('c:\\boot.ini') 
299L 
  • os.path.getatime(path)
    返回path所指向的文件或者目录的最后存取时间。
  • os.path.getmtime(path)
    返回path所指向的文件或者目录的最后修改时间

4.pygame

  • 安装Pygame
    pip install pygame
pip install pygame
  • Pygame常用模块
模块名 功能
pygame.cdrom 访问光驱
pygame.cursors 加载光标
pygame.display 访问显示设备
pygame.draw 绘制形状、线和点
pygame.event 管理事件
pygame.font 使用字体
pygame.image 加载和存储图片
pygame.joystick 使用游戏手柄或者类似的东西
pygame.key 读取键盘按键
pygame.mixer 声音
pygame.mouse 鼠标
pygame.movie 播放视频
pygame.music 播放音频
pygame.overlay 访问高级视频叠加
pygame.rect 管理矩形区域
pygame.scrap 本地剪贴板访问
pygame.sndarray 操作声音数据
pygame.sprite 操作移动图像
pygame.surface 管理图像和屏幕
pygame.surfarray 管理点阵图像数据
pygame.time 管理时间和帧信息
pygame.transform 缩放和移动图像
  • 简单示例:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 320, 240 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    pygame.quit() # 退出pygame

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 320, 240  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
pygame.quit()  # 退出pygame

制作一个跳跃的小球游戏

  • 创建一个游戏窗口,然后在窗口内创建一个小球。以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续运动按照如下步骤实现该功能:
  • 创建游戏窗口

    创建一个游戏窗口,宽和高设置为640*480。代码如下:
    import sys
    import pygame
    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode() # 显示窗口
    import sys

    import pygame

    pygame.init() # 初始化pygame

    size = width, height = 640, 480 # 设置窗口大小

    screen = pygame.display.set_mode() # 显示窗口
    上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块,接下来,设置窗口的宽和高,最后使用display模块显示窗体。

  • 创建一个游戏窗口,宽和高设置为640*480。代码如下:
    import sys
    import pygame
    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode() # 显示窗口
    import sys

    import pygame

    pygame.init() # 初始化pygame

    size = width, height = 640, 480 # 设置窗口大小

    screen = pygame.display.set_mode() # 显示窗口
    上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块,接下来,设置窗口的宽和高,最后使用display模块显示窗体。

import sys
import pygame
pygame.init()                       # 初始化pygame
size = width, height = 640, 480     # 设置窗口大小
screen = pygame.display.set_mode()  # 显示窗口
import sys

import pygame

pygame.init()                       # 初始化pygame

size = width, height = 640, 480     # 设置窗口大小

screen = pygame.display.set_mode()  # 显示窗口
display
  • display模块的常用方法
方法名 功能
pygame.display.init() 初始化display模块
pygame.display.quit() 结束display模块
pygame.display.get_init() 如果display模块已经被初始化,则返回True
pygame.display.set_mode() 初始化一个准备显示的界面
pygame.display.get_surface() 获取当前的Surface对象
pygame.display.flip() 更新整个待显示的Surface对象到屏幕上
pygame.display.update() 更新部分内容显示到屏幕上,如果没有参数,则与flip功能相同(上一条)
  • 保持窗口显示

    运行第一步的代码后会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果想要让窗口一直显示,需要使用while True让程序一直执行,此外,还需要设置关闭按钮。具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 320, 240 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    pygame.quit() # 退出pygame
    上述代码中添加了轮询事件检测。pygame.event.get()能够获取事件队列,使用for…in遍历事件,然后根据type属性判断事件类型。这里的事件处理方式与GUI类似,如event.type等于pygame.QUIT表示检测到关闭pygame窗口事件,pygame.KEYDOWN表示键盘按下事件,pygame.MOUSEBUTTONDOWN表示鼠标按下事件等。

  • 运行第一步的代码后会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果想要让窗口一直显示,需要使用while True让程序一直执行,此外,还需要设置关闭按钮。具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 320, 240 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    pygame.quit() # 退出pygame
    上述代码中添加了轮询事件检测。pygame.event.get()能够获取事件队列,使用for…in遍历事件,然后根据type属性判断事件类型。这里的事件处理方式与GUI类似,如event.type等于pygame.QUIT表示检测到关闭pygame窗口事件,pygame.KEYDOWN表示键盘按下事件,pygame.MOUSEBUTTONDOWN表示鼠标按下事件等。

while True
import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 320, 240  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()

pygame.quit()  # 退出pygame
pygame.event.get()
for...in
type
event.type
pygame.QUIT
pygame.KEYDOWN
pygame.MOUSEBUTTONDOWN
  • 加载游戏图片

    在窗口添加小球。我们先准备好一张ball.png 图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame
    上述代码中使用iamge模块的load()方法加载图片,返回值ball是一个Surface对象。Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surface,pygame.display.set_mode()就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

  • 在窗口添加小球。我们先准备好一张ball.png 图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame
    上述代码中使用iamge模块的load()方法加载图片,返回值ball是一个Surface对象。Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surface,pygame.display.set_mode()就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

ball.png
import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pygame
iamge
load()
Surface
Surface
Surface
Surface
pygame.display.set_mode()
Surface
Surface
blit()
Surface
  • Surface对象的常用方法
方法名 功能
pygame.Surface.blit() 将一个图像画到另一个图像上
pygame.Surface.convert() 转换图像的像素格式
pygame.Surface.convert_alpha() 转化图像的像素格式,包含alpha通道的转换
pygame.Surface.fill() 使用颜色填充Surface
pygame.Surface.get_rect() 获取Surface的矩形区域
  • 移动图片

    下面让小球动起来,ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以用于移动矩形。move(x, y)函数有两个参数,第一个参数是 X 轴移动的距离,第二个参数是 Y 轴移动的距离。窗口的左上角是(0, 0),如果是move(100, 50)就是左移100下移50。

    为实现小球不停移动,将move()函数添加到while循环内,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    speed = [5, 5] # 设置移动的X轴、Y轴
    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    ballrect = ballrect.move(speed) # 移动小球
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

  • 下面让小球动起来,ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以用于移动矩形。move(x, y)函数有两个参数,第一个参数是 X 轴移动的距离,第二个参数是 Y 轴移动的距离。窗口的左上角是(0, 0),如果是move(100, 50)就是左移100下移50。
ball.get_rect()
ballrect
Rect
move()
move(x, y)
  • 为实现小球不停移动,将move()函数添加到while循环内,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    speed = [5, 5] # 设置移动的X轴、Y轴
    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    ballrect = ballrect.move(speed) # 移动小球
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域

speed = [5, 5]  # 设置移动的X轴、Y轴
while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
    ballrect = ballrect.move(speed)  # 移动小球
    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pygame
  • 碰撞检测

    运行上述代码,发现小球在屏幕中一闪而过,此时,小球并没有真正消失,而是移动到窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pyga                          me
    上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。

  • 运行上述代码,发现小球在屏幕中一闪而过,此时,小球并没有真正消失,而是移动到窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pyga                          me
    上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域
speed = [5, 5]  # 设置移动的X轴、Y轴

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
            
    ballrect = ballrect.move(speed)  # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pyga                          me
  • 限制移动速度

    运行上述代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉,使用pygame的time模块,使用pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次。
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴
    clock = pygame.time.Clock() # 设置时钟

    while True: # 死循环确保窗口一直显示
    clock.tick(60) # 每秒执行60次
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

  • 运行上述代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉,使用pygame的time模块,使用pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次。
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴
    clock = pygame.time.Clock() # 设置时钟

    while True: # 死循环确保窗口一直显示
    clock.tick(60) # 每秒执行60次
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域
speed = [5, 5]  # 设置移动的X轴、Y轴
clock = pygame.time.Clock()  # 设置时钟

while True:  # 死循环确保窗口一直显示
    clock.tick(60)  # 每秒执行60次
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()

    ballrect = ballrect.move(speed)  # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pygame
  • 开发Flappy Bird游戏

    Flappy Bird是一款鸟类飞行游戏,一根手指操控按下小鸟上飞。

    分析 在Flappy Bird游戏中,主要有两个对象:小鸟、管道。可以创建Brid类和Pineline类来分别表示这两个对象。小鸟可以通过上下移动来躲避管道,所以在Brid类中创建一个bridUpdate()方法,实现小鸟的上下移动,为了体现小鸟向前飞行的特征,可以让管道一直向左侧移动,这样在窗口中就好像小鸟在向前飞行。所以在Pineline类中也创建一个updatePipeline()方法,实现管道的向左侧移动。此外还创建了3个函数:createMap()函数用于绘制地图;checkDead()函数用于判断小鸟的生命状态;getResult()函数用于获取最终分数。最后在主逻辑中实例化并调用相关方法,实现相应的功能。

  • Flappy Bird是一款鸟类飞行游戏,一根手指操控按下小鸟上飞。
  • 分析 在Flappy Bird游戏中,主要有两个对象:小鸟、管道。可以创建Brid类和Pineline类来分别表示这两个对象。小鸟可以通过上下移动来躲避管道,所以在Brid类中创建一个bridUpdate()方法,实现小鸟的上下移动,为了体现小鸟向前飞行的特征,可以让管道一直向左侧移动,这样在窗口中就好像小鸟在向前飞行。所以在Pineline类中也创建一个updatePipeline()方法,实现管道的向左侧移动。此外还创建了3个函数:createMap()函数用于绘制地图;checkDead()函数用于判断小鸟的生命状态;getResult()函数用于获取最终分数。最后在主逻辑中实例化并调用相关方法,实现相应的功能。
  • 搭建主框架
    # -*- coding:utf-8 -*-
    import sys # 导入sys模块
    import pygame # 导入pygame模块
    import random

    class Bird(object):
    “””定义一个鸟类”””
    def __init__(self):
    “””定义初始化方法”””
    pass

    def birdUpdate(self):
    pass

    class Pipeline(object):
    “””定义一个管道类”””
    def __init__(self):
    “””定义初始化方法”””

    def updatePipeline(self):
    “””水平移动”””

    def createMap():
    “””定义创建地图的方法”””
    screen.fill((255, 255, 255)) # 填充颜色(screen还没定义不要着急)
    screen.blit(background, (0, 0)) # 填入到背景
    pygame.display.update() # 更新显示

    if __name__ == ‘__main__’:
    pygame.init() # 初始化pygame
    size = width, height = 400, 650 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    clock = pygame.time.Clock() # 设置时钟
    Pipeline = Pipeline() # 实例化管道类
    while True:
    clock.tick(60) # 每秒执行60次
    # 轮询事件
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 如果检测到事件是关闭窗口
    sys.exit()

    background = pygame.image.load(“assets/background.png”) # 加载背景图片
    createMap()
    pygame.quit() # 退出
    创建小鸟类、创建管道类、计算得分、碰撞检测
    import pygame
    import sys
    import random

    class Bird(object):
    “””定义一个鸟类”””

    def __init__(self):
    “””定义初始化方法”””
    self.birdRect = pygame.Rect(65, 50, 50, 50) # 鸟的矩形
    # 定义鸟的3种状态列表
    self.birdStatus = [pygame.image.load(“assets/1.png”),
    pygame.image.load(“assets/2.png”),
    pygame.image.load(“assets/dead.png”)]
    self.status = 0 # 默认飞行状态
    self.birdX = 120 # 鸟所在X轴坐标,即是向右飞行的速度
    self.birdY = 350 # 鸟所在Y轴坐标,即上下飞行高度
    self.jump = False # 默认情况小鸟自动降落
    self.jumpSpeed = 10 # 跳跃高度
    self.gravity = 5 # 重力
    self.dead = False # 默认小鸟生命状态为活着

    def birdUpdate(self):
    if self.jump:
    # 小鸟跳跃
    self.jumpSpeed -= 1 # 速度递减,上升越来越慢
    self.birdY -= self.jumpSpeed # 鸟Y轴坐标减小,小鸟上升
    else:
    # 小鸟坠落
    self.gravity += 0.2 # 重力递增,下降越来越快
    self.birdY += self.gravity # 鸟Y轴坐标增加,小鸟下降
    self.birdRect[1] = self.birdY # 更改Y轴位置

    class Pipeline(object):
    “””定义一个管道类”””

    def __init__(self):
    “””定义初始化方法”””
    self.wallx = 400 # 管道所在X轴坐标
    self.pineUp = pygame.image.load(“assets/top.png”)
    self.pineDown = pygame.image.load(“assets/bottom.png”)

    def updatePipeline(self):
    “”””管道移动方法”””
    self.wallx -= 5 # 管道X轴坐标递减,即管道向左移动
    # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
    if self.wallx < -80: global score score += 1 self.wallx = 400 def createMap(): """定义创建地图的方法""" screen.fill((255, 255, 255)) # 填充颜色 screen.blit(background, (0, 0)) # 填入到背景 # 显示管道 screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300)) # 上管道坐标位置 screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500)) # 下管道坐标位置 Pipeline.updatePipeline() # 管道移动 # 显示小鸟 if Bird.dead: # 撞管道状态 Bird.status = 2 elif Bird.jump: # 起飞状态 Bird.status = 1 screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 设置小鸟的坐标 Bird.birdUpdate() # 鸟移动 # 显示分数 screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50)) # 设置颜色及坐标位置 pygame.display.update() # 更新显示 def checkDead(): # 上方管子的矩形位置 upRect = pygame.Rect(Pipeline.wallx, -300, Pipeline.pineUp.get_width() - 10, Pipeline.pineUp.get_height()) # 下方管子的矩形位置 downRect = pygame.Rect(Pipeline.wallx, 500, Pipeline.pineDown.get_width() - 10, Pipeline.pineDown.get_height()) # 检测小鸟与上下方管子是否碰撞 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect): Bird.dead = True # 检测小鸟是否飞出上下边界 if not 0 < Bird.birdRect[1] < height: Bird.dead = True return True else: return False def getResutl(): final_text1 = "Game Over" final_text2 = "Your final score is: " + str(score) ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体 ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 设置第一行文字颜色 ft2_font = pygame.font.SysFont("Arial", 50) # 设置第二行文字字体 ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置第二行文字颜色 screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置 screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 设置第二行文字显示位置 pygame.display.flip() # 更新整个待显示的Surface对象到屏幕上 if __name__ == '__main__': """主程序""" pygame.init() # 初始化pygame pygame.font.init() # 初始化字体 font = pygame.font.SysFont("Arial", 50) # 设置字体和大小 size = width, height = 400, 650 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 clock = pygame.time.Clock() # 设置时钟 Pipeline = Pipeline() # 实例化管道类 Bird = Bird() # 实例化鸟类 score = 0 while True: clock.tick(60) # 每秒执行60次 # 轮询事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead: Bird.jump = True # 跳跃 Bird.gravity = 5 # 重力 Bird.jumpSpeed = 10 # 跳跃速度 background = pygame.image.load("assets/background.png") # 加载背景图片 if checkDead(): # 检测小鸟生命状态 getResutl() # 如果小鸟死亡,显示游戏总分数 else: createMap() # 创建地图 pygame.quit() import pygame import sys pygame.init()* # 初始化pygame* size = width, height =320,240* # 设置窗口大小* screen = pygame.display.set_mode(size)* # 显示窗口* whileTrue:* # 死循环确保窗口一直显示* for event in pygame.event.get():*# 遍历所有事件* if event.type== pygame.QUIT:*# 如果单击关闭窗口,则退出* sys.exit() pygame.quit()* # 退出pygame*

# -*- coding:utf-8 -*-
import sys  # 导入sys模块
import pygame  # 导入pygame模块
import random


class Bird(object):
    """定义一个鸟类"""
    def __init__(self):
        """定义初始化方法"""
        pass

    def birdUpdate(self):
        pass


class Pipeline(object):
    """定义一个管道类"""
    def __init__(self):
        """定义初始化方法"""

    def updatePipeline(self):
        """水平移动"""


def createMap():
    """定义创建地图的方法"""
    screen.fill((255, 255, 255))  # 填充颜色(screen还没定义不要着急)
    screen.blit(background, (0, 0))  # 填入到背景
    pygame.display.update()  # 更新显示


if __name__ == '__main__':
    pygame.init()                           # 初始化pygame
    size = width, height = 400, 650         # 设置窗口大小
    screen = pygame.display.set_mode(size)  # 显示窗口
    clock = pygame.time.Clock()             # 设置时钟
    Pipeline = Pipeline()                   # 实例化管道类
    while True:
        clock.tick(60)                      # 每秒执行60次
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:   # 如果检测到事件是关闭窗口
                sys.exit()

        background = pygame.image.load("assets/background.png")  # 加载背景图片
        createMap()
    pygame.quit()  # 退出
import pygame
import sys
import random


class Bird(object):
    """定义一个鸟类"""

    def __init__(self):
        """定义初始化方法"""
        self.birdRect = pygame.Rect(65, 50, 50, 50)  # 鸟的矩形
        # 定义鸟的3种状态列表
        self.birdStatus = [pygame.image.load("assets/1.png"),
                           pygame.image.load("assets/2.png"),
                           pygame.image.load("assets/dead.png")]
        self.status = 0      # 默认飞行状态
        self.birdX = 120     # 鸟所在X轴坐标,即是向右飞行的速度
        self.birdY = 350     # 鸟所在Y轴坐标,即上下飞行高度
        self.jump = False    # 默认情况小鸟自动降落
        self.jumpSpeed = 10  # 跳跃高度
        self.gravity = 5     # 重力
        self.dead = False    # 默认小鸟生命状态为活着

    def birdUpdate(self):
        if self.jump:
            # 小鸟跳跃
            self.jumpSpeed -= 1           # 速度递减,上升越来越慢
            self.birdY -= self.jumpSpeed  # 鸟Y轴坐标减小,小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2           # 重力递增,下降越来越快
            self.birdY += self.gravity    # 鸟Y轴坐标增加,小鸟下降
        self.birdRect[1] = self.birdY     # 更改Y轴位置


class Pipeline(object):
    """定义一个管道类"""

    def __init__(self):
        """定义初始化方法"""
        self.wallx = 400  # 管道所在X轴坐标
        self.pineUp = pygame.image.load("assets/top.png")
        self.pineDown = pygame.image.load("assets/bottom.png")

    def updatePipeline(self):
        """"管道移动方法"""
        self.wallx -= 5  # 管道X轴坐标递减,即管道向左移动
        # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
        if self.wallx < -80:
            global score
            score += 1
            self.wallx = 400


def createMap():
    """定义创建地图的方法"""
    screen.fill((255, 255, 255))     # 填充颜色
    screen.blit(background, (0, 0))  # 填入到背景

    # 显示管道
    screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300))   # 上管道坐标位置
    screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500))  # 下管道坐标位置
    Pipeline.updatePipeline()  # 管道移动

    # 显示小鸟
    if Bird.dead:              # 撞管道状态
        Bird.status = 2
    elif Bird.jump:            # 起飞状态
        Bird.status = 1
    screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))              # 设置小鸟的坐标
    Bird.birdUpdate()          # 鸟移动

    # 显示分数
    screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50))  # 设置颜色及坐标位置
    pygame.display.update()    # 更新显示


def checkDead():
    # 上方管子的矩形位置
    upRect = pygame.Rect(Pipeline.wallx, -300,
                         Pipeline.pineUp.get_width() - 10,
                         Pipeline.pineUp.get_height())

    # 下方管子的矩形位置
    downRect = pygame.Rect(Pipeline.wallx, 500,
                           Pipeline.pineDown.get_width() - 10,
                           Pipeline.pineDown.get_height())
    # 检测小鸟与上下方管子是否碰撞
    if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
        Bird.dead = True
    # 检测小鸟是否飞出上下边界
    if not 0 < Bird.birdRect[1] < height:
        Bird.dead = True
        return True
    else:
        return False


def getResutl():
    final_text1 = "Game Over"
    final_text2 = "Your final score is:  " + str(score)
    ft1_font = pygame.font.SysFont("Arial", 70)                                      # 设置第一行文字字体
    ft1_surf = font.render(final_text1, 1, (242, 3, 36))                             # 设置第一行文字颜色
    ft2_font = pygame.font.SysFont("Arial", 50)                                      # 设置第二行文字字体
    ft2_surf = font.render(final_text2, 1, (253, 177, 6))                            # 设置第二行文字颜色
    screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100])  # 设置第一行文字显示位置
    screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200])  # 设置第二行文字显示位置
    pygame.display.flip()                                                            # 更新整个待显示的Surface对象到屏幕上


if __name__ == '__main__':
    """主程序"""
    pygame.init()                            # 初始化pygame
    pygame.font.init()                       # 初始化字体
    font = pygame.font.SysFont("Arial", 50)  # 设置字体和大小
    size = width, height = 400, 650          # 设置窗口
    screen = pygame.display.set_mode(size)   # 显示窗口
    clock = pygame.time.Clock()              # 设置时钟
    Pipeline = Pipeline()                    # 实例化管道类
    Bird = Bird()                            # 实例化鸟类
    score = 0
    while True:
        clock.tick(60)                       # 每秒执行60次
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True             # 跳跃
                Bird.gravity = 5             # 重力
                Bird.jumpSpeed = 10          # 跳跃速度

        background = pygame.image.load("assets/background.png")  # 加载背景图片
        if checkDead():                      # 检测小鸟生命状态
            getResutl()                      # 如果小鸟死亡,显示游戏总分数
        else:
            createMap()                      # 创建地图
    pygame.quit()
import pygame import sys pygame.init()* # 初始化pygame* 
size = width, height =320,240* # 设置窗口大小* 
screen = pygame.display.set_mode(size)* # 显示窗口*
whileTrue:* # 死循环确保窗口一直显示*
    for event in pygame.event.get():*# 遍历所有事件*
        if event.type== pygame.QUIT:*# 如果单击关闭窗口,则退出* 
            sys.exit() 
            pygame.quit()*  # 退出pygame*
————————

Chapter 7

1.sys

  • The sys module provides a series of variables and functions about the python runtime environment.
  • sys. argv
    You can use sys Argv gets the parameter list of the currently executing command line parameters. Variable interpretation
    sys. Argv [0] current program name
    sys. Argv [1] first parameter
    sys. Argv [2] second parameter
    Len (sys. Argv) – 1 number of parameters (minus file name)
    Import sysprint (sys. Argv) print (sys. Argv [0]) print (sys. Argv [1]) print (“second parameter:% s”% sys. Argv [2]) print (“number of parameters:% s”% (len (sys. Argv) – 1)) —————– result: #python / root / MCW py arg1 arg2[‘/root/mcw.py’, ‘arg1’, ‘arg2’]/root/mcw. Py # current program name arg1 second parameter: arg2 number of parameters: 22) if the relative path is used for execution, the relative path print (sys. Argv [0]) ——— result:[ root@xiaoma /root] test!# python ./ mcw. py ./ mcw. py#sys. Argv = [‘/ root / MCW. Py’, ‘arg1’, ‘arg2’], the first element in the list is the relative path of program execution, and the second element starts to pass parameters to the program
import sysprint(sys.argv)print(sys.argv[0])print(sys.argv[1])print("第二个参数:%s"%sys.argv[2])print("参数个数:%s"%(len(sys.argv)-1))-------------------结果:#python /root/mcw.py arg1 arg2['/root/mcw.py', 'arg1', 'arg2']/root/mcw.py    #当前程序名arg1第二个参数:arg2参数个数:22) 如果执行用的相对路径,返回的是相对路径print(sys.argv[0])----------------结果:[root@xiaoma /root] test!#python ./mcw.py ./mcw.py#sys.argv =['/root/mcw.py', 'arg1', 'arg2'] ,列表第一个元素为程序执行相对路径,第二个元素开始为程序传参
  • sys.path
    返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    import sysprint(sys.path)———————结果:[‘D:\\aPython_full目录\\小马过河的代码练习’, ‘C:\\mcw’, ‘C:\\mcw\\venv\\Scripts\\python36.zip’, ‘C:\\python3\\DLLs’, ‘C:\\python3\\lib’, ‘C:\\python3’, ‘C:\\mcw\\venv’, ‘C:\\mcw\\venv\\lib\\site-packages’, ‘C:\\mcw\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg’, ‘C:\\mcw\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg’, ‘C:\\软件安装\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend’]添加系统环境变量:import sys,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print(BASE_DIR)#添加系统环境变量sys.path.append(BASE_DIR)print(sys.path)import syssys.path.append(“C:\python3\Scripts”)print(sys.path)——————结果:[‘D:\\………., ‘C:\\python3\\Scripts’]
import sysprint(sys.path)---------------------结果:['D:\\aPython_full目录\\小马过河的代码练习', 'C:\\mcw', 'C:\\mcw\\venv\\Scripts\\python36.zip', 'C:\\python3\\DLLs', 'C:\\python3\\lib', 'C:\\python3', 'C:\\mcw\\venv', 'C:\\mcw\\venv\\lib\\site-packages', 'C:\\mcw\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg', 'C:\\mcw\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'C:\\软件安装\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend']添加系统环境变量:import sys,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print(BASE_DIR)#添加系统环境变量sys.path.append(BASE_DIR)print(sys.path)import syssys.path.append("C:\python3\Scripts")print(sys.path)------------------结果:['D:\\.........., 'C:\\python3\\Scripts']
  • sys.platform
    获取当前执行环境的平台,如win32表示是Windows系统,linux2表示是linux平台
    print(sys.platform)————-结果:win32  ————-结果:[root@xiaoma /root] test!#python mcw.py linux2
print(sys.platform)-------------结果:win32  -------------结果:[root@xiaoma /root] test!#python mcw.py linux2
  • sys.exit(n)
    调用sys.exit(n)可以中途退出程序,当参数非0时,会引发一个SystemExit异常,从而可以在主程序中捕获该异常。
    #vim mcw.py import syssys.exit(3)———-结果:[root@xiaoma /root] test!#python mcw.py [root@xiaoma /root] test!#echo $?3
#vim mcw.py import syssys.exit(3)----------结果:[root@xiaoma /root] test!#python mcw.py [root@xiaoma /root] test!#echo $?3
  • sys.version
    获取Python解释程序的版本信息
    import sysprint(sys.version)————–结果:3.6.8 (tags/v3.6.8:3c6b436a57, Dec 23 2018, 23:31:17) [MSC v.1916 32 bit (Intel)]import sysprint(sys.version)————–结果:[root@xiaoma /root] test!#python mcw.py 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
import sysprint(sys.version)--------------结果:3.6.8 (tags/v3.6.8:3c6b436a57, Dec 23 2018, 23:31:17) [MSC v.1916 32 bit (Intel)]import sysprint(sys.version)--------------结果:[root@xiaoma /root] test!#python mcw.py 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
  • sys. getrefcount
    Gets the application count of a value
    A = [11,22,33] B = aprint (sys. Getrefcount (a)) ————– result: 3 #a, B, and the gerefcount method are all using this list
a = [11,22,33]b = aprint(sys.getrefcount(a))--------------结果:3 #a,b,还有gerefcount方法三个都在使用这个列表
  • sys.getrecursionlimit python默认支持的递归数量
  • sys. stdout. Write can be used for output redirection
    For I in range (3): Print (“devil in range”) import sysfor I in range (3): sys stdout. Write (‘pony crossing the river ‘) —————– result: the devil falls into the wind and cloud, the devil falls into the wind and cloud, the devil falls into the wind and cloud, the pony crosses the river, the pony crosses the river, the pony crosses the river, and the pony crosses the river import sysfor I in range (3): sys stderr. Write (‘pony crossing the river ‘) —————– result: Pony crossing the river pony crossing the river pony crossing the river
    Stdout is a class file object; Call its write function to print out any string you give. In fact, this is what the print function really does; It adds a hard carriage return to the string you print, and then calls sys stdout. Write function. In the simplest example, stdout and stderr send their output to the same place. Like stdout, stderr does not add a hard carriage return for you; If necessary, add it yourself. Stdout and stderr are class file objects, but they are both write only. They have no read method, only write method. However, they are still class file objects, so you can assign any other file object to them to redirect its output.
for i in range(3):    print("魔降风云变")import sysfor i in range(3):    sys.stdout.write('小马过河')-----------------结果:魔降风云变魔降风云变魔降风云变小马过河小马过河小马过河import sysfor i in range(3):    sys.stderr.write('小马过河')------------------结果:小马过河小马过河小马过河
  • sys.modules
    import sys,osprint(sys.modules.keys())———————–结果;dict_keys([‘builtins’, ‘sys’, ‘_frozen_importlib’, ‘_imp’, ‘_warnings’, ‘_thread’, ‘_weakref’, ‘_frozen_importlib_external’, ‘_io’, ‘marshal’, ‘nt’, ‘winreg’, ‘zipimport’, ‘encodings’, ‘codecs’, ‘_codecs’, ‘encodings.aliases’, ‘encodings.utf_8’, ‘_signal’, ‘__main__’, ‘encodings.latin_1’, ‘io’, ‘abc’, ‘_weakrefset’, ‘site’, ‘os’, ‘errno’, ‘stat’, ‘_stat’, ‘ntpath’, ‘genericpath’, ‘os.path’, ‘_collections_abc’, ‘_sitebuiltins’, ‘_bootlocale’, ‘_locale’, ‘encodings.gbk’, ‘_codecs_cn’, ‘_multibytecodec’, ‘sysconfig’, ‘encodings.cp437’, ‘sitecustomize’])
import sys,osprint(sys.modules.keys())-----------------------结果;dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'sysconfig', 'encodings.cp437', 'sitecustomize'])

2.xlrd

1. Background

  • 安装模板:
    #到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。#在cmd命令行输入:pip install xlrd
#到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。#在cmd命令行输入:pip install xlrd
  • Xlrd introduction: xlrd is a template for reading the data in Excel in Python environment. The operations that can be carried out include: reading the number of rows and columns of valid cells
    Reads the values of all cells in the specified row (column)
    Reads the value of the specified cell
    Reads the data type of the specified cell

2. Common functions

  • 打开文件(获取一个工作表):
    import xlrddata = xlrd.open_workbook(“01.xls”)#打开当前目录下名为01.xls的文档#此时data相当于指向该文件的指针table = data.sheet_by_index(0)#通过索引获取,例如打开第一个sheet表格table = data.sheet_by_name(“sheet1”)#通过名称获取,如读取sheet1表单table = data.sheets()[0]#通过索引顺序获取# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象names = data.sheet_names()    #返回book中所有工作表的名字data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕
import xlrddata = xlrd.open_workbook("01.xls")#打开当前目录下名为01.xls的文档#此时data相当于指向该文件的指针table = data.sheet_by_index(0)#通过索引获取,例如打开第一个sheet表格table = data.sheet_by_name("sheet1")#通过名称获取,如读取sheet1表单table = data.sheets()[0]#通过索引顺序获取# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象names = data.sheet_names()    #返回book中所有工作表的名字data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕
  • Operate on rows:
    nrows = table. Nrows # gets the number of valid rows in the sheet table Row (rowx) # returns a list of all cell objects in the row table row_ Slice (rowx) # returns a list of all cell objects in the column table row_ Types (rowx, start_colx = 0, end_colx = none) # returns a list table consisting of the data types of all cells in the row row_ Values (rowx, start_colx = 0, end_colx = none) # returns a list table consisting of the data of all cells in the row row_ Len (rowx) # returns the effective cell length of the column
nrows = table.nrows  #获取该sheet中的有效行数table.row(rowx)  #返回由该行中所有的单元格对象组成的列表table.row_slice(rowx)  #返回由该列中所有的单元格对象组成的列表table.row_types(rowx, start_colx=0, end_colx=None)    #返回由该行中所有单元格的数据类型组成的列表table.row_values(rowx, start_colx=0, end_colx=None)   #返回由该行中所有单元格的数据组成的列表table.row_len(rowx) #返回该列的有效单元格长度
  • 对列进行操作:
    ncols = table.ncols#获取列表的有效列数table.col(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_slice(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_types(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据类型组成的列表table.col_values(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据组成的列表
ncols = table.ncols#获取列表的有效列数table.col(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_slice(colx, start_rowx=0, end_rowx=None)#返回由该列中所有的单元格对象组成的列表table.col_types(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据类型组成的列表table.col_values(colx, start_rowx=0, end_rowx=None)#返回由该列中所有单元格的数据组成的列表
  • 对单元格进行操作:
    table.cell(rowx, colx)  # 返回单元格对象table.cell_type(rowx, colx)  # 返回单元格中的数据类型table.cell_value(rowx,colx)   #返回单元格中的数据
table.cell(rowx, colx)  # 返回单元格对象table.cell_type(rowx, colx)  # 返回单元格中的数据类型table.cell_value(rowx,colx)   #返回单元格中的数据

3.os

  • os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法。更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.html

    os.path.abspath(path)
    返回path规范化的绝对路径。
    os.path.abspath(‘test.csv’) ‘C:\\Python25\\test.csv’ os.path.abspath(‘c:\\test.csv’) ‘c:\\test.csv’ os.path.abspath(‘../csv\\test.csv’) ‘C:\\csv\\test.csv’

    os.path.split(path)
    将path分割成目录和文件名二元组返回。
    os.path.split(‘c:\\csv\\test.csv’) (‘c:\\csv’, ‘test.csv’) \>>> os.path.split(‘c:\\csv\\’) (‘c:\\csv’, ”)

    os.path.dirname(path)
    返回path的目录。其实就是os.path.split(path)的第一个元素。
    os.path.dirname(‘c:\\csv\test.csv’) ‘c:\\’ os.path.dirname(‘c:\\csv’) ‘c:\\’

    os.path.basename(path)
    返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
    os.path.basename(‘c:\\test.csv’)
    ‘test.csv’
    os.path.basename(‘c:\\csv’)
    ‘csv’ (这里csv被当作文件名处理了)
    os.path.basename(‘c:\\csv\\’)

    os.path.commonprefix(list)
    返回list中,所有path共有的最长的路径。
    os.path.commonprefix([‘/home/td’,’/home/td/ff’,’/home/td/fff’])
    ‘/home/td’

    os.path.exists(path)
    如果path存在,返回True;如果path不存在,返回False。
    os.path.exists(‘c:\\’)
    True
    os.path.exists(‘c:\\csv\\test.csv’)
    False

    os.path.isabs(path)
    如果path是绝对路径,返回True。

    os.path.isfile(path)
    如果path是一个存在的文件,返回True。否则返回False。
    os.path.isfile(‘c:\\boot.ini’)
    True
    os.path.isfile(‘c:\\csv\\test.csv’)
    False
    os.path.isfile(‘c:\\csv\\’)
    False

    os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False。
    \>>> os.path.isdir(‘c:\\’)
    True
    \>>> os.path.isdir(‘c:\\csv\\’)
    False
    \>>> os.path.isdir(‘c:\\windows\\test.csv’)
    False

    os.path.join(path1[, path2[, …]])
    将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
    os.path.join(‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘windows\temp’, ‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘/home/aa’,’/home/aa/bb’,’/home/aa/bb/c’)
    ‘/home/aa/bb/c’

    os.path.normcase(path)
    在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
    \>>> os.path.normcase(‘c:/windows\\system32\\’)
    ‘c:\\windows\\system32\\’

    os.path.normpath(path)
    规范化路径。
    os.path.normpath(‘c://windows\\System32\\../Temp/’)
    ‘c:\\windows\\Temp’

    os.path.splitdrive(path)
    返回(drivername,fpath)元组
    os.path.splitdrive(‘c:\\windows’)
    (‘c:’, ‘\\windows’)

    os.path.splitext(path)
    分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
    os.path.splitext(‘c:\\csv\\test.csv’)
    (‘c:\\csv\\test’, ‘.csv’)

    os.path.getsize(path)
    返回path的文件的大小(字节)。
    os.path.getsize(‘c:\\boot.ini’)
    299L

    os.path.getatime(path)
    返回path所指向的文件或者目录的最后存取时间。

    os.path.getmtime(path)
    返回path所指向的文件或者目录的最后修改时间

  • os.path.abspath(path)
    返回path规范化的绝对路径。
    os.path.abspath(‘test.csv’) ‘C:\\Python25\\test.csv’ os.path.abspath(‘c:\\test.csv’) ‘c:\\test.csv’ os.path.abspath(‘../csv\\test.csv’) ‘C:\\csv\\test.csv’
os.path.abspath('test.csv') 'C:\\Python25\\test.csv' os.path.abspath('c:\\test.csv') 'c:\\test.csv' os.path.abspath('../csv\\test.csv') 'C:\\csv\\test.csv' 
  • os.path.split(path)
    将path分割成目录和文件名二元组返回。
    os.path.split(‘c:\\csv\\test.csv’) (‘c:\\csv’, ‘test.csv’) \>>> os.path.split(‘c:\\csv\\’) (‘c:\\csv’, ”)
os.path.split('c:\\csv\\test.csv') ('c:\\csv', 'test.csv') \>>> os.path.split('c:\\csv\\') ('c:\\csv', '') 
  • os.path.dirname(path)
    返回path的目录。其实就是os.path.split(path)的第一个元素。
    os.path.dirname(‘c:\\csv\test.csv’) ‘c:\\’ os.path.dirname(‘c:\\csv’) ‘c:\\’
 os.path.dirname('c:\\csv\test.csv') 'c:\\'  os.path.dirname('c:\\csv') 'c:\\' 
  • os.path.basename(path)
    返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
    os.path.basename(‘c:\\test.csv’)
    ‘test.csv’
    os.path.basename(‘c:\\csv’)
    ‘csv’ (这里csv被当作文件名处理了)
    os.path.basename(‘c:\\csv\\’)
os.path.basename('c:\\test.csv') 
'test.csv' 
os.path.basename('c:\\csv') 
'csv' (这里csv被当作文件名处理了) 
os.path.basename('c:\\csv\\') 
'' 
  • os.path.commonprefix(list)
    返回list中,所有path共有的最长的路径。
    os.path.commonprefix([‘/home/td’,’/home/td/ff’,’/home/td/fff’])
    ‘/home/td’
os.path.commonprefix(['/home/td','/home/td/ff','/home/td/fff']) 
'/home/td' 
  • os.path.exists(path)
    如果path存在,返回True;如果path不存在,返回False。
    os.path.exists(‘c:\\’)
    True
    os.path.exists(‘c:\\csv\\test.csv’)
    False
 os.path.exists('c:\\') 
True 
 os.path.exists('c:\\csv\\test.csv') 
False 
  • os.path.isabs(path)
    如果path是绝对路径,返回True。
  • os.path.isfile(path)
    如果path是一个存在的文件,返回True。否则返回False。
    os.path.isfile(‘c:\\boot.ini’)
    True
    os.path.isfile(‘c:\\csv\\test.csv’)
    False
    os.path.isfile(‘c:\\csv\\’)
    False
 os.path.isfile('c:\\boot.ini') 
True 
 os.path.isfile('c:\\csv\\test.csv') 
False 
 os.path.isfile('c:\\csv\\') 
False 
  • os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False。
    \>>> os.path.isdir(‘c:\\’)
    True
    \>>> os.path.isdir(‘c:\\csv\\’)
    False
    \>>> os.path.isdir(‘c:\\windows\\test.csv’)
    False
\>>> os.path.isdir('c:\\') 
True 
\>>> os.path.isdir('c:\\csv\\') 
False 
\>>> os.path.isdir('c:\\windows\\test.csv') 
False 
  • os.path.join(path1[, path2[, …]])
    将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
    os.path.join(‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘windows\temp’, ‘c:\\’, ‘csv’, ‘test.csv’)
    ‘c:\\csv\\test.csv’
    os.path.join(‘/home/aa’,’/home/aa/bb’,’/home/aa/bb/c’)
    ‘/home/aa/bb/c’
os.path.join('c:\\', 'csv', 'test.csv') 
'c:\\csv\\test.csv' 
os.path.join('windows\temp', 'c:\\', 'csv', 'test.csv') 
'c:\\csv\\test.csv' 
os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c') 
'/home/aa/bb/c' 
  • os.path.normcase(path)
    在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
    \>>> os.path.normcase(‘c:/windows\\system32\\’)
    ‘c:\\windows\\system32\\’
\>>> os.path.normcase('c:/windows\\system32\\') 
'c:\\windows\\system32\\' 
  • os.path.normpath(path)
    规范化路径。
    os.path.normpath(‘c://windows\\System32\\../Temp/’)
    ‘c:\\windows\\Temp’
os.path.normpath('c://windows\\System32\\../Temp/') 
'c:\\windows\\Temp' 
  • os.path.splitdrive(path)
    返回(drivername,fpath)元组
    os.path.splitdrive(‘c:\\windows’)
    (‘c:’, ‘\\windows’)
os.path.splitdrive('c:\\windows') 
('c:', '\\windows') 
  • os.path.splitext(path)
    分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
    os.path.splitext(‘c:\\csv\\test.csv’)
    (‘c:\\csv\\test’, ‘.csv’)
os.path.splitext('c:\\csv\\test.csv') 
('c:\\csv\\test', '.csv') 
  • os.path.getsize(path)
    返回path的文件的大小(字节)。
    os.path.getsize(‘c:\\boot.ini’)
    299L
os.path.getsize('c:\\boot.ini') 
299L 
  • os. path. getatime(path)
    Returns the last access time of the file or directory pointed to by path.
  • os. path. getmtime(path)
    Returns the last modification time of the file or directory pointed to by path

4.pygame

  • 安装Pygame
    pip install pygame
pip install pygame
  • Pygame常用模块
模块名 功能
pygame.cdrom 访问光驱
pygame.cursors 加载光标
pygame.display 访问显示设备
pygame.draw 绘制形状、线和点
pygame.event 管理事件
pygame.font 使用字体
pygame.image 加载和存储图片
pygame.joystick 使用游戏手柄或者类似的东西
pygame.key 读取键盘按键
pygame.mixer 声音
pygame.mouse 鼠标
pygame.movie 播放视频
pygame.music 播放音频
pygame.overlay 访问高级视频叠加
pygame.rect 管理矩形区域
pygame.scrap 本地剪贴板访问
pygame.sndarray 操作声音数据
pygame.sprite 操作移动图像
pygame.surface 管理图像和屏幕
pygame.surfarray 管理点阵图像数据
pygame.time 管理时间和帧信息
pygame.transform 缩放和移动图像
  • 简单示例:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 320, 240 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    pygame.quit() # 退出pygame

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 320, 240  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
pygame.quit()  # 退出pygame

Make a jumping ball game

  • Create a game window, and then create a small ball in the window. Move the small ball at a certain speed. When the small ball touches the edge of the game window, the small ball bounces back and continues to move. This function is realized according to the following steps:
  • 创建游戏窗口

    创建一个游戏窗口,宽和高设置为640*480。代码如下:
    import sys
    import pygame
    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode() # 显示窗口
    import sys

    import pygame

    pygame.init() # 初始化pygame

    size = width, height = 640, 480 # 设置窗口大小

    screen = pygame.display.set_mode() # 显示窗口
    上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块,接下来,设置窗口的宽和高,最后使用display模块显示窗体。

  • 创建一个游戏窗口,宽和高设置为640*480。代码如下:
    import sys
    import pygame
    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode() # 显示窗口
    import sys

    import pygame

    pygame.init() # 初始化pygame

    size = width, height = 640, 480 # 设置窗口大小

    screen = pygame.display.set_mode() # 显示窗口
    上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块,接下来,设置窗口的宽和高,最后使用display模块显示窗体。

import sys
import pygame
pygame.init()                       # 初始化pygame
size = width, height = 640, 480     # 设置窗口大小
screen = pygame.display.set_mode()  # 显示窗口
import sys

import pygame

pygame.init()                       # 初始化pygame

size = width, height = 640, 480     # 设置窗口大小

screen = pygame.display.set_mode()  # 显示窗口
display
  • Common methods of display module
方法名 功能
pygame.display.init() 初始化display模块
pygame.display.quit() 结束display模块
pygame.display.get_init() 如果display模块已经被初始化,则返回True
pygame.display.set_mode() 初始化一个准备显示的界面
pygame.display.get_surface() 获取当前的Surface对象
pygame.display.flip() 更新整个待显示的Surface对象到屏幕上
pygame.display.update() 更新部分内容显示到屏幕上,如果没有参数,则与flip功能相同(上一条)
  • Keep window display
    After running the code in the first step, a flashing black window will appear, because the program will close automatically after execution. If you want to keep the window displayed, you need to use while true to keep the program running. In addition, you need to set the close button. The specific codes are as follows:
    import pygame
    import sys
    pygame. Init() # initializes pyGame
    Size = width, height = 320, 240 # set the window size
    screen = pygame. display. set_ Mode (size) # display window
    While true: # looping ensures that the window is always displayed
    for event in pygame. event. Get(): # traverse all events
    if event. type == pygame. Quit: # if you click close window, exit
    sys. exit()
    pygame. Quit() # quit pyGame
    Polling event detection is added to the above code. pygame. event. Get() can get the event queue and use for In traverses the event, and then determines the event type according to the type attribute. The event handling method here is similar to GUI, such as event Type equals pyGame Quit indicates that the event of closing pyGame window is detected, pyGame Keydown indicates the keyboard press event, pyGame Mousebuttondown indicates mouse down events, etc.
  • After running the code in the first step, a flashing black window will appear, because the program will close automatically after execution. If you want to keep the window displayed, you need to use while true to keep the program running. In addition, you need to set the close button. The specific codes are as follows:
    import pygame
    import sys
    pygame. Init() # initializes pyGame
    Size = width, height = 320, 240 # set the window size
    screen = pygame. display. set_ Mode (size) # display window
    While true: # looping ensures that the window is always displayed
    for event in pygame. event. Get(): # traverse all events
    if event. type == pygame. Quit: # if you click close window, exit
    sys. exit()
    pygame. Quit() # quit pyGame
    Polling event detection is added to the above code. pygame. event. Get() can get the event queue and use for In traverses the event, and then determines the event type according to the type attribute. The event handling method here is similar to GUI, such as event Type equals pyGame Quit indicates that the event of closing pyGame window is detected, pyGame Keydown indicates the keyboard press event, pyGame Mousebuttondown indicates mouse down events, etc.
while True
import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 320, 240  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()

pygame.quit()  # 退出pygame
pygame.event.get()
for...in
type
event.type
pygame.QUIT
pygame.KEYDOWN
pygame.MOUSEBUTTONDOWN
  • 加载游戏图片

    在窗口添加小球。我们先准备好一张ball.png 图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame
    上述代码中使用iamge模块的load()方法加载图片,返回值ball是一个Surface对象。Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surface,pygame.display.set_mode()就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

  • 在窗口添加小球。我们先准备好一张ball.png 图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame
    上述代码中使用iamge模块的load()方法加载图片,返回值ball是一个Surface对象。Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surface,pygame.display.set_mode()就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

ball.png
import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pygame
iamge
load()
Surface
Surface
Surface
Surface
pygame.display.set_mode()
Surface
Surface
blit()
Surface
  • Common methods of surface objects
方法名 功能
pygame.Surface.blit() 将一个图像画到另一个图像上
pygame.Surface.convert() 转换图像的像素格式
pygame.Surface.convert_alpha() 转化图像的像素格式,包含alpha通道的转换
pygame.Surface.fill() 使用颜色填充Surface
pygame.Surface.get_rect() 获取Surface的矩形区域
  • 移动图片

    下面让小球动起来,ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以用于移动矩形。move(x, y)函数有两个参数,第一个参数是 X 轴移动的距离,第二个参数是 Y 轴移动的距离。窗口的左上角是(0, 0),如果是move(100, 50)就是左移100下移50。

    为实现小球不停移动,将move()函数添加到while循环内,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    speed = [5, 5] # 设置移动的X轴、Y轴
    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    ballrect = ballrect.move(speed) # 移动小球
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

  • Let’s move the ball get_ The return value of the Rect () method ballrect is a rect object that has a move () method that can be used to move the rectangle. The move (x, y) function has two parameters. The first parameter is the moving distance of the X axis and the second parameter is the moving distance of the Y axis. The upper left corner of the window is (0, 0). If it is move (100, 50), it will move 100 left and 50 down.
ball.get_rect()
ballrect
Rect
move()
move(x, y)
  • 为实现小球不停移动,将move()函数添加到while循环内,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域

    speed = [5, 5] # 设置移动的X轴、Y轴
    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()
    ballrect = ballrect.move(speed) # 移动小球
    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域

speed = [5, 5]  # 设置移动的X轴、Y轴
while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
    ballrect = ballrect.move(speed)  # 移动小球
    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pygame
  • 碰撞检测

    运行上述代码,发现小球在屏幕中一闪而过,此时,小球并没有真正消失,而是移动到窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pyga                          me
    上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。

  • 运行上述代码,发现小球在屏幕中一闪而过,此时,小球并没有真正消失,而是移动到窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向,具体代码如下:
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴

    while True: # 死循环确保窗口一直显示
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pyga                          me
    上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域
speed = [5, 5]  # 设置移动的X轴、Y轴

while True:  # 死循环确保窗口一直显示
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()
            
    ballrect = ballrect.move(speed)  # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pyga                          me
  • 限制移动速度

    运行上述代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉,使用pygame的time模块,使用pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次。
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴
    clock = pygame.time.Clock() # 设置时钟

    while True: # 死循环确保窗口一直显示
    clock.tick(60) # 每秒执行60次
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

  • 运行上述代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉,使用pygame的time模块,使用pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次。
    import pygame
    import sys

    pygame.init() # 初始化pygame
    size = width, height = 640, 480 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    color = (0, 0, 0) # 设置颜色
    ball = pygame.image.load(‘ball.png’) # 加载图片
    ballrect = ball.get_rect() # 获取矩形区域
    speed = [5, 5] # 设置移动的X轴、Y轴
    clock = pygame.time.Clock() # 设置时钟

    while True: # 死循环确保窗口一直显示
    clock.tick(60) # 每秒执行60次
    for event in pygame.event.get(): # 遍历所有事件
    if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
    sys.exit()

    ballrect = ballrect.move(speed) # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
    speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect) # 将图片画到窗口上
    pygame.display.flip() # 更新全部显示

    pygame.quit() # 退出pygame

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色
ball = pygame.image.load('ball.png')  # 加载图片
ballrect = ball.get_rect()  # 获取矩形区域
speed = [5, 5]  # 设置移动的X轴、Y轴
clock = pygame.time.Clock()  # 设置时钟

while True:  # 死循环确保窗口一直显示
    clock.tick(60)  # 每秒执行60次
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()

    ballrect = ballrect.move(speed)  # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(color)  # 填充颜色(设置为0,执不执行这行代码都一样)
    screen.blit(ball, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部显示

pygame.quit()  # 退出pygame
  • Develop flappy bird game
    Flappy bird is a bird flying game. One finger controls and presses the bird to fly up.
    Analysis in the flappy bird game, there are two main objects: birds and pipes. You can create a brid class and a pipeline class to represent the two objects respectively. Birds can avoid the pipe by moving up and down, so create a bridupdate() method in the brid class to realize the up and down movement of birds. In order to reflect the characteristics of birds flying forward, the pipe can be moved to the left all the time, so that it is like birds flying forward in the window. Therefore, a updatepipline () method is also created in the pipeline class to move the pipeline to the left. In addition, three functions are created: the createmap () function is used to draw the map; Checkdead() function is used to judge the life state of birds; The getResult () function is used to get the final score. Finally, instantiate and call relevant methods in the main logic to realize the corresponding functions.
  • Flappy bird is a bird flying game. One finger controls and presses the bird to fly up.
  • Analysis in the flappy bird game, there are two main objects: birds and pipes. You can create a brid class and a pipeline class to represent the two objects respectively. Birds can avoid the pipe by moving up and down, so create a bridupdate() method in the brid class to realize the up and down movement of birds. In order to reflect the characteristics of birds flying forward, the pipe can be moved to the left all the time, so that it is like birds flying forward in the window. Therefore, a updatepipline () method is also created in the pipeline class to move the pipeline to the left. In addition, three functions are created: the createmap () function is used to draw the map; Checkdead() function is used to judge the life state of birds; The getResult () function is used to get the final score. Finally, instantiate and call relevant methods in the main logic to realize the corresponding functions.
  • 搭建主框架
    # -*- coding:utf-8 -*-
    import sys # 导入sys模块
    import pygame # 导入pygame模块
    import random

    class Bird(object):
    “””定义一个鸟类”””
    def __init__(self):
    “””定义初始化方法”””
    pass

    def birdUpdate(self):
    pass

    class Pipeline(object):
    “””定义一个管道类”””
    def __init__(self):
    “””定义初始化方法”””

    def updatePipeline(self):
    “””水平移动”””

    def createMap():
    “””定义创建地图的方法”””
    screen.fill((255, 255, 255)) # 填充颜色(screen还没定义不要着急)
    screen.blit(background, (0, 0)) # 填入到背景
    pygame.display.update() # 更新显示

    if __name__ == ‘__main__’:
    pygame.init() # 初始化pygame
    size = width, height = 400, 650 # 设置窗口大小
    screen = pygame.display.set_mode(size) # 显示窗口
    clock = pygame.time.Clock() # 设置时钟
    Pipeline = Pipeline() # 实例化管道类
    while True:
    clock.tick(60) # 每秒执行60次
    # 轮询事件
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 如果检测到事件是关闭窗口
    sys.exit()

    background = pygame.image.load(“assets/background.png”) # 加载背景图片
    createMap()
    pygame.quit() # 退出
    创建小鸟类、创建管道类、计算得分、碰撞检测
    import pygame
    import sys
    import random

    class Bird(object):
    “””定义一个鸟类”””

    def __init__(self):
    “””定义初始化方法”””
    self.birdRect = pygame.Rect(65, 50, 50, 50) # 鸟的矩形
    # 定义鸟的3种状态列表
    self.birdStatus = [pygame.image.load(“assets/1.png”),
    pygame.image.load(“assets/2.png”),
    pygame.image.load(“assets/dead.png”)]
    self.status = 0 # 默认飞行状态
    self.birdX = 120 # 鸟所在X轴坐标,即是向右飞行的速度
    self.birdY = 350 # 鸟所在Y轴坐标,即上下飞行高度
    self.jump = False # 默认情况小鸟自动降落
    self.jumpSpeed = 10 # 跳跃高度
    self.gravity = 5 # 重力
    self.dead = False # 默认小鸟生命状态为活着

    def birdUpdate(self):
    if self.jump:
    # 小鸟跳跃
    self.jumpSpeed -= 1 # 速度递减,上升越来越慢
    self.birdY -= self.jumpSpeed # 鸟Y轴坐标减小,小鸟上升
    else:
    # 小鸟坠落
    self.gravity += 0.2 # 重力递增,下降越来越快
    self.birdY += self.gravity # 鸟Y轴坐标增加,小鸟下降
    self.birdRect[1] = self.birdY # 更改Y轴位置

    class Pipeline(object):
    “””定义一个管道类”””

    def __init__(self):
    “””定义初始化方法”””
    self.wallx = 400 # 管道所在X轴坐标
    self.pineUp = pygame.image.load(“assets/top.png”)
    self.pineDown = pygame.image.load(“assets/bottom.png”)

    def updatePipeline(self):
    “”””管道移动方法”””
    self.wallx -= 5 # 管道X轴坐标递减,即管道向左移动
    # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
    if self.wallx < -80: global score score += 1 self.wallx = 400 def createMap(): """定义创建地图的方法""" screen.fill((255, 255, 255)) # 填充颜色 screen.blit(background, (0, 0)) # 填入到背景 # 显示管道 screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300)) # 上管道坐标位置 screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500)) # 下管道坐标位置 Pipeline.updatePipeline() # 管道移动 # 显示小鸟 if Bird.dead: # 撞管道状态 Bird.status = 2 elif Bird.jump: # 起飞状态 Bird.status = 1 screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 设置小鸟的坐标 Bird.birdUpdate() # 鸟移动 # 显示分数 screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50)) # 设置颜色及坐标位置 pygame.display.update() # 更新显示 def checkDead(): # 上方管子的矩形位置 upRect = pygame.Rect(Pipeline.wallx, -300, Pipeline.pineUp.get_width() - 10, Pipeline.pineUp.get_height()) # 下方管子的矩形位置 downRect = pygame.Rect(Pipeline.wallx, 500, Pipeline.pineDown.get_width() - 10, Pipeline.pineDown.get_height()) # 检测小鸟与上下方管子是否碰撞 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect): Bird.dead = True # 检测小鸟是否飞出上下边界 if not 0 < Bird.birdRect[1] < height: Bird.dead = True return True else: return False def getResutl(): final_text1 = "Game Over" final_text2 = "Your final score is: " + str(score) ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体 ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 设置第一行文字颜色 ft2_font = pygame.font.SysFont("Arial", 50) # 设置第二行文字字体 ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置第二行文字颜色 screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置 screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 设置第二行文字显示位置 pygame.display.flip() # 更新整个待显示的Surface对象到屏幕上 if __name__ == '__main__': """主程序""" pygame.init() # 初始化pygame pygame.font.init() # 初始化字体 font = pygame.font.SysFont("Arial", 50) # 设置字体和大小 size = width, height = 400, 650 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 clock = pygame.time.Clock() # 设置时钟 Pipeline = Pipeline() # 实例化管道类 Bird = Bird() # 实例化鸟类 score = 0 while True: clock.tick(60) # 每秒执行60次 # 轮询事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead: Bird.jump = True # 跳跃 Bird.gravity = 5 # 重力 Bird.jumpSpeed = 10 # 跳跃速度 background = pygame.image.load("assets/background.png") # 加载背景图片 if checkDead(): # 检测小鸟生命状态 getResutl() # 如果小鸟死亡,显示游戏总分数 else: createMap() # 创建地图 pygame.quit() import pygame import sys pygame.init()* # 初始化pygame* size = width, height =320,240* # 设置窗口大小* screen = pygame.display.set_mode(size)* # 显示窗口* whileTrue:* # 死循环确保窗口一直显示* for event in pygame.event.get():*# 遍历所有事件* if event.type== pygame.QUIT:*# 如果单击关闭窗口,则退出* sys.exit() pygame.quit()* # 退出pygame*

# -*- coding:utf-8 -*-
import sys  # 导入sys模块
import pygame  # 导入pygame模块
import random


class Bird(object):
    """定义一个鸟类"""
    def __init__(self):
        """定义初始化方法"""
        pass

    def birdUpdate(self):
        pass


class Pipeline(object):
    """定义一个管道类"""
    def __init__(self):
        """定义初始化方法"""

    def updatePipeline(self):
        """水平移动"""


def createMap():
    """定义创建地图的方法"""
    screen.fill((255, 255, 255))  # 填充颜色(screen还没定义不要着急)
    screen.blit(background, (0, 0))  # 填入到背景
    pygame.display.update()  # 更新显示


if __name__ == '__main__':
    pygame.init()                           # 初始化pygame
    size = width, height = 400, 650         # 设置窗口大小
    screen = pygame.display.set_mode(size)  # 显示窗口
    clock = pygame.time.Clock()             # 设置时钟
    Pipeline = Pipeline()                   # 实例化管道类
    while True:
        clock.tick(60)                      # 每秒执行60次
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:   # 如果检测到事件是关闭窗口
                sys.exit()

        background = pygame.image.load("assets/background.png")  # 加载背景图片
        createMap()
    pygame.quit()  # 退出
import pygame
import sys
import random


class Bird(object):
    """定义一个鸟类"""

    def __init__(self):
        """定义初始化方法"""
        self.birdRect = pygame.Rect(65, 50, 50, 50)  # 鸟的矩形
        # 定义鸟的3种状态列表
        self.birdStatus = [pygame.image.load("assets/1.png"),
                           pygame.image.load("assets/2.png"),
                           pygame.image.load("assets/dead.png")]
        self.status = 0      # 默认飞行状态
        self.birdX = 120     # 鸟所在X轴坐标,即是向右飞行的速度
        self.birdY = 350     # 鸟所在Y轴坐标,即上下飞行高度
        self.jump = False    # 默认情况小鸟自动降落
        self.jumpSpeed = 10  # 跳跃高度
        self.gravity = 5     # 重力
        self.dead = False    # 默认小鸟生命状态为活着

    def birdUpdate(self):
        if self.jump:
            # 小鸟跳跃
            self.jumpSpeed -= 1           # 速度递减,上升越来越慢
            self.birdY -= self.jumpSpeed  # 鸟Y轴坐标减小,小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2           # 重力递增,下降越来越快
            self.birdY += self.gravity    # 鸟Y轴坐标增加,小鸟下降
        self.birdRect[1] = self.birdY     # 更改Y轴位置


class Pipeline(object):
    """定义一个管道类"""

    def __init__(self):
        """定义初始化方法"""
        self.wallx = 400  # 管道所在X轴坐标
        self.pineUp = pygame.image.load("assets/top.png")
        self.pineDown = pygame.image.load("assets/bottom.png")

    def updatePipeline(self):
        """"管道移动方法"""
        self.wallx -= 5  # 管道X轴坐标递减,即管道向左移动
        # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
        if self.wallx < -80:
            global score
            score += 1
            self.wallx = 400


def createMap():
    """定义创建地图的方法"""
    screen.fill((255, 255, 255))     # 填充颜色
    screen.blit(background, (0, 0))  # 填入到背景

    # 显示管道
    screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300))   # 上管道坐标位置
    screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500))  # 下管道坐标位置
    Pipeline.updatePipeline()  # 管道移动

    # 显示小鸟
    if Bird.dead:              # 撞管道状态
        Bird.status = 2
    elif Bird.jump:            # 起飞状态
        Bird.status = 1
    screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))              # 设置小鸟的坐标
    Bird.birdUpdate()          # 鸟移动

    # 显示分数
    screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50))  # 设置颜色及坐标位置
    pygame.display.update()    # 更新显示


def checkDead():
    # 上方管子的矩形位置
    upRect = pygame.Rect(Pipeline.wallx, -300,
                         Pipeline.pineUp.get_width() - 10,
                         Pipeline.pineUp.get_height())

    # 下方管子的矩形位置
    downRect = pygame.Rect(Pipeline.wallx, 500,
                           Pipeline.pineDown.get_width() - 10,
                           Pipeline.pineDown.get_height())
    # 检测小鸟与上下方管子是否碰撞
    if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
        Bird.dead = True
    # 检测小鸟是否飞出上下边界
    if not 0 < Bird.birdRect[1] < height:
        Bird.dead = True
        return True
    else:
        return False


def getResutl():
    final_text1 = "Game Over"
    final_text2 = "Your final score is:  " + str(score)
    ft1_font = pygame.font.SysFont("Arial", 70)                                      # 设置第一行文字字体
    ft1_surf = font.render(final_text1, 1, (242, 3, 36))                             # 设置第一行文字颜色
    ft2_font = pygame.font.SysFont("Arial", 50)                                      # 设置第二行文字字体
    ft2_surf = font.render(final_text2, 1, (253, 177, 6))                            # 设置第二行文字颜色
    screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100])  # 设置第一行文字显示位置
    screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200])  # 设置第二行文字显示位置
    pygame.display.flip()                                                            # 更新整个待显示的Surface对象到屏幕上


if __name__ == '__main__':
    """主程序"""
    pygame.init()                            # 初始化pygame
    pygame.font.init()                       # 初始化字体
    font = pygame.font.SysFont("Arial", 50)  # 设置字体和大小
    size = width, height = 400, 650          # 设置窗口
    screen = pygame.display.set_mode(size)   # 显示窗口
    clock = pygame.time.Clock()              # 设置时钟
    Pipeline = Pipeline()                    # 实例化管道类
    Bird = Bird()                            # 实例化鸟类
    score = 0
    while True:
        clock.tick(60)                       # 每秒执行60次
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True             # 跳跃
                Bird.gravity = 5             # 重力
                Bird.jumpSpeed = 10          # 跳跃速度

        background = pygame.image.load("assets/background.png")  # 加载背景图片
        if checkDead():                      # 检测小鸟生命状态
            getResutl()                      # 如果小鸟死亡,显示游戏总分数
        else:
            createMap()                      # 创建地图
    pygame.quit()
import pygame import sys pygame.init()* # 初始化pygame* 
size = width, height =320,240* # 设置窗口大小* 
screen = pygame.display.set_mode(size)* # 显示窗口*
whileTrue:* # 死循环确保窗口一直显示*
    for event in pygame.event.get():*# 遍历所有事件*
        if event.type== pygame.QUIT:*# 如果单击关闭窗口,则退出* 
            sys.exit() 
            pygame.quit()*  # 退出pygame*