1. 程式人生 > 程式設計 >使用python和pygame製作擋板彈球遊戲

使用python和pygame製作擋板彈球遊戲

python是個很有趣的語言,可以在cmd命令視窗執行,還有很多的功能強大的模組。

學了一天pygame,用python和pygame寫一個簡單的擋板彈球遊戲。

2018年6月21日 00:15:21

GitHub:

EasyBaffleBallGame

# -*- coding:utf-8 -*-
from sys import exit
import pygame
from pygame.locals import *
pygame.init()
# 建立視窗
ScreenWidth = 500
ScreenHright = 720
ScreenSize = (ScreenWidth,ScreenHright)
Screen = pygame.display.set_mode(ScreenSize,32)
pygame.display.set_caption("Ly's Easy Ball Game")
# 背景音樂
pygame.mixer.music.load('Sugar.mp3')
pygame.mixer.music.play(-1,0.0)
# 碰撞音效
CollisionMusic = pygame.mixer.Sound('collision.wav')
# 重新開始按鈕音效
ButtonMusic = pygame.mixer.Sound('button.wav')
# 遊戲結束音效
GameOverMusic = pygame.mixer.Sound('over.wav')
def GameStart():
  # 遊戲背景Surface物件
  Background = pygame.image.load('GameBackground.jpg').convert()
  # 擋板Surface物件
  Baffle = pygame.image.load('Baffle.png').convert_alpha()
  # 球Surface物件
  Ball = pygame.image.load('Ball.png').convert_alpha()
  # 擋板位置資訊
  BaffleX = 140
  BaffleY = 600
  BaffleSpeed = 1000
  BaffleXSpeed = BaffleSpeed
  BaffleYSpeed = BaffleSpeed
  BaffleMove = {K_LEFT: 0,K_RIGHT: 0,K_UP: 0,K_DOWN: 0}
  # 球位置資訊
  BallX = 235
  BallY = 0
  BallSpeed = 1000.
  BallXSpeed = BallSpeed
  BallYSpeed = BallSpeed
  # 幀率控制Clock物件
  FPSClock = pygame.time.Clock()
  # 時間顯示Clock物件
  ProgramRunClock = pygame.time.get_ticks()
  # 時間顯示Font物件
  RunTimeFont = pygame.font.Font('Jura-DemiBold.ttf',24)
  # 遊戲結果
  GameResult = ''
  while True:
    # 接收資訊處理
    for event in pygame.event.get():
      if event.type == QUIT:
        exit()
      if event.type == KEYDOWN:
        if event.key in BaffleMove:
          BaffleMove[event.key] = 1
      elif event.type == KEYUP:
        if event.key in BaffleMove:
          BaffleMove[event.key] = 0
    # 繪製背景
    Screen.blit(Background,(0,0))
    RunTimeStr = str((pygame.time.get_ticks() - ProgramRunClock) / 1000.0)
    # print(RunTimeStr)
    # 使用render方法顯示時間字型
    RunTimeSurface = RunTimeFont.render(RunTimeStr,True,(255,52,179))
    # 顯示時間
    Screen.blit(RunTimeSurface,0))
    # 距上次呼叫clock物件時間
    SecondTimePassed = FPSClock.tick(60) / 1000.0
    # 繪製球
    Screen.blit(Ball,(BallX,BallY))
    BallX += BallXSpeed * SecondTimePassed
    BallY += BallYSpeed * SecondTimePassed
    # 判斷球邊界條件
    if BallX > 500 - Ball.get_width():
      BallXSpeed = -BallXSpeed
      BallX = 500 - Ball.get_width()
    elif BallX < 0:
      BallXSpeed = -BallXSpeed
      BallX = 0
    if BallY > 720 - Ball.get_width():
      BallYSpeed = -BallYSpeed
      BallY = 720 - Ball.get_width()
    elif BallY < 0:
      BallYSpeed = -BallYSpeed
      BallY = 0
    # 定位擋板移動後坐標
    BaffleX -= BaffleMove[K_LEFT] * BaffleXSpeed * SecondTimePassed
    BaffleX += BaffleMove[K_RIGHT] * BaffleXSpeed * SecondTimePassed
    BaffleY -= BaffleMove[K_UP] * BaffleYSpeed * SecondTimePassed
    BaffleY += BaffleMove[K_DOWN] * BaffleYSpeed * SecondTimePassed
    # 判斷擋板邊界條件
    if BaffleX > 500 - Baffle.get_width():
      BaffleX = 500 - Baffle.get_width()
    elif BaffleX < 0:
      BaffleX = 0
    if BaffleY > 720 - 45 - Baffle.get_height():
      BaffleY = 720 - 45 - Baffle.get_height()
    elif BaffleY < 720 - Baffle.get_height() * 3:
      BaffleY = 720 - Baffle.get_height() * 3
    # 繪製擋板
    Screen.blit(Baffle,(BaffleX,BaffleY))
    # 判斷球碰撞擋板條件
    # 擋板左上角
    if BallX == BaffleX - Ball.get_width() and BallY == BaffleY - Ball.get_height():
      BallXSpeed = -BallXSpeed
      BallYSpeed = -BallYSpeed
      CollisionMusic.play()
    # 擋板左下角
    elif BallX == BaffleX - Ball.get_width() and BallY == BaffleY + Baffle.get_height():
      BallXSpeed = -BallXSpeed
      BallYSpeed = -BallYSpeed
      CollisionMusic.play()
    # 擋板右上角
    elif BallX == BaffleX + Baffle.get_width() and BallY == BaffleY - Ball.get_height():
      BallXSpeed = -BallXSpeed
      BallYSpeed = -BallYSpeed
      CollisionMusic.play()
    # 擋板右下角
    elif BallX == BaffleX + Baffle.get_width() and BallY == BaffleY + Baffle.get_height():
      BallXSpeed = -BallXSpeed
      BallYSpeed = -BallYSpeed
      CollisionMusic.play()
    # 擋板上表面
    elif BallX > BaffleX and BallX < BaffleX + Baffle.get_width() and BallY > BaffleY - Ball.get_height() and BallY < BaffleY:
      BallYSpeed = -BallYSpeed
      BallY = BaffleY - Ball.get_height()
      CollisionMusic.play()
    # 擋板下表面
    elif BallX > BaffleX and BallX < BaffleX + Baffle.get_width() and BallY < BaffleY + Baffle.get_height() and BallY > BaffleY:
      BallYSpeed = -BallYSpeed
      BallY = BaffleY + Baffle.get_height()
      CollisionMusic.play()
    # 擋板左側面
    elif BallY > BaffleY and BallY < BaffleY + Baffle.get_height() and BallX > BaffleX - Ball.get_width() and BallX < BaffleX:
      BallXSpeed = -BallXSpeed
      BallX = BaffleX
      CollisionMusic.play()
    # 擋板右側面
    elif BallY > BaffleY and BallY < BaffleY + Baffle.get_height() and BallX > BaffleX + Baffle.get_width() - Ball.get_width() and BallX < BaffleX + Baffle.get_width():
      BallXSpeed = -BallXSpeed
      BallX = BaffleX + Baffle.get_width()
      CollisionMusic.play()
    if BallY > 720 - 45:
      GameResult = RunTimeStr
      GameOverMusic.play()
      return GameResult
    # 重新整理顯示
    pygame.display.update()
def GameResult(GameResult):
  # 遊戲結果背景Surface物件
  GameResultBackground = pygame.image.load('GameResultBackground.png').convert()
  # 遊戲結果引導
  ResultHint = pygame.image.load('ResultFont.png').convert_alpha()
  # 遊戲結果Font物件
  GameResultFont = pygame.font.Font('EuroBold.ttf',100)
  # 重新開始按鈕
  ReStartButton = pygame.image.load('ReStartButton.png').convert_alpha()
  # 重新開始Hover按鈕
  ReStartButtonHover = pygame.image.load('ReStartButtonHover.png').convert_alpha()
  while True:
    for event in pygame.event.get():
      if event.type == QUIT:
        exit()
      if event.type == pygame.MOUSEBUTTONDOWN and 150 <= event.pos[
        0] <= 150 + ReStartButton.get_width() and 450 <= event.pos[1] <= 450 + ReStartButton.get_height():
        ButtonMusic.play()
        return True
    # 遊戲結果背景
    Screen.blit(GameResultBackground,0))
    # 遊戲結果引導
    Screen.blit(ResultHint,(45,200))
    RunTimeSurface = GameResultFont.render(GameResult,69,0))
    Screen.blit(RunTimeSurface,(90,270))
    # 重新開始遊戲按鈕
    MouseX,MouseY = pygame.mouse.get_pos()
    if 150 <= MouseX <= 150 + ReStartButton.get_width() and 450 <= MouseY <= 450 + ReStartButton.get_height():
      Screen.blit(ReStartButtonHover,(150,450))
    else:
      Screen.blit(ReStartButton,450))
    # 遊戲結果
    pygame.display.update()
if __name__ == '__main__':
  flag = True
  while flag:
    GameResultStr = GameStart()
    if GameResultStr != '':
      flag = GameResult(GameResultStr)

執行結果:

總結

以上所述是小編給大家介紹的用python和pygame製作擋板彈球遊戲,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!