pygame_pygame 安装 - CSDN
pygame 订阅
Pygame是跨平台Pyth,Pygame 作者是 Pete Shinners, 协议为 GNU Lesser General Public License。 展开全文
Pygame是跨平台Pyth,Pygame 作者是 Pete Shinners, 协议为 GNU Lesser General Public License。
信息
中文名
Pygame
引擎和库
Phil's Pygame Utilities (P
介    绍
Pygame是 跨平台 Pyth
其    他
Pyweek,游戏制作竞赛,
Pygame介绍
包含图像、声音。 建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。Pygame 原为代替突然停止的 pySDL
收起全文
精华内容
参与话题
  • pygame模块的安装

    2020-04-09 14:47:28
    pygame中导入声音、美术资源、碰撞检测的用法 python中对键盘事件的响应 python中三角函数的用法
  • pygame制作贪吃蛇游戏(详细)

    万次阅读 多人点赞 2019-05-09 17:24:17
    案例导入 相信我们绝大多数的人都玩过贪吃蛇这款游戏 今天我们就用python制作这款游戏 但是首先我们想做它就得弄明白他的实现原理是什么 基本原理 首先我们要做的这款游戏界面是很low的,因为我们做的这款游戏算是最...

    案例导入

    相信我们绝大多数的人都玩过贪吃蛇这款游戏
    今天我们就用python制作这款游戏
    但是首先我们想做它就得弄明白他的实现原理是什么

    基本原理

    首先我们要做的这款游戏界面是很low的,因为我们做的这款游戏算是最简单最入门的一款游戏
    玩过这个游戏的人都很清楚,这个蛇在行走时的每一个格子都会移动到他前一个格子的位置,类似于这样一个一个跟随着往前走,最前面的那个格子是跟随着脑袋也就是蛇头往前走,头跟着你的控制器的方向走,这就实现了一个移动跟随
    在这里插入图片描述
    因为是贪吃蛇所以他要吃东西,当它的头部碰到了食物之后也就是头和食物重合了,他的尾部就会增加一格,这就是一个进食的过程 本人灵魂画师请不要介意
    其实这就是这个游戏的核心思想,就干了这么两件事
    在这里插入图片描述

    所需工具

    pygame 下载地址

    实际操作

    废话不多说,直接动手
    第一步 导入模块
    在这里插入图片描述
    第二步 初始化框架
    在这里插入图片描述
    因为宽和高要经常用到,所以把它存在一个变量里面
    在这里插入图片描述
    在我们set_mode的同时会给我们创建一个window对象,我们就可以拿着window对象去显示了
    set_caption设置标题
    现在运行就会有个一闪而过的窗口
    下面的们的代码会解决这个问题
    我们代码最重要的部分 游戏循环
    这个循环要一直循环下去,但是不能让他变成死循环
    怎么解决这个问题呢,首先,这个游戏是可以结束的,结束的条件就是当用户点击退出或者是操作的蛇撞死的时候,这个循环就可以停了
    所以我们可以设置一个变量quit=False,让他一直是false,循环应该结束的时候变成True
    其次我们不能让这个循环一直不停的跑,我们要留出时间来去做一些游戏的渲染或者其他的一些工作,这些工作都是交给系统的,这里我们会用到pygame里面的time.Clock() 这个就是游戏的时间控制,比如把这个游戏调成多少帧
    在这里插入图片描述
    在这里插入图片描述
    现在已经可以出现一个这样的窗口了

    接下来我们还要处理游戏的一些事件和渲染
    我们第一个要处理的事件就是游戏的退出
    在这里插入图片描述
    pygame.event.get()是获取到当前事件的队列
    因为我们要处理这个队列的所有事件,
    一般我们都会设置一个循环,就可以去处理内部一个一个的event

    下面要做的就是渲染了,任何一个游戏都要有渲染的过程

    pygame.draw.rect(window,)绘制工具,参数1要说明你要往哪画,参数2要说明你要画什么颜色的东西,参数三要说明你要画的范围,从哪开始到哪里结束
    pygame.display.flip() #暂时把控制权交还给系统,让系统去做一些渲染操作
    结果
    显示结果如下:(不要在意它的颜色)
    在这里插入图片描述
    现在已经完成了框架初始化的操作
    第三步 绘制场景
    在这里插入图片描述可以把上面的场景看成一个相对较大的二维数组(学过numpy的同学应该很好理解)
    类似于这样:0 0 0 0 0
    0 2 1 1 0
    0 0 0 1 1
    1代表蛇 2代表食物 每个元素都有一个数据
    现在我们需要把这个给体现出来:
    在这里插入图片描述
    先设置这个格子的行和列 行决定了它的纵向 列决定了它的左右位置 现在我们就得到了每个格子有多大 比如: 宽度=总宽度(width)/列(ROW)后面会有用
    这里我弄一个Point对象,让每一个点是让行和列组成的
    把点的行和列都保存起来 大致是这样一个功能

    下面开始定义坐标:
    在这里插入图片描述
    在这里插入图片描述
    先从蛇的头开始,蛇头其实就是一个point对象 我们让它的初始位置在正中间

    然后再定义蛇的食物,因为蛇的食物是随机出现的,所以这里我们用到random模块
    这里有个小细节,我们要生成食物并且不让食物生成在蛇的身体里面,我们可以定义一个函数去解决

    下面开始下一步:
    在这里插入图片描述
    但是我们要计算坐标位置,在绘图中我们是不可以使用行和列的,我们获取到它的位置就要使用上下左右的间距,由此可以推算出左间距=clo*格子的width(可以画图仔细理解一波),上间距=row*格子的height
    因为需要执行很多步画图操作 所以定义一个函数,这里其实是将方块涂色
    下面我们就开始画蛇的部分:
    在这里插入图片描述
    下面是蛇的移动:
    比如我们要朝左边,row不动,clo-=1 右边就是clo+=1 依次类推
    我们可以先定义一个变量表示当前蛇移动的方向 再进行移动判断

    在这里插入图片描述
    在这里插入图片描述
    这里还有一个小细节 就是当你在往左移动时,不能直接朝右边移动,朝上移动时,不能直接朝下,所以我们加了if判断
    pygame.KEYDOWN 键盘摁下事件
    event.key是每个键的编码,273->W 119->↑…

    下面处理蛇的跟随移动:
    在这里插入图片描述
    我们可以吧坐标以元组的形式放入一个列表,每次移动头的位置会放对应的方向移动1格(吧原来的头插入到前面insert),并且尾部会消失pop(因为头往前移动了一格),其他不需要变动,只变动头和尾就可以
    在这里插入图片描述
    为了方便我们再给point对象添加一个方法 copy,在copy的过程中其实就是创建一个新的point,这样就可以复制他自己
    在这里插入图片描述
    但是如果蛇吃到食物之后,他是会增加一格的,所以我们这里判断一下,如果蛇头与食物重合,就说明蛇迟到了食物,没重合就说明没吃到这个食物,并且每次吃到这个食物,食物又会在随机位置出现

    最后,我们要处理蛇撞到墙壁或者撞到自身之后游戏结束的操作,其实很简单,如果蛇头出现在了格子以外的地方或者蛇头与蛇的身体重合,就会视为游戏失败,随即会退出游戏

    做到这里就告一段落了,其实这个游戏还有很多地方可以改进,比如添加一个计分系统、失败后出现重新开始按钮和开始时出现开始游戏按钮等等。。。如果有人需要的话我再后面会加以改进。

    下面是源码

    代码

    import pygame
    from sys import exit
    import random
    
    
    class Point():
        row = 0
        clo = 0
    
        def __init__(self, row, clo):
            self.row = row
            self.clo = clo
    
        def copy(self):
            return Point(row=self.row, clo=self.clo)
    
    
    # 初始化
    pygame.init()
    width = 800
    hight = 400
    
    ROW = 30
    CLO = 40
    
    direct = 'left'
    window = pygame.display.set_mode((width, hight))
    pygame.display.set_caption('贪吃蛇游戏')
    
    # 蛇头坐标定在中间
    head = Point(row=int(ROW / 2), clo=int(CLO / 2))
    # 初始化蛇身的元素数量
    snake = [
        Point(row=head.row, clo=head.clo + 1),
        Point(row=head.row, clo=head.clo + 2),
        Point(row=head.row, clo=head.clo + 3)
    ]
    
    
    # 生成食物并且不让食物生成在蛇的身体里面
    def gen_food():
        while 1:
            position = Point(row=random.randint(0, ROW - 1), clo=random.randint(0, CLO - 1))
            is_coll = False
            if head.row == position.row and head.clo == position.clo:
                is_coll = True
            for body in snake:
                if body.row == position.row and body.clo == position.clo:
                    is_coll = True
                    break
            if not is_coll:
                break
        return position
    
    
    # 定义坐标
    # 蛇头颜色可以自定义
    head_color = (0, 158, 128)
    # 食物坐标
    snakeFood = gen_food()
    # 食物颜色
    snakeFood_color = (255, 255, 0)
    
    snake_color = (200, 147, 158)
    
    
    # 需要执行很多步画图操作 所以定义一个函数
    def rect(point, color):
        # 定位 画图需要left和top
        left = point.clo * width / CLO
        top = point.row * hight / ROW
        # 将方块涂色
        pygame.draw.rect(window, color, (left, top, width / CLO, hight / ROW))
    
    
    quit = True
    # 设置帧频率
    clock = pygame.time.Clock()
    while quit:
        # 处理帧频 锁帧
        clock.tick(30)
        # pygame.event.get()获取当前事件的队列 可以同时发生很多事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit = False
            elif event.type == pygame.KEYDOWN:
                # 这里小细节蛇不可以直接左右上下 要判断当前是在什么状态下前行
                if event.key == 273 or event.key == 119:
                    if direct == 'left' or direct == 'right':
                        direct = 'top'
                if event.key == 274 or event.key == 115:
                    if direct == 'left' or direct == 'right':
                        direct = 'bottom'
                if event.key == 276 or event.key == 97:
                    if direct == 'top' or direct == 'bottom':
                        direct = 'left'
                if event.key == 275 or event.key == 100:
                    if direct == 'top' or direct == 'bottom':
                        direct = 'right'
        # 吃东西
        eat = (head.row == snakeFood.row and head.clo == snakeFood.clo)
    
        # 处理蛇的身子
        # 1.把原来的头插入到snake的头上
        # 2.把最后一个snake删掉
        if eat:
            snakeFood = Point(row=random.randint(0, ROW - 1), clo=random.randint(0, CLO - 1))
        snake.insert(0, head.copy())
        if not eat:
            snake.pop()
    
        # 移动一下
        if direct == 'left':
            head.clo -= 1
        if direct == 'right':
            head.clo += 1
        if direct == 'top':
            head.row -= 1
        if direct == 'bottom':
            head.row += 1
        dead = False
        if head.clo < 0 or head.row < 0 or head.clo >= CLO or head.row >= ROW:
            dead = True
        for body in snake:
            if head.clo == body.clo and head.row == body.row:
                dead = True
                break
        if dead:
            print('Game Over')
            quit = False
        # 背景画图
        pygame.draw.rect(window, (245, 135, 155), (0, 0, width, hight))
    
        # 蛇头
        rect(head, head_color)
        # 绘制食物
        rect(snakeFood, snakeFood_color)
        # 绘制蛇的身子
        for body in snake:
            rect(body, snake_color)
    
        # 交还控制权
        pygame.display.flip()
    
    

    希望此文章对你有所帮助,最后谢谢阅读

    PS:pycharm背景图片
    在这里插入图片描述

    展开全文
  • pygame安装(超级详细)

    万次阅读 多人点赞 2020-06-03 02:54:51
    安装时是需要设置python环境变量的,下载python的时候底下有个小框框(没有默认选中) Add Python 3.7 to PATH需要选择的,如果没有选择的话,需要自己设置,我一般比较懒,卸载了python重新下载的,让下载器自动...

    安装时是需要设置python环境变量的,下载python的时候底下有个小框框(没有默认选中)

    Add Python 3.7 to PATH需要选择的,如果没有选择的话,需要自己设置,我一般比较懒,卸载了python重新下载的,让下载器自动设置。
    然后是python版本问题
    在这里插入图片描述
    有人疑问这是64位还是32位,看那个[64bit]是64位,至于后面的on32是在windows上使用的意思,在Linux上使用就显示别的了。
    然后检查pip的安装
    在这里插入图片描述
    如果显示No module named -pip
    那么就是python升级后不能使用原来的命令。
    依次输入python -m ensurepip
    easy_install pip

    进入python官网点击PyPI
    在这里插入图片描述
    输入pygame
    在这里插入图片描述
    在这里插入图片描述
    点击去之后再点击左侧的download files.
    在这里插入图片描述
    找到对应的版本,比如我是python37 64位就下载那个法一。
    然后把下载的whl文件放在python的pip目录下
    在这里插入图片描述
    回到上一句目录在这里插入图片描述
    按住shift然后鼠标点击右键在此处打开命令窗口(选中site-packages文件夹)
    输入pip install pygame-1.9.4-cp37-cp37m-win_amd64.whl(这个是你下载的版本名)在这里插入图片描述
    回车等一会就好啦。
    如果是下载的法二的压缩文件。
    在这里插入图片描述
    则将下载好的压缩文件解压到python的lib目录下
    在这里插入图片描述
    直接打开命令行窗口输入python -m pip install --user pygame,然后回车。

    在这里插入图片描述
    两种方法都可以安装。

    ————————————————————分割线————————————
    更新一下。上面是我初次安装时的方法,随着python使用的增多,发现直接pip命令就可以之间安装。首先确保你有pip。

    pip --version
    

    在这里插入图片描述
    pip也可以查看自己已经安装的扩展包。pip list(对应的anaconda的可以输入conda list
    在这里插入图片描述
    安装方法可以直接在命令行输入pip install -扩展包名字。

    加快安装速度可以使用国内镜像源。
    清华:https://pypi.tuna.tsinghua.edu.cn/simple

    阿里云:http://mirrors.aliyun.com/pypi/simple/

    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

    华中理工大学:http://pypi.hustunique.com/

    山东理工大学:http://pypi.sdutlinux.org/

    豆瓣:http://pypi.douban.com/simple/

    给个示例,下载spyder3.3.2版本。
    在这里插入图片描述

    展开全文
  • Python游戏编程(Pygame)

    万次阅读 多人点赞 2019-10-18 11:00:29
    安装Pygame pip install pygame C:\Users&amp;amp;amp;gt; pip install pygame Collecting pygame Downloading https://files.pythonhosted.org/packages/3e/f5/feabd88a2856ec86166a897b62...

    安装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 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
    

    执行结果:

    制作一个跳跃的小球游戏

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

    创建游戏窗口

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

    加载游戏图片

    开发过程中使用的图片

    3. 在窗口添加小球。我们先准备好一张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对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个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 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
    

    碰撞检测

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

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

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

    限制移动速度

    6. 运行上述代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉,使用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
    

    开发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 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()
    
    

    执行结果:

    展开全文
  • Pygame介绍

    千次阅读 2019-01-08 09:02:08
    Pygame是一套用来写游戏的Python模块。它是基于SDL库的,它使你可以用Python语言创建完全界面化的游戏和多媒体程序。Pygame可以运行在几乎所有的平台和操作系统上。 Pygame是免费的,它是在LGPL许可证下发布的,你...

    Pygame是一套用来写游戏的Python模块。它是基于SDL库的,它使你可以用Python语言创建完全界面化的游戏和多媒体程序。Pygame可以运行在几乎所有的平台和操作系统上。
         Pygame是免费的,它是在LGPL许可证下发布的,你可以用它来创建免费软件、共享软件和商业游戏。

    下面,我们用一个例子来了解一下用Pygame来写游戏:
     1    import sys, pygame
     2    pygame.init()
     3
     4    size = width, height = 320, 240
     5    speed = [2, 2]
     6    black = 0, 0, 0
     7
     8    screen = pygame.display.set_mode(size)
     9
    10    ball = pygame.image.load("ball.bmp")
    11    ballrect = ball.get_rect()
    12
    13    while 1:
    14        for event in pygame.event.get():
    15            if event.type == pygame.QUIT: sys.exit()
    16
    17        ballrect = ballrect.move(speed)
    18        if ballrect.left < 0 or ballrect.right > width:
    19            speed[0] = -speed[0]
    20        if ballrect.top < 0 or ballrect.bottom > height:
    21            speed[1] = -speed[1]
    22
    23        screen.fill(black)
    24        screen.blit(ball, ballrect)
    25        pygame.display.flip()
    上面的代码创建了一个跳动的球的动画。
    说明:
    import pygame:引入pygame包中的所有有效的模块(必须)。
    pygame.init():初始化所有引入的模块。在你需要用pygame做任何事之前,你必须初始化它。
    第8行:创建了一个图形化窗口,pygame用surface对象来描述图象。display.set_mode()函数创建一个新的surface来描述实际显示的图形。你在surface上画的任何东西都将在显示器上可见。
    第10行:我们装入了名为"ball.bmp"的图象。pygame支持多种图象格式,包括:JPG、PNG、TGA和GIF。pygame.image.load("ball.bmp")返回一个带有ball.bmp数据的surface。
    第11行:ball.get_rect()返回一个覆盖整个surface的矩形并赋给变量ballrect。这个矩形的左上角位于窗口的(0,0)的处,大小和所装入的图形一样。
    第13行:我们开始一上无限的循环:检测用户的输入、移动图象、画图象。
    第17行~第21行:移动ballrect代表的矩形。
    第23行:用黑色填充窗口,以抹去以前的图形。
    第24行:重画图象。screen.blit(ball, ballrect)将变量ball中的图象数据画到变量ballrect指定的区域。到目前为止,图象还不可见。
    pygame.display.flip():使你所画的在窗口中可见。

     

     

     

    一个例子:

    # picView - A simple image viewer written using PyGame library.
    #
    # Copyleft 2008 Bruce Jia
    #

    import os
    import pygame
    import pygame.image
    from pygame import display

    def isImageFile(filePath):
        lowerFilePath = filePath.lower()
        if (lowerFilePath.endswith('.jpg') or
            lowerFilePath.endswith('.png') or
            lowerFilePath.endswith('.bmp') or
            lowerFilePath.endswith('.gif') or
            lowerFilePath.endswith('.jpeg')):
            return True

        return False

    class ImageFolder:
        def CurrentImage(self):
            if self.index == -1 or len(self.images) == 0:
                return ""
            return self.images[self.index]
        def NextImage(self):
            if 0 == len(self.images) or self.index == len(self.images) - 1:
                return ""
           
            self.index = self.index + 1
            return self.images[self.index]
           
        def PrevImage(self):
            if 0 == len(self.images) or self.index == -1:
                return ""
           
            self.index = self.index - 1
            if self.index >= 0:
                return self.images[self.index]
            pass
        def __init__(self, folderPath):
            self.images = []
            # TODO: add recursive search
            for file in os.listdir(folderPath):
                if (os.path.isfile(os.path.join(folderPath, file))):
                    if (isImageFile(file)):
                        self.images.append(os.path.join(folderPath, file))
            self.index = -1
            pass

    def ShowImageWithFitScale(screen, imageFilePath, angle=0):
        if (imageFilePath == None or imageFilePath == ""):
            return
       
        image = pygame.image.load(imageFilePath)
        scrWidth, scrHeight = screen.get_size()
        image = pygame.transform.rotate(image, angle)
           
        imgWidth, imgHeight = image.get_size()
        ratio = 1.0 * imgWidth / imgHeight
        if imgWidth > imgHeight:
            if imgWidth > scrWidth:
                imgWidth = scrWidth
                imgHeight = imgWidth / ratio
                if imgHeight > scrHeight:
                    imgHeight = scrHeight
                    imgWidth = imgHeight * ratio
        else:
            if imgHeight > scrHeight:
                imgHeight = scrHeight
                imgWidth = imgHeight * ratio
                if (imgWidth > scrWidth):
                    imgWidth = scrWidth
                    imgHeight = imgWidth / ratio

        image = pygame.transform.scale(image, (int(imgWidth), int(imgHeight)))
        posX = (scrWidth - imgWidth) / 2.0
        posY = (scrHeight - imgHeight) / 2.0
        screen.fill((0, 0, 0))
        screen.blit(image, (posX, posY))
        pygame.display.flip()
           
    if __name__ == "__main__":
        from sys import argv
        if(len(argv) < 2):
            print "Usage: picView.py "
            sys.exit(1)
        folderPath = argv[1]
        print "Showing pictures in " + folderPath
        imageFolder = ImageFolder(folderPath)
        display.init()
        screen = display.set_mode((0,0), pygame.FULLSCREEN)
        quit = False
        angle = 0
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit = True
                    break
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        quit = True
                        break
                    elif event.key in [pygame.K_UP, pygame.K_PAGEUP, pygame.K_F7, pygame.K_BACKSPACE]:
                        angle = 0
                        ShowImageWithFitScale(screen, imageFolder.PrevImage(), angle)
                    elif event.key in [pygame.K_DOWN, pygame.K_PAGEDOWN, pygame.K_F8, pygame.K_RETURN, pygame.K_SPACE]:
                        angle = 0
                        ShowImageWithFitScale(screen, imageFolder.NextImage(), angle)
                    elif event.key == pygame.K_LEFT:
                        angle = angle + 90
                        ShowImageWithFitScale(screen, imageFolder.CurrentImage(), angle)
                    elif event.key == pygame.K_RIGHT:
                        angle = angle - 90
                        ShowImageWithFitScale(screen, imageFolder.CurrentImage(), angle)
                    elif event.key == pygame.K_F5:
                        angle = 0
                        ShowImageWithFitScale(screen, imageFolder.CurrentImage(), angle)
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    ShowImageWithFitScale(screen, imageFolder.NextImage())
            if quit:
                break
        print "Byebye!"
        display.quit()

    展开全文
  • Pygame详解(五):font 模块

    万次阅读 多人点赞 2019-01-11 15:51:42
    pygame.font Pygame 中加载和表示字体的模块。 函数 pygame.font.init() —— 初始化字体模块 pygame.font.quit() —— 还原字体模块 pygame.font.get_init() —— 检查字体模块是否被初始化 pygame....
  • Pygame详解(三):draw 模块

    千次阅读 2019-01-11 15:28:47
    pygame.draw Pygame 中绘制图形的模块。 函数 pygame.draw.rect() — 绘制矩形 pygame.draw.polygon() — 绘制多边形 pygame.draw.circle() — 根据圆心和半径绘制圆形 pygame.draw.ellipse() — 根据...
  • Python:下载和安装Pygame

    万次阅读 多人点赞 2019-10-11 22:54:01
    1.下载Pygame包 注意:根据Python版本和Windows系统的位数选择要对应版本的Pygame包 官网地址:http://www.pygame.org/download.shtml 其中,如果Python为以下3.4,3.5和3.6版本,可去如下网点下载(cp36即为...
  • pygame-飞机大战(下·二)

    千次阅读 2019-07-27 01:05:48
    一、Kinds文件夹 Kinds文件夹下定义了多个本机、敌机、子弹等单位类,每个类自成一个py文件,并以类名命名。 1.Ship类 Ship类除了定义了基本的初始化和刷新以外,还包括: ... (1)update_revive函数,在...
  • Anaconda下安装Pygame

    万次阅读 2018-07-19 12:15:00
    Anaconda下安装Pygame 查看Anaconda下是否已安装Pygame 安装Pygame 查看Anaconda下是否已安装Pygame 打开cmd,输入:conda list 结果如下所示: 安装Pygame 输入命令 conda install -c cogsic...
  • 如何解决pycharm上导入pygame包失败的问题

    万次阅读 多人点赞 2018-12-24 13:49:35
    当安装完pygame包,且已经在windows命令行界面看到import pygame成功,如下 但是在pycharm上导入import却失败,如下 这是因为Pygame默认安装到C盘,但一般我们pycharm的python文件放到非C盘,所以要为pycharm加入...
  • Py之pygame:Python的pygame库的简介、安装、使用方法详细攻略 目录 pygame库的简介 pygame库的安装 pygame库的使用方法 pygame库的简介 PyPoice是SDL多媒体库的Python包装模块。它包含Python...
  • 在while循环语句后面加上这段代码 while True: ...... for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() 最后关闭程序时要点击窗口关闭按钮 ...import pygame pygame.init...
  • PyCharm导入pygame方法

    万次阅读 2019-01-06 13:04:02
    1. 2.点击 + 3.install Package
  • No module named 'pygame'的处理方法

    万次阅读 2019-06-04 10:43:54
    安装pygame.通过File-setting-Project interpreter,点击‘’+‘’,搜索Pygame即可。
  • Pygame 官方文档 - 中译版

    万次阅读 多人点赞 2019-04-10 12:41:48
    pygame 文档 Pygame之家【Pygame Home】 帮助内容【Help Contents】 指导索引【Reference Index】...
  • python3 pygame学习(2):使用pygame加载音乐

    万次阅读 多人点赞 2017-10-26 12:51:10
    1:导入pygame库,并且初始化声音播放模块 import pygame pygame.mixer.init() 2:pygame提供了两个加载音乐文件的方法 pygame.mixer.Sound,主要加载ogg和wav音频文件。 pygame.mixer.music,主要加载mp3音频文件...
  • Python 3.7 pygame 下载方法

    万次阅读 2018-04-04 17:35:35
    打开 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame下载 pygame-1.9.3-cp37-cp37m-win_amd64.whl安装 pip install pygame-1.9.3-cp37-cp37m-win_amd64.whl测试 在python的IDLE里输入import pygame,如果不...
  • Pygame 中文文档 一

    万次阅读 多人点赞 2018-03-01 16:58:53
    属性pygame.init() — 初始化所有导入的 pygame 模块pygame.quit() — 卸载所有导入的 pygame 模块pygame.error() — 标准 pygame 异常模块pygame.get_error() — 获得当前错误信息pygame.set_error() — 设置当...
  • 在安装pygame后,在py文件中import pygame 出现No module named 'pygame’的一个错误,可能的解决办法如下: 1:先到cmd下 敲 pip list 命令,查看本机电脑都安装了什么工具,包不包括pip,pygame,wheel; 2: 在cmd...
1 2 3 4 5 ... 20
收藏数 17,171
精华内容 6,868
关键字:

pygame