使用 Python 制作翻牌游戏 (记忆游戏)2025 年 1 月 11 日 | 阅读 9 分钟 每个人都可以通过玩翻转图块游戏来测试自己的记忆力。在这个集合中,每个数字或图形都有一对图块,数量是偶数。我们必须翻转图块,以便能够看到它们,因为它们是背面朝上的。一次翻转两个图块,如果匹配,则将它们取出。如果不匹配,它们会被翻转过来并放回原位。直到所有图块都匹配并消除,我们才停止。 介绍游戏现在我们的网格中的图块可以显示为正面朝上或背面朝上。但是我们无法直接参与游戏。这里提醒一下游戏如何进行:
翻转可点击图块我们现在有一个程序,它只绘制图块网格然后停止。随着时间的推移,我们希望我们的程序能够生成各种图像。如果玩家一切顺利,它将首先绘制背面朝上的图块,然后是已点击的图块以及胜利画面。 将我们所有的绘图代码移到这个语言的 draw() 函数是下一步的逻辑。在应用程序运行时,计算机将继续执行 draw(),导致图块根据它们是正面朝上还是背面朝下而继续绘制。 现在让我们将其中一些图块翻到正面!玩家必须点击一个图块才能翻转它。在这个语言项目中,我们可以编写一个 mouseClicked() 函数来响应鼠标点击,并且计算机将在每次鼠标点击时运行该代码。 当我们的应用程序检测到玩家在某个地方点击时,我们希望使用 mouseX 和 mouseY 来检测他们是否点击了一个图块。让我们先给 Tile 添加一个 isUnderMouse() 方法,如果给定的 x 和 y在图块区域内,则该方法返回 true。 由于我们创建图块的方式,图块的 x 和 y 对应于图块的左上角,因此我们应该仅在提供的 x 介于 this.x 和 this.x + this.size 之间,并且提供的 y 介于 this.y 和 this.y + this.size 之间时返回 true。 既然我们现在有了这个方法,我们就可以在 mouseClicked() 中使用for 循环检查每个图块是否在 mouseX 和 mouseY 范围内。如果是,那么我们将图块的 isFaceUp() 属性设置为 true。 限制卡片翻转我们应该已经开发了玩家翻转图块的功能,但是我们忽略了一个关键限制:- 用户一次不应翻转超过两个图块。 需要以某种方式记录翻转的图块数量。一种简单的方法是使用一个名为 numFlipped 的全局变量,每次玩家翻转一张卡片时,我们就将其递增。如果 numFlipped 小于 2 且图块尚未正面朝上,我们才翻转它。 延迟图块翻转因此,翻转两个图块的逻辑已经完成。接下来呢?让我们再次回顾一下规则: 如果图块具有相同的图像,则它们保持正面朝上。否则,过一会儿,图块会翻转回来。 如果我们不能简单地寻找新匹配项,那么测试第一部分将很困难,因此我们将首先开发第二部分,该部分自动将图块翻转回来。 通过将 isFaceUp 设置为 false,我们知道如何反转图块的方向,但过一段时间后会怎样呢?在不同的语言和环境中,延迟代码执行有多种形式,我们需要弄清楚如何在此语言中实现它。为了确定延迟期是否已过,我们需要一种机制来跟踪时间。我们还需要一种方法来在延迟期结束后调用代码。我们的建议是:
事实上,这是一个不需要编写太多代码的绝佳解决方案。我们可以使用 loop 和 noLoop 方法来确保 draw 代码仅在存在延迟时才被调用,以提高性能。以下是我们解释的所有内容: 检查匹配项如果我们能够匹配任何图块,当它们被翻转回去时,我们可能会感到失望,因为,嘿,我们成功了!所以是时候将这个游戏规则付诸实践了。 当两个图块完美匹配时,它们应该保持正面朝上。 这意味着每当有两个翻转的图块时,以及在用户设置延迟之前,我们都应该寻找匹配的图块。其伪代码如下: 我们如何确定两个图块是否朝向同一方向?我们已经对此进行了检查(numFlipped === 2)。首先,我们需要一种方法来获取正面朝上的两个图块。我们如何找到它们? 每次,我们可以遍历我们的数组来识别所有 isFaceUp 属性设置为 true 的图块,然后将它们存储到另一个数组中。 让我们采取捷径,始终将翻转的图块保存在数组中以方便使用。通过这样做,每次玩家翻转一个图块时,我们都避免了循环遍历整个图块数组。 我们可以先用数组替换 numFlipped,然后在 numFlipped 之前使用过的地方使用 flippedTiles.length。我们的 mouseClicked() 函数如下所示: 现在,要确定 flippedTiles 数组中的两个图块是否具有相同的面,还需要进一步研究。那么面属性是什么?它是一个对象,由于变量在计算机内存中指向同一个位置,因此匹配图块的面实际上应该指向完全相同的项。这是因为每个图像对象只创建了一次(例如,getImage("avatars/old-spice-man")),然后该对象被两次推送到 faces 数组中。 如果使用引用对象的两个变量,并且这两个变量都对应于内存中的同一对象,那么相等运算符,至少在 JavaScript 中,将返回 true。因此,我们可以通过对每个图块的面属性使用相等运算符来进行快速检查。 既然我们确定它们匹配,我们现在必须让图块保持正面朝上。它们现在都会在一段时间延迟后翻转过来。在这种情况下,我们也可以选择不设置动画,但我们不能仅依赖它,因为后续回合会有动画。 我们需要一种方法来表示:“嘿,当我们把它们全部翻回来时,我们不应该翻转这些特定的图块。”这是一个布尔属性的好应用!让我们将 isMatch 属性添加到 Tile 构造函数中,然后在该if 块内部,将 isMatch 属性设置为 true。它也显示在下面: 现在,我们可以根据该属性决定是带有延迟还是不带延迟地翻转图块。 完整代码输出 ![]() 下一主题Python Curl |
最小堆是一种满足堆属性的数据结构,该属性规定每个节点的值小于或等于其子节点。这意味着堆的最小值始终存储在根部。以下是该算法的...
阅读 8 分钟
创建图形用户界面 (GUI) 应用程序的奇妙之处在于,我们可以按照我们想要的方式自定义它们。有各种可供定制的功能,从文本字体到背景颜色。在接下来的教程中,我们将学习...
阅读 15 分钟
Paul Viola 和 Michael Jones 提出了,它被高效地用于对象检测。该算法基于机器学习方法,其中使用大量图像(正面或负面)来训练分类器。正面图像:正面图像是一种类型的图像...
阅读 4 分钟
类方法、静态方法和实例方法之间的区别 在本教程中,我们将学习类方法、静态方法和实例方法。这些方法是 Python 中面向对象编程的核心概念。每个 Python 爱好者都应该熟悉这些方法以及如何...
5 分钟阅读
线性回归是一种基于监督学习构建的机器学习算法。它执行回归操作。回归使用独立变量来训练模型并查找预测值,它主要用于确定变量和预测之间的关系。回归模型多种多样...
阅读 8 分钟
众所周知,互联网上存在着海量的文本数据。但是,我们中的大多数人可能不熟悉如何开始处理这些文本数据的方法。此外,我们也知道这是一个棘手的问题...
阅读 10 分钟
我们肯定都多次听说 Python 是一种动态类型编程语言,但并非所有人都知道我们也可以将 Python 用于 Web 开发目的。是的,没错,我们可以将 Python 用于 Web 开发,并且有...
阅读9分钟
Python 是当今开发人员使用最广泛的编程语言之一。它由 Guido Van Rossum 于 1991 年创建,自成立以来,它一直是最受欢迎的语言之一,与 C++、Java 等并驾齐驱。Python 在我们的...取得了巨大领先。
阅读 6 分钟
JSON Web Token 是一种简洁、URL 安全的机制,用于表示需要在两方之间交换的声明 (JWT)。它经常用于在计算机之间传输数据和安全地验证用户。我们将在本文中介绍 JWT 的基础知识以及如何在 Python 中使用它们。
阅读 4 分钟
在本教程中,我们将学习如何在我们的 PyQt5 应用程序中添加和使用表格。表格是一种行列数据布局,常用于数据分析、研究和交流。QTableWidget 允许我们向我们的 PyQt 添加一个或多个表格...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India