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 11

    开发工具:Pycharm

  2. 业务概述

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

    中秋拼图.gif

    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 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
    

    image.png

  3. 源码
    # -*- coding: utf-8 -*-
  4. @Time     : 2023/9/18 12:01
  5. @Author   : hyh
  6. @File     : 中秋拼图小游戏.py
  7. @Software : PyCharm ​ ​ import pygame, sys, random from pygame.locals import * ​
  8. 一些常量 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 ​ ​
  9. 退出 def terminate():    pygame.quit()    sys.exit() ​ ​
  10. 随机生成游戏盘面 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 ​ ​
  11. 若空白图像块不在最左边,则将空白块左边的块移动到空白块位置 def moveRight(board, blackCell):    if blackCell % VHNUMS == 0:        return blackCell    board[blackCell - 1], board[blackCell] = board[blackCell], board[blackCell - 1]    return blackCell - 1 ​ ​
  12. 若空白图像块不在最右边,则将空白块右边的块移动到空白块位置 def moveLeft(board, blackCell):    if blackCell % VHNUMS == VHNUMS - 1:        return blackCell    board[blackCell + 1], board[blackCell] = board[blackCell], board[blackCell + 1]    return blackCell + 1 ​ ​
  13. 若空白图像块不在最上边,则将空白块上边的块移动到空白块位置 def moveDown(board, blackCell):    if blackCell = CELLNUMS - VHNUMS:        return blackCell    board[blackCell + VHNUMS], board[blackCell] = board[blackCell], board[blackCell + VHNUMS]    return blackCell + VHNUMS ​ ​
  14. 是否完成 def isFinished(board, blackCell):    for i in range(CELLNUMS - 1):        if board[i] != i:            return False    return True ​ ​
  15. 初始化 pygame.init() mainClock = pygame.time.Clock() ​
  16. 加载图片
  17. C:Users80975Desktopimage
  18. D:EPythonWorkPygameTestimage gameImage = pygame.image.load('D:/E/PythonWork/PygameTest/image/0815.jpg') gameRect = gameImage.get_rect() ​
  19. 设置窗口,窗口的宽度和高度取决于图片的宽高 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() ​
  20. 游戏主循环 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)
  21. 打包成exe应用程序分享给好友

    1. 安装pyinstaller

    pip install pyinstaller -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
    

    image.png

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

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

    image.png

    image.png

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

    image.png