安装Pygame

pip install pygame
C:\Users> pip install pygame
Collecting pygame                   Downloading https://files.pythonhosted.org/packages/3e/f5/feabd88a2856ec86166a897b62bfad828bfe7a94a27cbd7ebf07fd
70399/pygame-1.9.4-cp37-cp37m-win_amd64.whl (4.2MB)100% |██████████████████████████| 4.2MB 6.6MB/s
Installing collected packages: pygam
Successfully installed pygame-1.9.4

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 syspygame.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

执行结果:

制作一个跳跃的小球游戏

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

创建游戏窗口

1. 创建一个游戏窗口,宽和高设置为640*480。代码如下:

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

上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块,接下来,设置窗口的宽和高,最后使用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功能相同(上一条)

保持窗口显示

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

import pygame
import syspygame.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表示鼠标按下事件等。

加载游戏图片

开发过程中使用的图片

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

import pygame
import syspygame.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对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surfacepygame.display.set_mode()就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

Surface对象的常用方法

方法名 功能
pygame.Surface.blit() 将一个图像画到另一个图像上
pygame.Surface.convert() 转换图像的像素格式
pygame.Surface.convert_alpha() 转化图像的像素格式,包含alpha通道的转换
pygame.Surface.fill() 使用颜色填充Surface
pygame.Surface.get_rect() 获取Surface的矩形区域

移动图片

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

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

import pygame
import syspygame.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

碰撞检测

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

import pygame
import syspygame.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()  # 退出pygame

上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。

限制移动速度

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

import pygame
import syspygame.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()函数用于获取最终分数。最后在主逻辑中实例化并调用相关方法,实现相应的功能。

搭建主框架

# -*- coding:utf-8 -*-
import sys  # 导入sys模块
import pygame  # 导入pygame模块
import randomclass Bird(object):"""定义一个鸟类"""def __init__(self):"""定义初始化方法"""passdef birdUpdate(self):passclass 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()                           # 初始化pygamesize = 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 randomclass 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 scorescore += 1self.wallx = 400def 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 = 2elif Bird.jump:            # 起飞状态Bird.status = 1screen.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 = Truereturn Trueelse:return Falsedef 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()                            # 初始化pygamepygame.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 = 0while 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()

执行结果:

Python游戏编程(Pygame)相关推荐

  1. Python游戏编程(九)pygame Hello World

    我们通过使用pygame模块,创建一些带有图形和声音的.更有趣的高级游戏. 目录 主要内容 pygame Windows安装pygame 使用pygame pygame Hello World (一) ...

  2. pygame 学习笔记(4)推荐一本python入门游戏书籍《PYTHON游戏编程入门》

    简介 <PYTHON游戏编程入门>(More Python Programming for the Absolute Beginner)是 S.Harbour写的一本入门书籍,基于pyga ...

  3. python游戏编程入门-python游戏编程入门

    <Python游戏编程入门> 这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现. 并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏 pygame ...

  4. python游戏编程入门 免费-python游戏编程入门 python游戏编程入门课

    python游戏编程入门 python游戏编程入门课 什么是python游戏编程入门?首先我们需要认识什么是Python Python既是一个软件工具包,也是一种语言.Python软件包包含了一个名为 ...

  5. 《Python游戏编程入门》——1.2 初识Python

    本节书摘来自异步社区<Python游戏编程入门>一书中的第1章,第1.2节,作者[美]Jonathan S. Harbour ,李强 译,更多章节内容可以访问云栖社区"异步社区& ...

  6. python游戏编程入门下载-Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|...

    Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...

  7. python游戏编程培训

    准备好了吗?我们即将开始激动人心的游戏编程之旅. 或许你之前学习过一点编程,但若是你从没接触过游戏编程,那么你仍然会对游戏程序的运行感到不解.游戏程序不像计算一个公式或谜题,得到答案之后程序就结束了, ...

  8. 小学生python游戏编程arcade----基本知识1

    小学生python游戏编程arcade----基本知识 前言 基本知识 1.简单窗体 2.试着添加角色及背景 3.场景 4.角色控制及物理引擎 总结 源码获取 前言 前面章节分享试用了pyzero,p ...

  9. Python游戏编程快速上手pdf

    下载地址:网盘下载 内容简介  · · · · · · Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言. 本书通过编写一个个小巧.有趣的游戏来教授Pyt ...

  10. 青少年Python游戏编程入门(Beginning Game Programming for Teens with Python译文)

    青少年Python游戏编程入门 Beginning Game Programming for Teens with Python   Julian Meyer on January 22, 2013 ...

最新文章

  1. windows7现实计算机内存不足,win7旗舰版系统提示系统内存不足的解决方法
  2. 7打开pycharm_Python+pycharm安装、关联教程
  3. Filebeat的下载(图文讲解)
  4. openssh相关文件传输功能
  5. GCC 和 MDK (即 Keil) 手工指定其地址及指针
  6. python热成像_在python中自动从图像中移除热/死像素
  7. 问题:HikariPool-1 - Shutdown initiated...的解决
  8. 前端遍历列表生成表格_图书作者的演练-创建列表页和添加表单框-flask
  9. 十字路口待转区什么用_都知道“左转待转区”,但到底该怎么走?老司机给你一次讲清楚...
  10. flex +overflow在firefox与edge中不生效的问题
  11. 250个jquery 插件
  12. 软件工程考研复试基本概念
  13. phpcms v9二次开发之模型类的应用(2)
  14. 算法:回溯三 Combination Sum组合总数
  15. ubuntu下Qt cannot find -lGL错误的解决方法
  16. mysql2005错误码_SQL Server2005 常见错误及解决方案
  17. 解决u盘启动盘写保护,无法格式化
  18. cocos2dx 手游luac 解密 文件的key
  19. c语言字符二维数组指针赋值,C语言之二维数组与指针
  20. Cube(给出八个点,判断这八个点是否可以构成一个正方体)

热门文章

  1. 数学分析 反函数存在性定理,连续性定理与求导定理
  2. 英文XP系统安装中文包
  3. java实现扫雷小游戏【完整版】
  4. 【手写】数据库关系代数练习题
  5. useragent大全
  6. 广东2022年上半年系统集成项目管理工程师上午真题及答案解析
  7. delphi 消息列表中文说明
  8. elipse下载安装教程
  9. 信号与系统 matlab综合实验 pdf,《信号与系统——MATLAB综合实验》 谷源涛-第三讲.pdf...
  10. Java练手项目(好玩又有趣)