pygame学习手册(一):从画矩形到打乒乓

pygame简介

Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。
是否你曾想当个游戏开发者,或者你是一个热爱游戏的玩家有时候也想自己做一两款游戏出来给大家带来欢乐呢?pygame,python+SDL(Simple DirectMedia Layer),只要稍作了解很快就能做出属于你自己的游戏,还等什么呢?

安装pygame

本博客使用的环境是python3.6+pygame1.9+windows10(64bit)
如果你是Linux用户,那系统应该已经自带了python3,你只要在控制台输入:

sudo pip install pygame

Windows用户也一样,安装好python3后,使用管理员身份打开命令行,输入

pip install pygame

提示安装成功即可

用pygame画个矩形

许多教程介绍一个新东西总是从Hello World开始,这里我们不妨先从画一个矩形开始。
要绘制矩形,要调用pygame.draw.rect()函数。下面是展示代码:

# 画个矩形
# Python 3.6
# Pygame 1.9

import pygame, sys, time, random
from pygame.locals import * 
pygame.init()#初始化pygame
screen = pygame.display.set_mode((800,600))#pygame的展示界面也就是游戏一开始的界面
pygame.display.set_caption("画个矩形")#设置游戏标题

pos_x = 300 #矩形的X轴坐标
pos_y = 250 #矩形的Y轴坐标
vel_x = 2 #X轴分速度
vel_y = 1 #Y轴分速度
color_index = 0 #颜色索引
#一堆颜色常量,为(R,G,B)元组
RED = 255,0,0
ORANGE = 255,156,0
YELLOW = 255,255,0
GREEN = 0,255,0
GREENBLUE = 0,255,255
BLUE = 0,0,255
PURPLE = 255,0,255

colors = [RED,ORANGE,YELLOW,GREEN,GREENBLUE,BLUE,PURPLE]
#进入死循环,让游戏能不断运行
while True:
    #当按下退出键时,游戏退出
    for event in pygame.event.get():
        if event.type in (QUIT, KEYDOWN):
            sys.exit()

    screen.fill((0,0,0))#黑色填满画面

    #移动矩形
    pos_x += vel_x
    pos_y += vel_y

    #保证矩形能待在屏幕内
    if pos_x > 700 or pos_x < 0:
        color_index = random.randint(0,len(colors)-1)#碰到墙壁时变色
        vel_x = -vel_x
    if pos_y > 500 or pos_y < 0:
        color_index = random.randint(0,len(colors)-1)#碰到墙壁时变色
        vel_y = -vel_y        

    #画矩形
    color = colors[color_index] #定义颜色
    width = 0 #width参数是绘制外边缘的粗细。 如果width为零,则填充矩形。
    pos = pos_x, pos_y, 100, 100 #参数意义,x轴坐标,Y轴坐标,x长度,Y长度
    pygame.draw.rect(screen, color, pos, width) #

    pygame.display.update()#更新整个屏幕
    time.sleep(0.005)#别动的太快了

这样我们就能得到一个在屏幕上乱晃,并且碰到墙壁之后就会变色的一个小方块。
pygame学习手册(一):从画矩形到打乒乓_第1张图片
但是只画一个会到处变色的矩形未免有些称不上游戏,下面我们来写一个两个小挡板自动对打乒乓。

对打乒乓

小时候可能大家都在诺基亚或者其他牌子的手机里见过这种游戏。
pygame学习手册(一):从画矩形到打乒乓_第2张图片
这里先让两个小挡板自动对打,之后在介绍键盘事件的时候再给玩家自己操作的余地。
下面是对打乒乓的代码。

# 对打乒乓
# Python 3.6
# pygame 1.9
# Author zhunw

import pygame, sys, time, random
from pygame.locals import *

def print_text(font, x, y, text, color=(255,255,255)):
    imgText = font.render(text, True, color) 
    #pygame在屏幕上显示文字,将文字转化为位图后展示
    screen.blit(imgText, (x,y))

#宣示胜利,游戏结束
def left_win():
    text = "Left Player Won!" 
    font1 = pygame.font.Font(None, 30)
    print_text(font1, 200, 100, text)

def right_win():
    text = "Right Player Won!"
    font1 = pygame.font.Font(None, 30)
    print_text(font1, 200, 100, text)

pygame.init()#初始化pygame
#pygame的展示界面也就是游戏一开始的界面
pygame.display.set_caption("对打乒乓")
#设置游戏标题

#球的初始位置与初始速度
ball_pos_x = 400 
ball_pos_y = 300
vel_x = 2
vel_y = 1
#左玩家的初始位置
left_player_pos_x = 95
left_player_pos_y = 275
#右玩家的初始位置
right_player_pos_x = 695
right_player_pos_y = 275
#玩家的移动速度
player_vel_y = 3

while True:

    for event in pygame.event.get():
        if event.type in (QUIT, KEYDOWN):
            sys.exit()

    #清屏
    screen.fill((0,0,0))

    #移动小球
    ball_pos_x += vel_x
    ball_pos_y += vel_y

    #计算移动时间
    move_time = 0
    if vel_x > 0:
        move_time = (685-ball_pos_x)//vel_x
    else:
        move_time = (ball_pos_x - 105)//abs(vel_x)

    #计算落点
    end_pos_y = ball_pos_y + vel_y * move_time

    #移动玩家
    if vel_x > 0 \
        or left_player_pos_y-10 < end_pos_y < left_player_pos_y+40 :
        #如果球奔着右玩家去的,或者球的落点在挡板上,左玩家不动
        pass
    else:
        #当玩家碰壁的时候,控制玩家在屏幕内
        if left_player_pos_y < 0 :
            left_player_pos_y = 0
        elif left_player_pos_y >550:
            left_player_pos_y = 550
        else:
            #移动玩家直到到达落点
            if left_player_pos_y - end_pos_y > 0:
                left_player_pos_y -= player_vel_y
            else :
                left_player_pos_y += player_vel_y
    #右玩家与左玩家同理
    if vel_x < 0 \
        or right_player_pos_y-10 < end_pos_y < right_player_pos_y+40 :
        pass
    else:
        if right_player_pos_y < 0 :
            right_player_pos_y = 0
        elif right_player_pos_y > 550:
            right_player_pos_y = 550
        else:
            if right_player_pos_y - end_pos_y > 0:
                right_player_pos_y -= player_vel_y
            else:
                 right_player_pos_y += player_vel_y    

    #保持小正方体保持在屏幕内
    if ball_pos_x > 790:
        #到达右边墙壁,左玩家获胜
        left_win()
        vel_x = 0
        vel_y = 0
    elif ball_pos_x < 0:
        #到达左边墙壁,右玩家获胜
        right_win()
        vel_x = 0
        vel_y = 0
    if ball_pos_x >= 685 \
        and right_player_pos_y-10 <= ball_pos_y <= right_player_pos_y+60 :
        #被右玩家打回
        vel_x = -vel_x
    if ball_pos_x <= 105 \
        and left_player_pos_y-10 <= ball_pos_y <= left_player_pos_y+60 :
        #被左玩家打回
        vel_x = -vel_x

    if ball_pos_y > 590 or ball_pos_y < 0:
        #被上下顶打回
        vel_y = -vel_y        





    #画图
    color = (255,255,255)
    width = 0 
    pos = ball_pos_x,ball_pos_y, 10, 10
    pygame.draw.rect(screen, color, pos, width)
    #画玩家
    lplayer_pos = left_player_pos_x, left_player_pos_y, 10, 50
    pygame.draw.rect(screen, color, lplayer_pos, width)
    rplayer_pos = right_player_pos_x, right_player_pos_y, 10, 50
    pygame.draw.rect(screen, color, rplayer_pos, width)


    pygame.display.flip()
    time.sleep(0.01)

运行,你就可以看到两个小挡板为你不断的表演了。是不是很简单?

参考资料

https://pygame.org/docs/
Jonathan S.Harbour 著 李强 译《python游戏编程入门》

你可能感兴趣的:(python,pygame)