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

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

import random

SIZE = 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 = i
    pics.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 * SIZE

def 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] // SIZE
    grid_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 -= SIZE
        return
    if grid_y< 2 and get_pic(grid_x,grid_y + 1 ) == None:
        thispic.y += SIZE
        return
    if grid_x> 0 and get_pic(grid_x - 1,grid_y) == None:
        thispic.x -= SIZE
        return
    if grid_x< 2 and get_pic(grid_x + 1,grid_y) == None:
        thispic.x += SIZE
        return

# 通过坐标获取图块信息
def get_pic(grid_x,grid_y):
    # 循环遍历图块判断是否有图块在对应坐标中
    for pic in pics:
        if pic.x // SIZE == grid_x and pic.y // SIZE == grid_y:
           return pic
    return None

def update():
    global finished
    if finished:
        return
    # 遍历前八个坐标位置,判断位置上的图块是否符合需求
    for i in range(8):
        # 获取坐标位置上的图块信息
        pic = get_pic(i % 3 ,i// 3)
        # 如果不存在图块或者图块索引值不对,则return
        if (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_pic
    move_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 = i
    pics.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 * SIZE

def 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] // SIZE
    grid_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 -= SIZE
        return
    if grid_y< (SUM_Y - 1) and get_pic(grid_x,grid_y + 1 ) == None:
        thispic.y += SIZE
        return
    if grid_x> 0 and get_pic(grid_x - 1,grid_y) == None:
        thispic.x -= SIZE
        return
    if grid_x< (SUM_X - 1) and get_pic(grid_x + 1,grid_y) == None:
        thispic.x += SIZE
        return

# 通过坐标获取图块信息
def get_pic(grid_x,grid_y):
    # 循环遍历图块判断是否有图块在对应坐标中
    for pic in pics:
        if pic.x // SIZE == grid_x and pic.y // SIZE == grid_y:
           return pic
    return None

def update():
    global finished
    if finished:
        return
    # 遍历前八个坐标位置,判断位置上的图块是否符合需求
    for i in range(SUM_I - 1):
        # 获取坐标位置上的图块信息
        pic = get_pic(i % SUM_X ,i// SUM_Y)
        # 如果不存在图块或者图块索引值不对,则return
        if (pic == None or pic.index != i):
            return
    # 游戏结束
    finished = True
    # 设置胜利
    sounds.win.play()
    
# 逆向打乱拼图顺序
def init_pics():
    global blank_pic
    move_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.mfbz.cn/a/873363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

009.Python爬虫系列_urllib模块案例

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

传统CV算法——基于Opencv的多目标追踪算法

基于 OpenCV 的跟踪算法有多种&#xff0c;每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法&#xff1a; 1. BOOSTING 跟踪器 描述&#xff1a;基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法&#xff0c;使用的是基于弱分类器的强…

php转职golang第二期

以下是一份简单的 Go 基本语法笔记&#xff1a; 变量与常量&#xff1a; • var 声明变量。• const 声明常量。数据类型&#xff1a; • 整型、浮点型、布尔型、字符串型等。流程控制&#xff1a; • if-else 语句。• for 循环。函数&#xff1a; • 定义和调用函数。数…

Linux-【组管理、权限管理、定时任务调度】

目录 前言 Linux组基本介绍 文件/目录 所有者 查看文件 所有者 修改文件所有者 文件/目录 所在组 修改文件/目录 所在组 其它组 改变用户所在组 权限的基本介绍 rwx权限 rwx作用到文件 rwx作用到目录 修改权限 第一种方式&#xff1a;、-、变更权限 第二种方式…

系统编程--线程

这里写目录标题 线程概念什么是线程简介图解 内核原理图解 线程共享资源与非共享资源共享资源非共享资源 线程优缺点 线程控制原语pthread_self、pthread_create简介代码总结 循环创建多个子线程错误代码 线程间全局变量共享pthread_exit简介代码 一级目录二级目录二级目录二级…

可持久化Trie详解,最大异或和,k大异或和

零、碎碎念 打比赛没遇上可持久化Trie&#xff0c;做个CMU 15-445的project0&#xff0c;上来就碰上了…… 关于Trie详见&#xff1a;[Trie树/字典树的原理及实现C/C]_trie字典树原理-CSDN博客 一、可持久化Trie 1.1 基本思想 可持久化Trie和可持久化线段树类似&#xff0c…

白小白为波司登新品创作歌曲《登峰之路》,穿越风雨守护前行者

随着天气渐凉&#xff0c;波司登品牌推出全新新品——轻薄羽绒叠变系列&#xff0c;作为波司登品牌的新品推荐官&#xff0c;歌手白小白为波司登创作并演唱《轻薄羽绒叠变》系列主题曲《登峰之路》。歌曲中&#xff0c;白小白以激昂澎湃&#xff0c;明快有力的旋律以及深情又充…

[数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;17318 标注数量(xml文件个数)&#xff1a;17318 标注数量(txt文件个数)&#xff1a;17318 标…

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果&#xff0c;效果如下&#xff1a;Unity URP遮挡高亮 实现步骤 创建层级&#xff0c;为需要显示高亮效果的物体添加层级&#xff0c;比如Player 创建一个材质球&#xff0c;也就是高亮效果显示的材质球找到Universal Render…

react项目搭建、基础知识

前言 教学内容来源于黑马 黑马程序员前端React18入门到实战视频教程&#xff0c;从reacthooks核心基础到企业级项目开发实战 项目搭建 创建项目 pnpm create vite选择框架 选择语言和构建 安装依赖并运行 pnpm install pnpm run dev运行成功 基础知识 文件 main…

极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”

数据的流通使用是创新的动力&#xff0c;但安全和合规是不可逾越的底线。企业如何在这三者之间找到平衡点&#xff1f; 极盾科技&#xff0c;助力某金融租赁机构&#xff0c;基于极盾觅踪构建应用数据动态脱敏系统&#xff0c;实现10&#xff0b;核心应用系统的统一管理&#x…

磁电偶极子天线学习1 一种60GHz 宽带圆极化口径耦合磁电偶极子天线阵列

摘要&#xff1a; 一种新型的圆极化口径耦合天线被提出。这种圆极化磁电偶极子天线由刻蚀在短路基片集成波导的一部分的宽臂上&#xff0c;并且很容易被集成基片。在工作频段内实现了宽于28.8%的阻抗带宽和宽带3-dB的25.9%的轴比和的增益。此外&#xff0c;因为圆极化辐射由两个…

ModuleNotFoundError: No module named ‘mmcv.transforms‘

不得已的解决方法&#xff1a; mmcv升级到2.0.0即可解决 升级后自然又面临一系列不兼容问题&#xff01; 官方文档查漏补缺

HNU-2023电路与电子学-实验3

写在前面&#xff1a; 本次实验是完成cpu设计的剩余部分&#xff0c;整体难度比上一次要小&#xff0c;细心完成就能顺利通过全部测评 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能&#xff0c;设计 8 重 3-1 多路复用器。 3.分析模型机的功能…

基于python的Selenium webdriver环境搭建(笔记)

一、PyCharm安装配置Selenium环境 本文使用环境&#xff1a;windows11、Python 3.8.1、PyCharm 2019.3.3、Selenium 3.141.0 测试开发环境搭建综述 安装python和pycharm安装浏览器安装selenium安装浏览器驱动测试环境是否正确 这里我们直接从第三步开始 1.1 Seleium安装…

Python Flask_APScheduler定时任务的正确(最佳)使用

描述 APScheduler基于Quartz的一个Python定时任务框架&#xff0c;实现了Quartz的所有功能。最近使用Flask框架使用Flask_APScheduler来做定时任务&#xff0c;在使用过程当中也遇到很多问题&#xff0c;例如在定时任务调用的方法中需要用到flask的app.app_context()时&#…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

一个好用的Maven依赖冲突解决插件:Maven Helper

在项目开发&#xff0c;或项目Maven需要新增依赖、项目依赖组件升级时&#xff0c;经常会出现添加后&#xff0c;因为各个模块中有相同的依赖、不同的版本而导致依赖冲突&#xff0c;从而导致项目启动不起来&#xff0c;这种冲突非常恶心&#xff0c;因为是传递依赖所以会看不出…

vulhub ThinkPHP5.0.23远程代码执行漏洞

1.在vulhub打开环境 进入环境存在的文件 docker-compose up -d 2.浏览器访问环境 3.查看是否存在漏洞 /index.php?scaptcha 页面报错说明有可能存在 4.使用hackbar插件发送post请求 _method__construct&filter[]system&methodget&server[REQUEST_METHOD]dir…