您的位置:首页 > 财经 > 产业 > 【Python游戏开发】拼图小游戏demo

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

2024/12/23 10:26:27 来源:https://blog.csdn.net/qq_40878316/article/details/142027726  浏览:    关键词:【Python游戏开发】拼图小游戏demo

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

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)打乱图块的方法,改为程序多次自动随机点击空图块相邻的图块,实现打乱图块效果

# 将图块列表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方法,实现打乱效果

for i in range(50):init_pics()

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

  1. SUM_XSUM_Y:可设置拼图难度,生成m*n拼图
  2. random_num:设置系统打乱方块的步数
# 在这里写上你的代码
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()

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com