首頁 > 軟體

教你使用Python的pygame模組實現拼圖遊戲

2022-07-05 14:03:57

pygame介紹

Python Pygame 是一款專門為開發和設計 2D 電子遊戲而生的軟體包,它支 Windows、Linux、Mac OS 等作業系統,具有良好的跨平臺性。Pygame 由 Pete Shinners 於 2000 年開發而成,是一款免費、開源的的軟體包,因此您可以放心地使用它來開發遊戲,不用擔心有任何費用產生。

Pygame 在 SDL(Simple DirectMedia Layer,使用 C語言編寫的多媒體開發庫) 的基礎上開發而成,它提供了諸多操作模組,比如影象模組(image)、聲音模組(mixer)、輸入/輸出(滑鼠、鍵盤、顯示屏)模組等。相比於開發 3D 遊戲而言,Pygame 更擅長開發 2D 遊戲,比如於飛機大戰、貪吃蛇、掃雷等遊戲。

安裝pygame

pip install pygame

pygame常用模組

  • pygame.cdrom 存取光碟機
  • pygame.cursors 載入遊標
  • pygame.display 存取顯示裝置
  • pygame.draw 繪製形狀、線和點
  • pygame.event 管理事件
  • pygame.font 使用字型
  • pygame.image 載入和儲存圖片
  • pygame.joystick 使用遊戲手柄或者類似的東西
  • pygame.key 讀取鍵盤按鍵
  • pygame.mixer 聲音
  • pygame.mouse 滑鼠
  • pygame.movie 播放視訊
  • pygame.music 播放音訊
  • pygame.overlay 存取高階視訊疊加
  • pygame.rect 管理矩形區域
  • pygame.scrap 本地剪貼簿存取
  • pygame.sndarray 操作聲音資料
  • pygame.sprite 操作移動影象
  • pygame.surface 管理影象和螢幕
  • pygame.surfarray 管理點陣影象資料
  • pygame.time 管理時間和幀資訊
  • pygame.transform 縮放和移動影象

pygame入門案例

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 320, 240  # 設定視窗大小
screen = pygame.display.set_mode(size)  # 顯示視窗

while True:  # 死迴圈確保視窗一直顯示
    for event in pygame.event.get():  # 遍歷所有事件
        if event.type == pygame.QUIT:  # 如果單擊關閉視窗,則退出
            sys.exit()

pygame.quit()  # 退出pygame

pygame實現拼圖遊戲

import pygame, sys, random
from pygame.locals import *

# 一些常數
WINDOWWIDTH = 500
WINDOWHEIGHT = 500
BACKGROUNDCOLOR = (255, 255, 255)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
FPS = 40

VHNUMS = 3
CELLNUMS = VHNUMS * VHNUMS
MAXRANDTIME = 100


# 退出
def terminate():
    pygame.quit()
    sys.exit()


# 隨機生成遊戲盤面
def newGameBoard():
    board = []
    for i in range(CELLNUMS):
        board.append(i)
    blackCell = CELLNUMS - 1
    board[blackCell] = -1

    for i in range(MAXRANDTIME):
        direction = random.randint(0, 3)
        if (direction == 0):
            blackCell = moveLeft(board, blackCell)
        elif (direction == 1):
            blackCell = moveRight(board, blackCell)
        elif (direction == 2):
            blackCell = moveUp(board, blackCell)
        elif (direction == 3):
            blackCell = moveDown(board, blackCell)
    return board, blackCell


# 若空白影象塊不在最左邊,則將空白塊左邊的塊移動到空白塊位置
def moveRight(board, blackCell):
    if blackCell % VHNUMS == 0:
        return blackCell
    board[blackCell - 1], board[blackCell] = board[blackCell], board[blackCell - 1]
    return blackCell - 1


# 若空白影象塊不在最右邊,則將空白塊右邊的塊移動到空白塊位置
def moveLeft(board, blackCell):
    if blackCell % VHNUMS == VHNUMS - 1:
        return blackCell
    board[blackCell + 1], board[blackCell] = board[blackCell], board[blackCell + 1]
    return blackCell + 1


# 若空白影象塊不在最上邊,則將空白塊上邊的塊移動到空白塊位置
def moveDown(board, blackCell):
    if blackCell < VHNUMS:
        return blackCell
    board[blackCell - VHNUMS], board[blackCell] = board[blackCell], board[blackCell - VHNUMS]
    return blackCell - VHNUMS


# 若空白影象塊不在最下邊,則將空白塊下邊的塊移動到空白塊位置
def moveUp(board, blackCell):
    if blackCell >= CELLNUMS - VHNUMS:
        return blackCell
    board[blackCell + VHNUMS], board[blackCell] = board[blackCell], board[blackCell + VHNUMS]
    return blackCell + VHNUMS


# 是否完成
def isFinished(board, blackCell):
    for i in range(CELLNUMS - 1):
        if board[i] != i:
            return False
    return True


# 初始化
pygame.init()
mainClock = pygame.time.Clock()

# 載入圖片
gameImage = pygame.image.load('1.jpg')
gameRect = gameImage.get_rect()

# 設定視窗,視窗的寬度和高度取決於圖片的寬高
windowSurface = pygame.display.set_mode((gameRect.width, gameRect.height))
pygame.display.set_caption('拼圖')

cellWidth = int(gameRect.width / VHNUMS)
cellHeight = int(gameRect.height / VHNUMS)

finish = False

gameBoard, blackCell = newGameBoard()

# 遊戲主迴圈
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
        if finish:
            continue
        if event.type == KEYDOWN:
            if event.key == K_LEFT or event.key == ord('a'):
                blackCell = moveLeft(gameBoard, blackCell)
            if event.key == K_RIGHT or event.key == ord('d'):
                blackCell = moveRight(gameBoard, blackCell)
            if event.key == K_UP or event.key == ord('w'):
                blackCell = moveUp(gameBoard, blackCell)
            if event.key == K_DOWN or event.key == ord('s'):
                blackCell = moveDown(gameBoard, blackCell)
        if event.type == MOUSEBUTTONDOWN and event.button == 1:
            x, y = pygame.mouse.get_pos()
            col = int(x / cellWidth)
            row = int(y / cellHeight)
            index = col + row * VHNUMS
            if (
                    index == blackCell - 1 or index == blackCell + 1 or index == blackCell - VHNUMS or index == blackCell + VHNUMS):
                gameBoard[blackCell], gameBoard[index] = gameBoard[index], gameBoard[blackCell]
                blackCell = index

    if (isFinished(gameBoard, blackCell)):
        gameBoard[blackCell] = CELLNUMS - 1
        finish = True

    windowSurface.fill(BACKGROUNDCOLOR)

    for i in range(CELLNUMS):
        rowDst = int(i / VHNUMS)
        colDst = int(i % VHNUMS)
        rectDst = pygame.Rect(colDst * cellWidth, rowDst * cellHeight, cellWidth, cellHeight)

        if gameBoard[i] == -1:
            continue

        rowArea = int(gameBoard[i] / VHNUMS)
        colArea = int(gameBoard[i] % VHNUMS)
        rectArea = pygame.Rect(colArea * cellWidth, rowArea * cellHeight, cellWidth, cellHeight)
        windowSurface.blit(gameImage, rectDst, rectArea)

    for i in range(VHNUMS + 1):
        pygame.draw.line(windowSurface, BLACK, (i * cellWidth, 0), (i * cellWidth, gameRect.height))
    for i in range(VHNUMS + 1):
        pygame.draw.line(windowSurface, BLACK, (0, i * cellHeight), (gameRect.width, i * cellHeight))

    pygame.display.update()

    mainClock.tick(FPS)

總結

到此這篇關於使用Python的pygame模組實現拼圖遊戲的文章就介紹到這了,更多相關Python pygame實現拼圖遊戲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com