魔方游戏(附游戏开源代码)

2023-11-05

这个魔方游戏的前期的实现参考了许多教程,但全部代码逻辑都是本人写的(借鉴了的都会给出原贴链接),只讲实现的思路。

已完成:

魔方的转动和魔方的动画效果,支持魔方的cfop全部公式,按按钮可转动魔方

按键盘上的alt键可用移动鼠标360无死角观察魔方

魔方中心块加了转动提示符,提示魔方是须时针转还是逆时针旋转,双击转动提示符可快速将其设为F面

魔方默认为须时针转动,按键盘上的ctrl键,可切换魔方的转动类型和提示符类型为逆时针旋转

一建打乱,魔方状态保存和复原、已支持了检测魔方的还原情况,分为魔方已还原、白色底部两层和黄色顶层翻色已完成(还有类似5种)、白色底部两层(类似5种)、白色底部十字架(类似5种)

魔方cfop公式检测与还原算法已完成(原创的),实现恩路已完成,详情请看:(14条消息) 魔方CFOP公式匹配算法_qq_39858654的博客-CSDN博客

测试图:

魔方游戏转动思路最初来源于b站的一个视频:萌新学unity可以做一个魔方玩吗?

给我提供了一个很好的思路,我要做的是一个三阶魔方,魔方的转动就是最大的问题,视频中大佬思路是:

1.先摆放27个方块形成一个魔方,然后用6个较薄的正方体作为魔方的控制器,分别置于魔方的六个面,每一个魔方控制器都与9个方块进行触碰。

2.当魔方某个面要进行旋转的时候,相当于选择了某个魔方控制器,然后被选中的魔方控制器去检测与自己产生触碰的物体,将其变成自己的子物体,控制器再去旋转,就完成对魔方某个面的旋转。

3.若选择了某一个魔方控制器,那么剩余的5个魔方控制器都不能有子物体,若有则要将之前的子物体释放,从而避免所形成的魔方控制器得到的方块面不完整。

虽然这种思路可行,但是有个很大缺点,只能对魔方的某个面进行旋转,当我想对魔方的中间进行(E、M、S)旋转时,它做不到,这个就涉及到unity触碰的判断机制:

当A物体与B物体相互触碰,若C物体去触碰A物体,unity会认为C物体触碰到了A物体和B物体。

打一个比较恰当的比喻,就是两个人触电了,你不管摸哪一个都会触电。

如果我用上述的思路,对魔方进行E、M、S的任意一个中间旋转,旋转的都是整个魔方,而不是中间块!

所以想让27个小方块形成的魔方可以随意的转动,第一个要解决的问题是:如何生成控制器?

我想出的方式是用三维坐标来判断,事实证明这种方法很有效果,感觉不但可以用于三阶,还可以用于4阶、5阶等魔方游戏的控制器判断。

首先我让三阶魔方的轴心置于(0,0,0),白色为底面,则会发现一个这样一个规律:

(a,a,-1)F         (1,a,a)R        (a,1,a)U

(a,a,1)B          (-1,a,a)L        (a,-1,a)D

若要判断F面的方块,只需让27个方块分别一下判断三维坐标的z轴是否等于-1,得到是9个符合条件的方块。

(a,0,a) E        (0,a,a) M        (a,0,a) S

若要判断E面的方块,只需让27个方块分别一下判断三维坐标的y轴是否等于0,得到是9个符合条件的中间方块。

f=S(条件)+ F(条件)        r=M(条件)+R(条件)       u=E(条件)+U(条件)

b=S(条件)+ B(条件)       l=M(条件)+L(条件)        d=E(条件)+D(条件)

若要判断f面的方块,只需让27个方块分别一下判断三维坐标的y轴是否等于0或z轴是否等于-1,得到是18个符合条件的方块。

实现后发现了一个小问题,就是旋转后魔方的坐标会有一点小误差,不会是刚等于1或0,有可能是1.001或0.0082等,所以判断前要用Mathf.Round()进行误差的去除,才能得到正确的方块数量,不然转着转着,魔方就会出现方块丢失的情况。

魔方转动是整个游戏的最核心部分,实现步骤:

1、27个魔方方块的创建,主要参考的是:Unity教程 | 手把手教你拼一个3D“魔方”,生成的只是一个模型并不能动。

2、12个魔方控制器创建,有6个面控制器和6个中心块控制器,用于控制27个方块。

3、定义了18个按钮,用一个脚本初始化了,主要参考的是:Unity:使用数组管理多个Button

4、魔方旋转动画的实现:

  1.用的是四元数插值实现的魔方动画,避免了万向锁问题,但四元数转动只转一次就没了,那就需要保存转动数值且要保持角度的连贯性,完美解决的方法是角度叠加法(我原创的)。

角度叠加法:先定义一个旋转的初始方向,顺时针转则加90,逆时针转减90,角度限制在-360度至360度之间,可以这样理解这旋转原理,记录下了上一次的角度,顺时针转加上90就得到顺时针转的目标值,逆时针转减去90就得到逆时针转的目标值。

2.魔方控制器的值不能相互影响,经过我的探索,12个魔方控制器刚好动画能互相不受影响。

3.魔方旋转动画要按时完成且还要保证转到位,用协程能很好解决这问题。

魔方动画效果代码是:

private IEnumerator RotateOverTime(Transform transformToRotate, Quaternion targetRotation, float duration)
    {
        var timePassed = 0f;
        while (timePassed < duration)
        {
            var factor = timePassed / duration;

            transformToRotate.rotation = Quaternion.Slerp(transformToRotate.rotation, targetRotation, factor);
            // 增加自上一帧起经过的时间
            timePassed += Time.deltaTime;

            // 重要的这告诉Unity在这里中断,渲染这个帧
            // 在下一帧中从这里继续
            yield return null;
        }
        // 要确保以精确值结束,请在完成时设置目标旋转修复
        transformToRotate.rotation = targetRotation;
    }

调用动画协程的方法:

StartCoroutine(RotateOverTime(mofanControlList[mofanConNum].transform,Quaternion.Euler(mofan_rotate * n1), 0.3f));

自由观察魔方实现:

在主摄像机上绑了一个脚本,让摄像机绕着魔方转,实现一种可随意观察的效果,但这也导致了一个问题,用按钮操控魔方的各个面,但分不清哪面跟哪面,于是我在魔方的中心块上加了魔方转动标示符。

魔方状态保存和复原:

用结构体定义了两个Vector3,用来保存27个魔方块的坐标和欧拉角,将魔方的对应坐标和欧拉角保存好,就可以保存好魔方的状态,后面发现用魔方块的坐标和欧拉角可以反推魔方的颜色,具体看:魔方状态检测2_qq_39858654的博客-CSDN博客

这个我列了480记录,用了一个星期左右的时间发现的。

魔方的还原情况检测:

1、先判断27个魔方块是否被还原:

当要检测某个魔方块是否被还原,也就是检测魔方块的坐标和旋转角度是否正确。

棱块坐标还原检测:

如:要检测红白棱块,可以将红色魔方块的中心块的坐标加上白色魔方块的中心块的坐标,得到红白棱块坐标。

角块坐标还原检测:

如:要检测红白绿棱块,可以将红色魔方块的中心块的坐标加上白色魔方块的中心块的坐标加上绿色魔方块的中心块的坐标,得到红白绿棱块坐标。

棱块、角块旋转角度还原检测:

只要棱块或角块的旋转角度跟魔方最中心的魔方块旋转角度一样即为已还原。

当上述两个检测通过则表示某个魔方块成功被还原,那样能实时检测20个魔方块的实时还原情况。
 

2、然后判断魔方块的还原个数,分为4、8、12、20,对不同的还原阶段,黄色顶层是否翻色成功是用黄色中心块与其它块是否在同一面

游戏的完整的代码已经在gitee上传,地址为:

智能魔方

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

魔方游戏(附游戏开源代码) 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • idea装载jerbel以及文件上传下载

    一 JRebel 1 1 Jrebel介绍 JRebel是一个Java开发工具 它是一款用于实时代码重载的插件 它的主要功能是在不重新启动应用程序的情况下 将修改后的Java代码实时应用到正在运行的应用程序中 从而加快开发周期 提高开发效率
  • SQL Server常用数据类型

    SQL Server常用数据类型 数据类型是数据的一种属性 是数据所表示信息的类型 下面是小编为大家搜索整理了关于SQLServer常用数据类型 欢迎参考阅读 希望对大家有所帮助 SQLServer2000提供了比较多的数据类型供用户使用
  • MySQL中删除重复数据只保留一条

    MySQL中删除重复数据只保留一条 数据 INSERT INTO test time uuid name VALUES 1 wang INSERT INTO test time uuid name VALUES 2 王 INSERT INT
  • Object与json字符串的相互转换

    Object与json字符串的相互转换 第一步 引入fastjson的依赖jar包 注 maven项目 直接在pom xml中进行配置即可 注 如果引入此版本的依赖 导致项目不能启动 报错 找不到启动类 那么可以换一个版本的fastjson
  • PyTorch 深度学习模型压缩开源库(含量化、剪枝、轻量化结构、BN融合)

    点击我爱计算机视觉标星 更快获取CVML新技术 本文为52CV群友666dzy666投稿 介绍了他最近开源的PyTorch模型压缩库 该库开源不到20天已经收获 219 颗星 是最近值得关注的模型压缩开源库 开源地址 https githu
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • 灰度重采样的方法分为_均值采样

    from skimage import datafrom matplotlib import pyplot as pltimport numpy as npimage data coffee print image shape 显示图像原始
  • Python连接Oracle数据库

    cx Oracle cx Oracle模块是Python连接Oracle数据库的模块 在Python中 如果要连接Oracle 必须先安装cx Oracle模块 cx Oracle的下载地址 https pypi python org py
  • 【 华为OD机试 2023】 最快到达医院的方法(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • printk与内核日志打印优先级设置

    1 控制台的日志优先级 define KERN EMERG lt 0 gt 致命级 紧急事件消息 系统崩溃之前提示 表示系统不可用 define KERN ALERT lt 1 gt 警戒级 报告消息 表示必须采取措施 define KER
  • MySQL 数据库引擎

    引擎分类 InnoDB MyIsam 引擎对比 单位 ms 测试项 MyIsam InnoDb 结论 insert 100w 28825 123487 百万级插入性能 MyIsql 在30秒内完成性能优于 InnoDb 性能相差接近5倍 u
  • docker安装MongoDB

    base rootyx rootyx Default string sudo docker pull mongo 4 4 4 4 Pulling from library mongo 99803d4b97f3 Pull complete 6
  • NODE => CORS跨域资源共享学习

    1 CORS跨域资源共享 cors是Express的一个第三方中间件 通过安装和配置cors中间件 可以很方便地解决跨域问题 运行npm install cors 安装中间件 使用const cors require cors 导入中间件
  • Qt信号槽使用注意事项

    使用信号槽connect时 1 信号函数和槽函数都不能加形参 2 信号函数和槽函数形参列表要保持一致
  • 使用VS2010编译QT

    首先不要使用中文目录 发布QT程序时 为了使没有QT依赖库的环境中也能运行QT程序 这就需要静态编译你的QT程序 要达到这个目的 首先必须静态编译你的QT库文件 1 下载Qt的安装包和VS2010的Qt插件 2 安装Qt Library 注
  • maven模板freemarker引擎代码

    依次在src resource template 新建模板引擎mapper xml ftl
  • wvp-pro Java项目启动流程

    1 下载eclipse 下载 点击左边Download x86 64 下载 2 下载后解压 进入文件夹执行 eclipse inst 一路 next就可以安装完成了 记得给自己选择一个合适的安装路径 3 安装结束后 打开IDE 选择菜单he
  • 距离大决战777天——目前的进度

    最近看上了两款开发板 一是大名鼎鼎的合宙C3 看上他是因为9 9的无敌性价比 二是某黄厂的st7789s3 看上他是因为始终的大小和性价比 有着一块170 320的屏 S3处理起来刚好得心应手 58元的价位也是蛮能打 秒杀其他大厂的板子的配
  • OpenMMLab实训16班--第一节

    OpenMMLab实训16班 第一节 主讲人 张子豪 主题 计算机视觉与Openmmlab入门 内容 一 计算视觉基础 计算机视觉任务主要分为分类 检测 分割三类任务 计算机视觉基础问题都是对图像进行模式识别和数据挖掘 二 openmmla
  • 魔方游戏(附游戏开源代码)

    这个魔方游戏的前期的实现参考了许多教程 但全部代码逻辑都是本人写的 借鉴了的都会给出原贴链接 只讲实现的思路 已完成 魔方的转动和魔方的动画效果 支持魔方的cfop全部公式 按按钮可转动魔方 按键盘上的alt键可用移动鼠标360无死角观察魔