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


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

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

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

    官方活动入口

    在这里插入图片描述

    1. 引言

    1.1 编写目的

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

    1.2 术语

       1. 鼠标单击图片拼图游戏开始
    
    • 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 语言开发而成。
    
    • 1
    • 2
    • 3

    4 . 代码介绍

    4.1安装 pygame

    pip install pygame
    
    • 1

    在这里插入图片描述

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161

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

    1. 安装pyinstaller

    pip install pyinstaller
    
    • 1

    在这里插入图片描述

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

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

  • 相关阅读:
    【C++ Primer Plus】第4章 复合类型
    java-php-python-景区失物招领平台演示录像计算机毕业设计
    Neo4j 批量导入数据 从官方文档学习LOAD CSV 命令 小白可食用版
    面试三(多进程调用同一个动态库问题)
    压力测试-JMeter安装、入门、结果分析
    【数据传输】进程内业务拆分的数据传输,可用于发布订阅或者传递通知。
    逐秒追加带序号输入当前时间:fgets fputs sprintf fprintf
    基于SSM实现智慧幼儿园信息管理系统
    27.Tornado_peewee_数据查询
    达梦数据库指定索引
  • 原文地址:https://blog.csdn.net/u014096024/article/details/126766156