我的编程空间,编程开发者的网络收藏夹
学习永远不晚

15. python从入门到精通——Pygame游戏编程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

15. python从入门到精通——Pygame游戏编程

目录

游戏的原理

安装Pygame

Pygame常用模块

Pygame的基本使用     

实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向

实现步骤:

 运行效果:

小球图片:    

 python代码:

开发Flappy Bird游戏

游戏简介:

运行效果:

图片素材

游戏分析 

以面向对象的思维方式来分析一下这个游戏可以归纳为两个对象

小鸟:

管道:

碰撞检测:

实现步骤

python代码


游戏的原理

        窗口:游戏中也有窗口的概念,游戏中的角色都需要再窗口中显示

        资源:是指游戏中的背景、角色、声音等 

        坐标:在Pygame中有横轴和纵轴。例如在植物大战僵尸中不断修改僵尸的坐标可以实现动画效果

                注意:Pygame中坐标0,0在创建窗口的左上角,向右则X坐标越大;向下则Y坐标越大

        运行流程:在python中程序是由上至下执行的,执行完就结束了游戏窗口随之关闭。为了能够让窗口一直显示需要设置一个死循环,可以用while True 语句实现。当执行地一边的时候在窗口中添加背景图片、角色,第二遍同样添加背景图片但是每次循环更新角色坐标。当频率到至少24次每秒我们肉眼就只会感觉到画面和角色是一直存在的从而实现了动画效果

安装Pygame

Pygame:是python中的模块,专用于二D游戏开发,要使用它需要先安装它

安装命令:pip install pygame

        如果超时:pip  install  -i  https://pypi.doubanio.com/simple/   --trusted-host pypi.doubanio.com pygame

Pygame常用模块

Pygame官网

优势:Pygame做游戏开发的优势在于不需要过多考虑与底层开发相关的内容,而可 以把工作重心放在游戏逻辑上。

1. 常用模块:

模块名

功能

pygame.cdrom

访问光驱

pygame.cursors

加载光标

pygame.display

访问显示设备

pygame.draw

绘制形状、线和点

pygame.event

管理事件

pygame.fbnt

使用字体

pygame.image

加载和存储图片

pygame.joystick

使用游戏手柄或者类似的东西

pygame.key

读取键盘按键

pygame.mixer

声音

pygame.mouse

鼠标

pygame.movie

播放视频

pygame.music

播放音频

pygame.overlay

访问高级视频叠加

pygame.rect

管理矩形区域

pygame.sndarray

操作声音数据

pygame.sprite

操作移动图像

pygame.surface

管理图像和屏幕

pygame.surfarray

管理点阵图像数据

pygame.time

管理时间和帧信息

pygame.transform

缩放和移动图像

2. display模块的常用方法

方法名

功能

pygame.dispaly.init

初始化display模块

pygame.dispaly.quit

结束display模块

pygame.dispaly.get^init

如果display模块已经被初始化,则返回True

pygame.dispaly.setmode

初始化一个准备显示的界面

pygame.dispaly.get_surface

获取当前的Surface对象

pygame.dispaly.flip

更新整个待显示的Surface对象到屏幕上

pygame.dispaly .update

更新部分内容显示到屏幕上,如果没有参数,则与flip功能相同

3. Surface对象的常用方法

方法名

功能

pygame.Surface.blit

将一个图像画到另一个图像上

pygame. Surface.convert

转换图像的像素格式

pygame.Surface.convert_alpha

转化图像的像素格式,包含alpha通道的转换

pygame. Surface.f ill

使用颜色填充Surface

pygame. Surface.get_rect

获取Surface的矩形区域

示例:创建窗口流程,也是大部分创建Pygame的流程

import sys  # 导入sys模块import pygame  # 导入pygame模块pygame.init()  # 初始化pygame,检查游戏需要的一些硬件调用接口、系统功能接口是否有问题size = width, height = 640, 480  # 设置窗口大小screen = pygame.display.set_mode(size)  # 显示窗口但是执行完程序就会关闭窗口while True:# 获取所有的事件,例如点击窗口的时间、按下键盘的事件。由于事件的类型很多,程序不知道发生了哪一类事件所以需要不断的循环判断    for event in pygame.event.get():        if event.type == pygame.QUIT:  # 如果点击关闭窗口,则退出            pygame.quit()  # 退出pygame            sys.exit() #推出系统

Pygame的基本使用     

实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向

实现步骤:

        创建窗口→添加小球→移动小球→检测碰撞   

 运行效果:

小球图片:    

 python代码:

# -*- coding:utf-8 -*-import sys  # 导入sys模块import pygame  # 导入pygame模块pygame.init()  # 初始化pygamesize = 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(240)  # 每秒执行60次    # 检查事件    for event in pygame.event.get():        if event.type == pygame.QUIT:  # 如果点击关闭窗口,则退出            pygame.quit()  # 退出pygame            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)  # 填充颜色    screen.blit(ball, ballrect)  # 此函数是将图片推送到窗口上,第一个参数为图片第二个参数为图片位置    pygame.display.flip()  # 更新全部显示

开发Flappy Bird游戏

游戏简介:

当点击屏幕的时候小鸟就往上飞,再次点击小鸟再次往上飞,当不点击时小鸟会以更快速度降落。我们需要控制小鸟

我们需要控制小鸟通过各种各样的管道,当我们穿过一组管道时就会得一分,如果在飞行过程中碰到了管道那么小鸟状态变为灰色掉在地上,游戏结束并且显示一个总的分数

运行效果:

图片素材

游戏分析 

以面向对象的思维方式来分析一下这个游戏可以归纳为两个对象

小鸟:

        属性:

                小鸟的生命状态

                        活着:颜色为黄色

                        死亡:颜色为灰色

                坐标位置

                        X轴坐标

                        Y轴坐标(变化)

                是否跳跃

                        上升高度

                        坠落高度

        方法

                跳跃

                坠落

管道:

        方法:向左移动

碰撞检测:

        小鸟碰到上下管道

        小鸟碰到上下边界

实现步骤

搭建主框架

创建小鸟类

创建管道类

计算得分

碰撞检测

python代码

import pygameimport sysimport 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: #管道宽度为94,当管道快移除屏幕时重置管道位置            global score #设置得分加1并声明为全局变量            score += 1            self.wallx = 400def createMap():    """定义创建地图的方法"""    screen.fill((255, 255, 255))  # 填充颜色    screen.blit(background, (0, 0))  # 填入到背景    # 显示管道    #因为管道长度为495几乎占满屏幕了,为了让管道小一点设置为屏幕外的上下方    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()  # 鸟移动    # 显示分数     #font.render()用于显示字体有三个参数:字符串、是否平滑、颜色    screen.blit(font.render(str(score), -1, (255, 255, 255)), (200, 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 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()  # 初始化pygame    pygame.font.init()  # 初始化字体    font = pygame.font.SysFont("Arial", 50)  # 设置字体和大小    size = width, height = 400, 680  # 设置窗口    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:                pygame.quit()                sys.exit()            # 如果触发键盘和鼠标事件并且小鸟状态不是死亡则Bird.jump值为True并且初始化跳跃跟坠落速度            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()  # 创建地图

来源地址:https://blog.csdn.net/weixin_43812198/article/details/131443250

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

15. python从入门到精通——Pygame游戏编程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python GUI编程:从入门到精通

Python GUI编程入门到精通,掌握Python GUI编程基础知识,学习如何使用Python创建图形用户界面,探索Python GUI编程的各种技巧和窍门,成为一名熟练的Python GUI程序员。
Python GUI编程:从入门到精通
2024-02-14

Shell 编程从入门到精通 - 第 03 章

Shell 编程的基本元素 编程语言变量类型:变量对于编程语言来说很重要,编程语言使用变量来存储数据,执行运输。 静态类型语言:一种在编译期间就确定数据类型的语言。大多数是通过在使用任一变量之前声明其数据类型来保证这一点,例如
2023-06-06

python课程(68G)从入门到精通全

对比过很多python学习视频,很多老师都是全程读ppt,非常乏味,这个视频也是我买的,就业班上课实录,讲的非常有意思,生动形象,本人也是看完之后顺利找到了第一份实习,在此特地分享给大家。不过有什么问题的话还可以加我微信好友data_eco
2023-01-31

python从入门到精通(DAY 2)

1、字典复制:dict = {'name':'wang', 'sex':'m', 'age':34, 'job':'it'}info = dict ##别名 (二个字典指向内存的同一地址空间)info1 = dict.copy()
2022-06-04

python从入门到精通(DAY 1)

1、要点(1) 在C语言中没有字符串,只有字符,在python中的字符串hello,在C语言中是以字符数组在内存存放['h','e','l','l','o'],如果对字符串修改,则是在内存中新开辟了一段空间进行存放。字符串特性:一旦修改,需
2022-06-04

python从入门到精通(DAY 3)

要求:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定针对此实例写了有二种类型的脚本,略有不同,具体如下: 帐号文件account.txt内容如下: sam 123 david 12 kevin 123 lin 12
2022-06-04

wpf从入门到精通教程

WPF(Windows Presentation Foundation)是微软开发的一种基于.NET Framework的桌面应用程序开发框架。它提供了丰富的用户界面元素、数据绑定和动画等功能,使得开发者可以轻松地创建高质量的桌面应用程序。
2023-10-27

Python异步编程: 从入门到精通, 成为异步编程高手

Python异步编程是通过协程和事件驱动来实现并发和高性能的编程技术。本文将介绍Python异步编程的基础知识,以及如何使用协程和事件驱动来编写异步程序。
Python异步编程: 从入门到精通, 成为异步编程高手
2024-02-25

Python异步编程: 揭秘异步编程的奥秘, 从入门到精通

异步编程是一种有效的编程方法,它可以让程序在不阻塞的情况下同时执行多个任务,从而提高程序的运行效率。本文将介绍 Python 异步编程的基础知识,并通过示例演示如何使用 Python 实现异步编程。
Python异步编程: 揭秘异步编程的奥秘, 从入门到精通
2024-02-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录