空格: 暫停/開始
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