Python+pyGameパズルゲーム

11699 ワード

注:以下のプログラムは本人のオリジナルで、書くのがよくなくて、もし良い提案があれば、伝言を残して知らせてください.一二訪問者を助けることができたら、幸いです.
基本的なPythonプログラミングを学びたい.
思プログラミング言語の学習は人類言語の学習と似ており、人類言語は結局言うべきであり、プログラミング言語も結局言うべきである.人間の言語は人に聞かせるが、プログラミング言語はコンピュータに聞かせる.
人間は話を学び、歯から語を学び、流暢に交流するまで、一日中真似と練習に頼っている.プログラミング言語も同じです.
プログラミング言語を勉強するのは文法をけちけちするのではないと思います.中国語の勉強の中で国語の試験を除いて病句を試験するように、私たちは普段文法を気にしないで話しています.
だから今回Python--新しいプログラミング言語を勉強して、最初から文法を勉強するのではなく、直接勉強して使うことにしました.
1時間かけてPython言語の基本構成、キーワードなどを見て、書き始めることにしました--正確には写し始めました.
プログラムを写す過程は、中国語を勉強するときに大人について話を学ぶようなものだ.
コピーしたりコピーしたりして、ゲームを話すPythonの本を実行してみました.しかし、中のゲームの多くは文字インタフェースで、最後の3、2章だけPyGameパッケージを使ってグラフィックインタフェースを開発したゲームです.
だいたいPythonとpyGameの使い方がわかったので、自分でパズルゲームを書いてみることにしました.
1.絵を描く
import pygame, sys, random
from pygame.locals import *


WINDOWWIDTH = 500
WINDOWHEIGHT = 500
BACKGROUNDCOLOR = (0, 0, 0)
FPS = 40


def terminate():
    pygame.quit()
    sys.exit()


pygame.init()
mainClock = pygame.time.Clock()
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('  ')


gameImage = pygame.image.load('pic.bmp')
gameRect = gameImage.get_rect()


timeUsed = 0
moveUsed = 0
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
    windowSurface.fill(BACKGROUNDCOLOR)
    windowSurface.blit(gameImage, gameRect)

    pygame.display.update()
    mainClock.tick(FPS)

ウィンドウのサイズが適切ではないことがわかりました.
解決策:
画像をロードし、画像のサイズに応じてウィンドウのサイズを設定します.
import pygame, sys, random
from pygame.locals import *

#     
WINDOWWIDTH = 500
WINDOWHEIGHT = 500
BACKGROUNDCOLOR = (0, 0, 0)
FPS = 40

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

#    
pygame.init()
mainClock = pygame.time.Clock()

#     
gameImage = pygame.image.load('pic.bmp')
gameRect = gameImage.get_rect()

#     
windowSurface = pygame.display.set_mode((gameRect.width, gameRect.height))
pygame.display.set_caption('  ')

#      
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
    windowSurface.fill(BACKGROUNDCOLOR)
    windowSurface.blit(gameImage, gameRect)

    pygame.display.update()
    mainClock.tick(FPS)

2.画像の分割
import pygame, sys, random
from pygame.locals import *

#     
WINDOWWIDTH = 500
WINDOWHEIGHT = 500
BACKGROUNDCOLOR = (0, 0, 0)
FPS = 40

VHNUMS = 3
CELLNUMS = VHNUMS*VHNUMS

#         
def newGameBoard():
    board = []
    for i in range(CELLNUMS):
        board.append(i)

    print(board)
    random.shuffle(board)
    print(board)
    return board
    


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

#    
pygame.init()
mainClock = pygame.time.Clock()

#     
gameImage = pygame.image.load('pic.bmp')
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)


gameBoard = newGameBoard()


cellImage = pygame.transform.chop(gameImage, (100, 100, 200, 200))


#      
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
    windowSurface.fill(BACKGROUNDCOLOR)
    windowSurface.blit(gameImage, pygame.Rect(0, 0, cellWidth, cellHeight), pygame.Rect(100, 100, cellWidth, cellHeight))
    for i in range(CELLNUMS):
        rowDst = int(i / VHNUMS)
        colDst = int(i % VHNUMS)
        rectDst = pygame.Rect(colDst*cellWidth, rowDst*cellHeight, cellWidth, cellHeight)

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

    pygame.display.update()
    mainClock.tick(FPS)

次に、空白の画像ブロックを実現し、つなぎ合わせることができるランダムな画像ブロックアルゴリズムを保証する.
ランダムスクランブルアルゴリズムは、左、右、上、下の移動を実現するアルゴリズムの後、ランダムにいくつかのステップを移動すると、このいくつかのステップの逆ステップで画像を再綴じることを保証することができる.
#         
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

分割線を描画するには:
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))

3.マウスキーボードイベントの実装
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

4.判定勝ち
#     
def isFinished(board, blackCell):
    for i in range(CELLNUMS-1):
        if board[i] != i:
            return False
    return True

5.完全なコード
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('pic.bmp')
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)