基于Python3-Pygame的乒乓球游戏
游戏界面截图:
按键控制:
空格: 暂停/开始
W: 上
S: 下
游戏玩法说明:
开始游戏之后,按键盘W/S按键控制球拍上下移动,接住球即可继续游戏,没接住的话游戏结束。结束后按空格可以重新开始游戏
使用的文件:
图片和音乐也可以没有,可跳过, 但是游戏运行后没音效和图片。下载音频和图片压缩包,解压放到代码相同目录下,百度网盘 :https://pan.baidu.com/s/12QXF2530ymr_sdXAa-e43g 提取码: q6cw
介绍完毕,下面开始撸代码。代码注释比较详细,可以直接复制运行,也可以仔细阅读学习。
Sprite为我们提供了一个装载游戏对象的类,比如这里面的球拍和球,而Group则是Sprite的组合,可以轻松的对Group里面的各个sprite进行碰撞检测、删除、绘制。
依赖库:Pygame
安装pygame模块 : pip install 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