模拟魔方还原

本文介绍了一个使用Unity3D5.6开发的魔方还原项目,采用mvc架构,通过自定义数据模型模拟魔方旋转并实现监听。项目中魔方的旋转操作涉及面的注册和事件处理,还原过程依赖于公式库。提供了Unity项目的Dll文件链接供学习交流。
摘要由CSDN通过智能技术生成

第一次写博客,还不知道怎么写。

自己制作的魔方还原项目,写入cfop高级公式

先上几张效果图吧 ↓

这是刚开始时,未打乱


这是在打乱过程中


还原之后,除了中心块朝向不同(当然,魔方还原也没有要求中心块朝向)


这是一年前做的小项目了,当时使用的Unity3D5.6版本开发

开发的是mvc初步项目设计架构。

引入自己写的dll库文件以达到后期可以移植的可能性。

数据模型

编写时首先使用控制台应用编写数据模型的模拟还原。

首先搭建魔方结构(自己写的Vec3)

/// <summary>
    /// 魔方管理
    /// </summary>
    /// 
    ///     所有方块的旋转由此文件管理封装
    ///     
    /// 使用:
    ///     构造器中Init创建一个魔方
    ///     ...
    public class RubikCube
    {
        /// <summary>
        /// 所有旋转事件的集合
        /// </summary>
        List<Cube>[] list_event = new List<Cube>[9];
        #region 方块变量
        /// <summary>
        /// 角块
        /// </summary>
        public Cube[][][] hornbiock { get; private set; }
        /// <summary>
        /// 棱块
        /// </summary>
        public Cube[][][] edgeCube { get; private set; }
        /// <summary>
        /// 中心块
        /// </summary>
        public Cube[][][] centreCube { get; private set; }
        #endregion
        public RubikCube()
        {
            Init();
        }
        /// <summary>
        /// 方块对象初始化
        /// </summary>
        private void Init()
        {
            #region 集合数组
            for (int i = 0; i < list_event.Length; i++)
            {
                list_event[i] = new List<Cube>();
            }
            #endregion
            #region 角块
            hornbiock = new Hornblock[2][][];
            for (int i = 0; i < 2; i++)
            {
                hornbiock[i] = new Hornblock[2][];
                for (int j = 0; j < 2; j++)
                {
                    hornbiock[i][j] = new Hornblock[2];
                    for (int k = 0; k < 2; k++)
                    {
                        hornbiock[i][j][k] = new Hornblock(new RubikCubeVector3(ESurface.U, ESurface.F, ESurface.R));
                    }
                }
            }
            hornbiock[0][0][0].Twirl_U().Twirl_U().ToState();
            hornbiock[0][0][1].Twirl_U().ToState();
            hornbiock[0][1][0].Twirl_R().Twirl_R().Twirl_D().ToState();
            hornbiock[0][1][1].Twirl_F().Twirl_F().ToState();
            hornbiock[1][0][0].Twirl_U(false).ToState();
            hornbiock[1][0][1].ToState();
            hornbiock[1][1][0].Twirl_R().Twirl_R().ToState();
            hornbiock[1][1][1].Twirl_R().Twirl_R().Twirl_D(false).ToState();
            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    for (int k = 0; k < 2; k++)
                    {
                        hornbiock[i][j][k].Position = hornbiock[i][j][k].StatePosition;
                        hornbiock[i][j][k].SetListEvent(list_event);
                    }
                }
            }
            //hornbiock[0][0][0]//UBL
            //hornbiock[0][0][1]//UFL
            //hornbiock[0][1][0]//DBL
            //hornbiock[0][1][1]//DFL
            //hornbiock[1][0][0]//UBR
            //hornbiock[1][0][1]//UFR
            //hornbiock[1][1][0]//DBR
            //hornbiock[1][1][1]//DFR
            list_event[(int)ESurface.U].Add(hornbiock[0][0][0]); list_event[(int)ESurface.U].Add(hornbiock[0][0][1]); list_event[(int)ESurface.U].Add(hornbiock[1][0][0]); list_event[(int)ESurface.U].Add(hornbiock[1][0][1]);
            list_event[(int)ESurface.D].Add(hornbiock[0][1][0]); list_event[(int)ESurface.D].Add(hornbiock[0][1][1]); list_event[(int)ESurface.D].Add(hornbiock[1][1][0]); list_event[(int)ESurface.D].Add(hornbiock[1][1][1]);
            list_event[(int)ESurface.F].Add(hornbiock[0][0][1]); list_event[(int)ESurface.F].Add(hornbiock[0][1][1]); list_event[(int)ESurface.F].Add(hornbiock[1][0][1]); list_event[(int)ESurface.F].Add(hornbiock[1][1][1]);
            list_event[(int)ESurface.B].Add(hornbiock[0][0][0]); list_event[(int)ESurface.B].Add(hornbiock[0][1][0]); list_event[(int)ESurface.B].Add(hornbiock[1][0][0]); list_event[(int)ESurface.B].Add(hornbiock[1][1][0]);
            list_event[(int)ESurface.R].Add(hornbiock[1][0][0]); list_event[(int)ESurface.R].Add(hornbiock[1][0][1]); list_event[(int)ESurface.R].Add(hornbiock[1][1][0]); list_event[(int)ESurface.R].Add(hornbiock[1][1][1]);
            list_event[(int)ESurface.L].Add(hornbiock[0][0][0]); list_event[(int)ESurface.L].Add(hornbiock[0][0][1]); list_event[(int)ESurface.L].Add(hornbiock[0][1][0]); list_event[(int)ESurface.L].Add(hornbiock[0][1][1]);
            #endregion
            #region 棱块
            edgeCube = new EdgeCube[2][][];
            for (int i = 0; i < 2; i++)
            {
                edgeCube[i] = new EdgeCube[3][];
                for (int j = 0; j < 3; j++)
                {
                    edgeCube[i][j] = new EdgeCube[2];
                    for (int k = 0; k < 2; k++)
                    {
                        edgeCube[i][j][k] = new EdgeCube(new RubikCubeVector2(ESurface.U, ESurface.F));
                    }
                }
            }//end -- 上下两层棱块初始化
            edgeCube[0][0][0].Twirl_U().Twirl_U().ToState();
            edgeCube[0][0][1].Twirl_U().ToState();
            edgeCube[0][1][0].Twirl_U().Twirl_U().Twirl_B().ToState();
            edgeCube[0][1][1].Twirl_F(false).ToState();
            edgeCube[0][2][0].Twirl_F().Twirl_F().Twirl_D().Twirl_D().ToState();
            edgeCube[0][2][1].Twirl_F().Twirl_F().Twirl_D(false).ToState();
            edgeCube[1][0][0].Twirl_U(false).ToState();
            edgeCube[1][0][1].ToState();
            edgeCube[1][1][0].Twirl_U().Twirl_U().Twirl_B(false).ToState()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值