网络编程
位置:首页>> 网络编程>> Python编程>> 教你使用Python的pygame模块实现拼图游戏

教你使用Python的pygame模块实现拼图游戏

作者:飞扬青春88  发布时间:2022-06-28 03:20:20 

标签:pygame,拼图,游戏

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)

来源:https://blog.csdn.net/qq_23488347/article/details/123115713

0
投稿

猜你喜欢

  • 这个分页使用的是0游标,也就是Rs.Open Sql,Conn,0,1。但是感觉也快不了多少,10万条数据的分页时间300多豪秒之间。代码如
  • 最近使用工作需要,使用了Navicat8.2版本,发现备份数据都是默认存储在C盘,这个就比较郁闷了。重做系统忘记转移了。那不就死定了?找了一
  • 一、摘要Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。
  • 先来看看基本的定义:channel是Go语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程
  • 许多人在编写程序的时候因为贪图方便或不小心使用到程式的保留字,有时明明程序没有错,就是无法正确执行。您知道有哪些常见的保留字吗? 下面的都是
  • 昨天有人在群里问图1的边框效果是否能实现。 边框效果图有人给出答案,需要嵌套一个元素实现。我当时粗粗写了个测试页面,但是时间太晚了,也没有细
  • 脚本1:这两天用python写了一个删除指定目录下过期时间的脚本。也可能是我初学python,对python还不够熟习,总觉得这个脚本用sh
  • 昨天在书友会上讨论信息分类和方法,有位朋友问:“大家现在讨论的还是几年前那套web2.0的东西,有没有一些新的东西可以分享?”我当时确实感觉
  • 前言近来chatGPT挺火的,也试玩了一下,确实挺有意思。这里记录一下在Python中如何去使用chatGPT。本篇文章的实现100%基于
  • 大家好,我是辣条。曾经有一个真挚的机会,摆在我面前,但是我没有珍惜,等到失去的时候才后悔莫及,尘世间最痛苦的事莫过于此,如果老天可以再给我一
  • 关于作者 王丹丹 , IBM 中国系统与技术中心软件工程师,自从 2006 年加入 IBM,一直从事 Web 系统设计和开发工作,有五年 P
  • 一、爬山法简介爬山法(climbing method)是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。 假定所
  • 1969年8月8日,在北京协和医院降生了一个漂亮的小女孩。接生的阿姨说,她的声音这么大,好象想要全世界的人都听到。后来,她的父亲为她取了一个
  • 数据类型:float — 浮点数可以精确到小数点后面15位int — 整型可以无限 * ool — 非零为true,零为falselist —
  •  页面加载loading效果, 这个挺好玩的!用setTimeout实现的!可以和服务端整合弄一些生成HTML或者上传文件等应用!
  • 前不久有个正要毕业的网友给我发邮件,他毕业设计需要实现锁屏的效果,但是他没有能看懂我之前发布的对话框源码,他问能不能把锁屏相关代码说明下,我
  • golang 1.7版本中context库被很多标准库的模块所使用,比如net/http和os的一些模块中,利用这些原生模块,我们就不需要自
  • 自去年以来,我们正在开发区块链(Blockchain)业务。最近使用过Ethereum并使用PHP,所以我想我们应该聊聊这个话题。这里有个前
  • 安装使用pip install XlsxWriter来安装,Xlsxwriter用来创建excel表格,功能很强大,下面具体介绍:1.简单使
  • Python 2.x 很快就要 失去官方支持 了,尽管如此,从 Python 2 迁移到 Python 3 却并没有想象中那么难。我在上周用
手机版 网络编程 asp之家 www.aspxhome.com