Python程序员中秋节用Python pygame制作拼图游戏(附源码:5源码)

Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)

又是一年中秋至一花好月 圆夜,佳文当共鉴。Python+ pygame制作拼图小游戏;

制作一个自己的拼图小游戏,看看几步可以观赏到月亮。

官方活动入口

文章目录

  • 1. 引言
  • 1.1 编写目的
  • 1.2 术语
  • 1.3 项目开发环境
  • 2. 业务概述
  • 3 pygame 简单介绍
  • 4 . 代码介绍
  • 4.1安装 pygame
  • 5. 源码
  • 6. 打包成exe应用程序分享给好友
  • 1. 引言

    1.1 编写目的

    ​ 本文档是对Python语言制作拼图小游戏界面功能需求进行分析归纳,作为软件开发项目的需求标准

    1.2 术语

       1. 鼠标单击图片拼图游戏开始
    

    1.3 项目开发环境

    开发语言:python+pygame

    开发环境:windows

    开发工具:Pycharm

    2. 业务概述

    ​ 疫情原因大多数漂泊在外的码农么都回不了家了,制作一个自己的拼图小游戏,看看几步可以观赏到月亮。

    3 pygame 简单介绍

    Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)基础上开发而来,其目的是取代 PySDL。

    Pygame 可以看做是对 SDL 的封装,在 SDL 库基础上提供了各种 Python 的 API接口。目前 SDL 主要用于多媒体领域,比如开发游戏、模拟器、媒体播放器等。

    通过 Pygame 我们能够创建各种各样的游戏和多媒体程序,但相比于开发大型 3D 游戏来说,它更擅长与开发 2D 游戏,比如扫雷、纸牌游戏、贪吃蛇、超级马里奥、飞机大战等,如果是 3D 游戏,可以选择一些功能更为全面的 Python 游戏开发库,比如 Panda3D(迪士尼开发的3D游戏引擎),PyOgre(Ogre 3D渲染引擎)等。
    
    Python 作为一门解释型语言并不适合开发大型的 3D 游戏,但 Python 通过对其他语言的接口封装,使自身具备了开发大型 3D 游戏的能力,例如 Panda3D 的底层是用 C++ 语言编写的。一些较为知名的 3D 游戏,比如魔兽世界、文明帝国4、战地风云2,这些游戏都是使用 Python 语言开发的,而国内较为知名的“阴阳师”手游,也是由 Python 语言开发而成。
    

    4 . 代码介绍

    4.1安装 pygame

    pip install pygame
    

    5. 源码

    # -*- coding: utf-8 -*-
    # @Time     : 2022-09-08 14:03
    # @Author   : hyh
    # @File     : 中秋拼图.py
    # @Software : PyCharm
    
    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('C:/Users/Administrator/Desktop/csdn/image/12.jpg')
    gameRect = gameImage.get_rect()
    
    # 设置窗口,窗口的宽度和高度取决于图片的宽高
    windowSurface = pygame.display.set_mode((gameRect.width, gameRect.height))
    pygame.display.set_caption('python拼图中秋快乐-度假的鱼')
    
    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)
    

    6. 打包成exe应用程序分享给好友

    1. 安装pyinstaller

    pip install pyinstaller
    

    2. 直接cmd切换到这个脚本的目录下执行命令:

    pyinstaller -F 中秋活动.py
    
    -F参数表示覆盖打包,这样在打包时,不管我们打包几次,都是最新的,这个记住就行,固定命令。
    

    3. 双击exe就可以启动了哈 来试试最快几步可以观赏到圆月

    代码中的源图片可以保存下载

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python程序员中秋节用Python pygame制作拼图游戏(附源码:5源码)

    发表评论