空格: 暂停/开始
W: 上
S: 下python
开始游戏以后,按键盘W/S按键控制球拍上下移动,接住球便可继续游戏,没接住的话游戏结束。结束后按空格能够从新开始游戏ide
图片和音乐也能够没有,可跳过, 可是游戏运行后没音效和图片。下载音频和图片压缩包,解压放到代码相同目录下,百度网盘 :https://pan.baidu.com/s/12QXF2530ymr_sdXAa-e43g 提取码: q6cw函数
介绍完毕,下面开始撸代码。代码注释比较详细,能够直接复制运行,也能够仔细阅读学习。性能
Sprite为咱们提供了一个装载游戏对象的类,好比这里面的球拍和球,而Group则是Sprite的组合,能够轻松的对Group里面的各个sprite进行碰撞检测、删除、绘制。学习
安装pygame模块 : pip install pygame字体
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
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
#!/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("calibri", 30) ftg