效果如下
与以往一行一行解释不同,那样不容易形成对代码整体架构的认识,接下来我将由简单到复杂使用三个迭代的版本,方便理解,如果你有一定基础,可直接看最后的代码

初始

绘制窗体,绘制小球,并且能点击退出

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/2/8 23:43
# @Author  : 陈松
# @decription:  绘制一个小球
import pygame,sys
pygame.init()
#设置窗体大小
size=width,height=600,400
#小球初始速度
speed=[3,3]
#背景***LACK=0,0,0
#设置屏幕大小
screen=pygame.display.set_mode(size)
#设置屏幕标题
pygame.display.set_caption("pygame壁球")
#加载小球
ball=pygame.image.load("../image/littleball.png")
#获得正好框住球的矩形
ballrect=ball.get_rect()
#无限循环,不断刷新屏幕,只有点击退出在退出
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
    screen.fill(BLACK)
    #将图片填充到矩形上,本质上是矩形在动
    screen.blit(ball,ballrect)
    pygame.display.update()
#结束并退出
sys.exit()

效果

进阶

上面的框架本质上就是
导入包->设置窗体->设置小球->循环事件->结束事件
我们在任何一个流程动点手脚,都可以改进游戏

下面我们将用一系列if语句控制小球的移动

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/2/9 0:10
# @Author  : 陈松
# @decription:  增加键盘操作

import pygame,sys
pygame.init()
#设置窗体大小
size=width,height=600,400
speed=[1,1]
BLACK=0,0,0
screen=pygame.display.set_mode(size)
pygame.display.set_caption("pygame壁球")
ball=pygame.image.load("../image/littleball.png")
#获得正好框住球的矩形
ballrect=ball.get_rect()
#每秒钟刷新帧的次数,1秒钟小球运动300个像素
fps=300
fclock=pygame.time.Clock()
#无限循环,不断刷新屏幕,只有点击退出才退出
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                speed[0]=speed[0] if speed[0]==0 else(abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
            elif event.key==pygame.K_RIGHT:
                speed[0]=speed[0]+1 if speed[0]>=0 else speed[0]-1 
            elif event.key==pygame.K_UP:
                speed[1] = speed[1]+1 if speed[1]>0 else speed[1] - 1
            elif event.key==pygame.K_DOWN:
                speed[1]=speed[1] if speed[1]==0 else(abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
    ballrect = ballrect.move(speed[0], speed[1])
    #临界速度取反,让小球弹回来
    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(BLACK)
    #将图片填充到矩形上,本质上是矩形在动
    screen.blit(ball,ballrect)
    pygame.display.update()
#控制窗口刷新,计算每一次刷新之间应有的时间间隔
    fclock.tick()


#结束并退出
sys.exit()

此时的小球已经可以按照我们的键盘来动了

高阶

其实我们的游戏很简单,一点都不高大上,但是我还是将第三版起名为此
因为在产品中,所谓高阶,就是指不仅仅依赖技术,更多的在意实用性,用户体验

这里我们增加了窗体修改大小,最小化自动暂停

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/2/9 10:43
# @Author  : 陈松
# @decription:自动暂停,修改窗体大小

import pygame,sys
pygame.init()

#赋值屏幕尺寸
size=width,height=600,400
speed=[1,1]
BLACK=0,0,0
"""
这里也可以设置游戏边框情况
"""
screen=pygame.display.set_mode(size,pygame.RESIZABLE)
# screen=pygame.display.set_mode(size,pygame.FULLSCREEN)

pygame.display.set_caption("pygame壁球")
ball=pygame.image.load("../image/littleball.png")
#获得正好框住球的矩形
ballrect=ball.get_rect()
#每秒钟刷新帧的次数,1秒钟小球运动300个像素
fps=300
fclock=pygame.time.Clock()
#无限循环,不断刷新屏幕,只有点击退出在退出
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                speed[0]=speed[0] if speed[0]==0 else(abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
            elif event.key==pygame.K_RIGHT:
                speed[0]=speed[0]+1 if speed[0]>=0 else speed[0]-1 #等于0时是不是没有效果了?
            elif event.key==pygame.K_UP:
                speed[1] = speed[1]+1 if speed[1]>0 else speed[1] - 1
            elif event.key==pygame.K_DOWN:
                speed[1]=speed[1] if speed[1]==0 else(abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
            elif event.key==pygame.K_ESCAPE:
                sys.exit()
        elif event.type==pygame.VIDEORESIZE:
            size=width,height=event.size[0],event.size[1]
            screen=pygame.display.set_mode(size,pygame.RESIZABLE)
    #只有当屏幕可见是游戏才进行,如果最小化,则游戏自动暂停
    if pygame.display.get_active():
        ballrect = ballrect.move(speed[0], speed[1])
    #临界速度取反
    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(BLACK)
    #将图片填充到矩形上,本质上是矩形在动
    screen.blit(ball,ballrect)
    pygame.display.update()
#控制窗口刷新,计算每一次刷新之间应有的时间间隔
    fclock.tick()
#结束并退出
sys.exit()

以上代码都可以独立运行,这里主要是修改了while循环内部的事件机制,效果就在文章开头