游戏界面截图:

基于Python3-Pygame的乒乓球游戏

按键控制:

空格: 暂停/开始
W: 上
S: 下

游戏玩法说明:

开始游戏之后,按键盘W/S按键控制球拍上下移动,接住球即可继续游戏,没接住的话游戏结束。结束后按空格可以重新开始游戏

使用的文件:

基于Python3-Pygame的乒乓球游戏
图片和音乐也可以没有,可跳过, 但是游戏运行后没音效和图片。下载音频和图片压缩包,解压放到代码相同目录下,百度网盘 :https://pan.baidu.com/s/12QXF2530ymr_sdXAa-e43g 提取码: q6cw

介绍完毕,下面开始撸代码。代码注释比较详细,可以直接复制运行,也可以仔细阅读学习。

Sprite为我们提供了一个装载游戏对象的类,比如这里面的球拍和球,而Group则是Sprite的组合,可以轻松的对Group里面的各个sprite进行碰撞检测、删除、绘制。

依赖库:Pygame

安装pygame模块 : pip install pygame
基于Python3-Pygame的乒乓球游戏

兵乓球:ball.py

import pygame

class ball(pygame.sprite.Sprite):
    """
    乒乓球类,存放相关参数
    """
    width = -1  # 宽度
    speedx = -1  # 每秒横轴移动的像素点
    speedy = -1  # 每秒纵轴移动的像素点

    def __init__(self, color, size, screensize, speed, img=False):
        pygame.sprite.Sprite.__init__(self)
        if img:  # 有图用图,忽略大小size设置,大小由图片大小确定
            try:
                self.image = pygame.image.load(img)
                self.width = self.image.get_size()[0]  # 大小修正
            except Exception as e:  # 图片文件发生错误用方块替代
                print("温馨提示: ", e, ", 请正确配置图片文件")
                self.image = pygame.Surface((size, size))
                self.width = size
                self.image.fill(color)
        else:  # 没图用方块替代
            self.image = pygame.Surface((size, size))
            self.width = size
            self.image.fill(color)
        self.rect = self.image.get_rect()  # 位置数据
        (self.WIDTH, self.HEIGHT) = screensize
        (self.speedx, self.speedy) = speed

    def reset(self, speed):
        self.rect.x = 490  # 球数据
        self.rect.y = 80
        (self.speedx, self.speedy) = speed

    def update(self):
        # 上下边界
        if (((self.rect.y + self.width) > self.HEIGHT) or self.rect.y < 0):
            self.speedy = -self.speedy
        elif (self.rect.x + self.width) > self.WIDTH:  # 右边界处理
            self.speedx = -self.speedx
        self.rect.x = self.rect.x + self.speedx
        self.rect.y = self.rect.y + self.speedy

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

乒乓球拍:racket.py

import pygame

class racket(pygame.sprite.Sprite):
    """
    球拍类,存放相关参数
    """
    rkth = 100  # 球拍默认宽度
    rkwh = 10  # 球拍厚度
    rkstep = 0  # 每秒球拍移动的像素个数

    def __init__(self, color, size, speed, img=False):
        pygame.sprite.Sprite.__init__(self)
        if img:  # 有图用图,忽略大小size设置,大小由图片大小确定
            try:
                self.image = pygame.image.load(img)
                self.rkwh = self.image.get_size()[0]  # 大小修正
                self.rkth = self.image.get_size()[1]
            except Exception as e:  # 图片文件发生错误用方块替代
                print("温馨提示: ", e, ", 请正确配置图片文件")
                self.image = pygame.Surface(size)
                self.width = size
                self.image.fill(color)
        else:  # 没图用方块替代
            self.image = pygame.Surface(size)
            (self.rkwh, self.rkth) = size
            self.image.fill(color)
        self.rect = self.image.get_rect()  # 位置数据
        self.rkstep = speed

    def reset(self):
        self.rect.y = 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

主程序:pong.py

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
'''
@File    :  pong.py
@Desc    :  基于py3-pygame的乒乓球游戏
'''
import sys
import pygame
from pygame.locals import K_SPACE, K_s, K_w
from ball import ball
from racket import racket

MHIT = "music/pong.ogg"  # 击球声音文件路径
MBEG = "music/maliaobegin.ogg"  # 开始音频
MFAIL = "music/fail.ogg"  # 游戏失败音频
MBAK = "music/maliaorun.ogg"  # 背景音乐音频

WIDTH = 808
HEIGHT = 640
FPS = 30
CBACK = (153, 255, 0)
CBALL = (245, 245, 220)
CRKT = (200, 0, 0)
CFONT = (0, 0, 0)


def main():
    isload = False  # 音乐是否载入
    isfont = False  # 字体是否存在
    ispause = False  # 是否暂停
    isfail = False
    score = 0  # 分数
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption('Pong Pygame program')
    clock = pygame.time.Clock()

    bball = ball(CBALL, 20, (WIDTH, HEIGHT), (280 / FPS, 180 / FPS),
                 "img/ball.png")
    bball.rect.x = 490
    bball.rect.y = 80
    rkt = racket(CRKT, (10, 100), 220 / FPS, "img/pingpongbat.png")
    rkt.rect.x = 0
    rkt.rect.y = 100

    ball_list = pygame.sprite.Group()  # 存放小球
    all_list = pygame.sprite.Group()  # 存放全部
    ball_list.add(bball)
    all_list.add(bball)
    all_list.add(rkt)

    pygame.mixer.init()  # 初始化音频模块并载入音频文件
    try:
        mhit = pygame.mixer.Sound(MHIT)
        mbegin = pygame.mixer.Sound(MBEG)
        mbegin.set_volume(0.2)
        mfail = pygame.mixer.Sound(MFAIL)
        pygame.mixer.music.load(MBAK)
        pygame.mixer.music.set_volume(0.4)
        isload = True
    except Exception as m:
        print("温馨提示: ", m, ", 请正确配置音频文件")
    if isload:  # 载入失败不会推出,后面不会有音乐罢了
        pygame.mixer.music.play(-1)  # 循环播放
        mbegin.play()

        # 找不到calibri字体就会使用pygame默认字体,都不支持中文
    try:
        ft = pygame.font.SysFont

相关文章: