【Python游戏开发】拼图小游戏demo

devtools/2024/9/20 15:39:40/

使用mu编辑器 + pgzero编写拼图小游戏

python">import randomSIZE = 96           # 设置每张图块的大小
WIDTH = SIZE * 3    # 根据土块大小设置窗口
HEIGHT = SIZE * 3
pics = []           # 存放图块
finished  = False   # 游戏结束标识# 将前八张图块存放在pics列表中
for i in range(8):# 使用Actor()方法创建图块pic = Actor("puzzle_pic" + str(i))# 给每张图块设置索引值pic.index = ipics.append(pic)# 将图块列表pics的顺序打乱
random.shuffle(pics)# 设立每块图块的初始位置
for i in range(8):# 使用余数确认x坐标,如0、3、6余数为0,所以都在第一列pics[i].left = i % 3 * SIZE# 使用除数确认y坐标,如0、1、2除以3整数部分都为0,所以在第一行pics[i].top = i // 3 * SIZE
# 创建最后一张图块,固定放置在最后一个位置
lastpic = Actor("puzzle_pic8")
lastpic.left = 2 * SIZE
lastpic.top = 2 * SIZEdef draw():# 设置游戏背景色screen.fill((255,255,255))# 绘制图块for pic in pics:pic.draw()# 如果游戏结束,则将最后一张图块绘制进游戏if finished:lastpic.draw()# 显示结束语screen.draw.text("victory!",center = (WIDTH // 2, HEIGHT // 2),fontsize = 50, color = "red")# 鼠标点击处理
def on_mouse_down(pos):if finished:return# 获取被点击位置的坐标grid_x = pos[0] // SIZEgrid_y = pos[1] // SIZE# 检测是否存在图块thispic = get_pic(grid_x,grid_y)# 不存在,则return,不执行任何存在if thispic == None:return# 存在,则判断其相邻位置是否为空,如为空,则移动图块至空位if grid_y> 0 and get_pic(grid_x,grid_y - 1) == None:thispic.y -= SIZEreturnif grid_y< 2 and get_pic(grid_x,grid_y + 1 ) == None:thispic.y += SIZEreturnif grid_x> 0 and get_pic(grid_x - 1,grid_y) == None:thispic.x -= SIZEreturnif grid_x< 2 and get_pic(grid_x + 1,grid_y) == None:thispic.x += SIZEreturn# 通过坐标获取图块信息
def get_pic(grid_x,grid_y):# 循环遍历图块判断是否有图块在对应坐标中for pic in pics:if pic.x // SIZE == grid_x and pic.y // SIZE == grid_y:return picreturn Nonedef update():global finishedif finished:return# 遍历前八个坐标位置,判断位置上的图块是否符合需求for i in range(8):# 获取坐标位置上的图块信息pic = get_pic(i % 3 ,i// 3)# 如果不存在图块或者图块索引值不对,则returnif (pic == None or pic.index != i):return# 游戏结束finished = True# 设置胜利sounds.win.play()

代码执行,便会生成3x3拼图小游戏
在这里插入图片描述

完成拼图后
在这里插入图片描述

但是,因为是使用随机数Random无规则的打乱顺序,所以会导致游戏存在无解的情况
在这里插入图片描述

所以放弃采用random.shuffle(pics)打乱图块的方法,改为程序多次自动随机点击空图块相邻的图块,实现打乱图块效果

python"># 将图块列表pics的顺序打乱
# random.shuffle(pics)
blank_pic = [2,2]   # 初始空白图块的坐标
# 逆向打乱拼图顺序
def init_pics():global blank_picmove_list = []# 将空白图块相邻的图块位置插入列表中if blank_pic[0] > 0:move_list.append([blank_pic[0] - 1,blank_pic[1]])if blank_pic[0] < 2:move_list.append([blank_pic[0] + 1,blank_pic[1]])if blank_pic[1] > 0:move_list.append([blank_pic[0],blank_pic[1] - 1])if blank_pic[1] < 2:move_list.append([blank_pic[0],blank_pic[1] + 1])# 从列表中随机一个图块进行点击blank_pic = random.choice(move_list)on_mouse_down([blank_pic[0] * SIZE,blank_pic[1] * SIZE])

最后,根据自己的设定,循环调用init_pics方法,实现打乱效果

python">for i in range(50):init_pics()

运行结果如图,也是实现了随机打乱图块的效果,且不会出现无解的情况
在这里插入图片描述
调整优化:

  1. SUM_XSUM_Y:可设置拼图难度,生成m*n拼图
  2. random_num:设置系统打乱方块的步数
python"># 在这里写上你的代码
import random
SUM_X = 4               # 设置每行存放图块的数量
SUM_Y = 3               # 设置每列存放图块的数量
random_num = 100        # 打乱方块次数
SIZE = 96               # 设置每张图块的大小SUM_I = SUM_X * SUM_Y   # 图块总数
WIDTH = SIZE * SUM_X    # 根据土块大小设置窗口
HEIGHT = SIZE * SUM_Y
pics = []               # 存放图块
finished  = False       # 游戏结束标识blank_pic = [SUM_X - 1,SUM_Y - 1]   # 空白图块坐标# 将显示图块存放在pics列表中
for i in range(SUM_I - 1):# 使用Actor()方法创建图块pic = Actor("puzzle_pic" + str(i))# 给每张图块设置索引值pic.index = ipics.append(pic)# 设立每块图块的初始位置
for i in range(SUM_I - 1):# 使用余数确认x坐标pics[i].left = i % SUM_Y * SIZE# 使用除数确认y坐标pics[i].top = i // SUM_X * SIZE# 创建最后一张图块,固定放置在最后一个位置
lastpic = Actor("puzzle_pic8")
lastpic.left = SUM_X * SIZE
lastpic.top = SUM_Y * SIZEdef draw():# 设置游戏背景色screen.fill((255,255,255))# 绘制图块for pic in pics:pic.draw()# 如果游戏结束,则将最后一张图块绘制进游戏if finished:lastpic.draw()# 显示结束语screen.draw.text("victory!",center = (WIDTH // 2, HEIGHT // 2),fontsize = 50, color = "red")# 鼠标点击处理
def on_mouse_down(pos):if finished:return# 获取被点击位置的坐标grid_x = pos[0] // SIZEgrid_y = pos[1] // SIZE# 检测是否存在图块thispic = get_pic(grid_x,grid_y)# 不存在,则return,不执行任何存在if thispic == None:return# 存在,则判断其相邻位置是否为空,如为空,则移动图块至空位if grid_y> 0 and get_pic(grid_x,grid_y - 1) == None:thispic.y -= SIZEreturnif grid_y< (SUM_Y - 1) and get_pic(grid_x,grid_y + 1 ) == None:thispic.y += SIZEreturnif grid_x> 0 and get_pic(grid_x - 1,grid_y) == None:thispic.x -= SIZEreturnif grid_x< (SUM_X - 1) and get_pic(grid_x + 1,grid_y) == None:thispic.x += SIZEreturn# 通过坐标获取图块信息
def get_pic(grid_x,grid_y):# 循环遍历图块判断是否有图块在对应坐标中for pic in pics:if pic.x // SIZE == grid_x and pic.y // SIZE == grid_y:return picreturn Nonedef update():global finishedif finished:return# 遍历前八个坐标位置,判断位置上的图块是否符合需求for i in range(SUM_I - 1):# 获取坐标位置上的图块信息pic = get_pic(i % SUM_X ,i// SUM_Y)# 如果不存在图块或者图块索引值不对,则returnif (pic == None or pic.index != i):return# 游戏结束finished = True# 设置胜利sounds.win.play()# 逆向打乱拼图顺序
def init_pics():global blank_picmove_list = []if blank_pic[0] > 0:move_list.append([blank_pic[0] - 1,blank_pic[1]])if blank_pic[0] < SUM_X - 1:move_list.append([blank_pic[0] + 1,blank_pic[1]])if blank_pic[1] > 0:move_list.append([blank_pic[0],blank_pic[1] - 1])if blank_pic[1] < SUM_Y - 1:move_list.append([blank_pic[0],blank_pic[1] + 1])# 从列表中随机一个移动方法blank_pic = random.choice(move_list)on_mouse_down([blank_pic[0] * SIZE,blank_pic[1] * SIZE])for i in range(random_num):init_pics()

因为图块是随机打乱的,我们无法确认随机出来的图块会不会跟没打乱的图块一致,出现一进游戏就获胜的情况,但这我们可以加代码去判定,比较简单,所以就不阐述了


http://www.ppmy.cn/devtools/109415.html

相关文章

在Debian 9上安装Node.js的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 Node.js 是一个用于通用编程的 JavaScript 平台&#xff0c;允许用户快速构建网络应用程序。通过在前端和后端都使用 JavaScript&…

手机玩机常识-------诺基亚系列机型3/5/6/7/8详细的刷机教程步骤 手机参考救砖刷机教程

诺基亚手机 诺基亚&#xff08;Nokia Corporation&#xff09;&#xff0c;成立于1865年&#xff0c;是一家主要从事移动通信设备生产和相关服务的手机公司 &#xff0c;总部位于芬兰埃斯波 。从1996年开始&#xff0c;诺基亚手机连续15年占据手机市场份额第一位置&…

网络层ip协议

一.概念 ip协议主要是为了在复杂的网络环境中确定一个合适的路径来传输主机间的数据。简单来说就是用来确定主机的位置。 ip协议中的一些设备如下&#xff1a; 主机: 配有 IP 地址, 但是不进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点: 主机和路由器的统…

如何在 AWS S3 中设置跨区域复制

如何在 AWS S3 中设置跨区域复制 概述 欢迎来到雲闪世界。 Amazon Simple Storage Service (S3) 是一种可扩展的对象存储服务&#xff0c;广泛用于存储和检索数据。其主要功能之一是跨区域复制 (CRR)&#xff0c;允许跨不同的 AWS 区域自动异步复制对象。此功能对于灾难恢复、…

Python 中混淆矩阵的热图

欢迎来到雲闪世界。混淆矩阵是一种方便的方式来呈现机器学习模型所犯的错误类型。它是一个带有数字的N x N网格&#xff0c;其中 [n, m] 单元格中的值表示注释为第 n 个类被识别为第 m 个类的示例数。在本教程中&#xff0c;我将重点介绍如何创建混淆矩阵和热图。调色板将用于显…

python多进程

文章目录 1、前言2、示例3、参考 1、前言 python中使用多进程&#xff0c;可以加快代码的运行速度&#xff0c;更高效地进行相关工作。 2、示例 使用蒙特卡洛方法计算 π \pi π来进行使用多进程前后代码运行速率的对比&#xff1b; import random import multiprocessing as…

[记录]-关于js中判断某个对象中是否存在某个属性的四种方法

应用场景&#xff1a; 在使用JavaScript编程时&#xff0c;我们常常会遇到一个问题&#xff1a;如何判断某个对象中是否存在某个属性&#xff1f; 对于这个问题&#xff0c;本文给出了四种解决方法。需要注意的是&#xff0c;四种方法是有区别的&#xff0c;应用哪一种方法需要…

实例讲解电动汽车车速计算算法及Simulink建模方法

电动汽车的车速信号是一个非常重要的信号&#xff0c;在VCU软件开发中&#xff0c;车速一般需要通过采集其他控制器车速或者通过电机转速间接计算出来&#xff0c;作为仪表显示车速、限速控制、剩余续驶里程计算等使用&#xff0c;因此&#xff0c;在VCU软件开发中&#xff0c;…