基于Python3-Pygame的乒乓球游戏

python

游戏界面截图:

按键控制:

空格: 暂停/开始
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

以上是 基于Python3-Pygame的乒乓球游戏 的全部内容, 来源链接: utcz.com/z/387755.html

回到顶部