Exemple #1
0
        public ArrayList getSuccessors(object state)
        {
            RubickColorMatrix   node       = (RubickColorMatrix)state;
            ArrayList           successors = new ArrayList();
            RubickMovementTypes lastMove   = node.stackSize > 0 ? node.moveStack[node.moveStack.Count - 1] : RubickMovementTypes.None;

            if (lastMove != RubickMovementTypes.None)
            {
                lastMove = (RubickMovementTypes)(-((int)lastMove));
            }

            var moves = System.Enum.GetValues(typeof(RubickMovementTypes));

            for (int i = 0; i < moves.Length; i++)
            {
                RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i);
                if (val != RubickMovementTypes.None && val != lastMove)
                {
                    RubickColorMatrix clone = (RubickColorMatrix)node.Clone();
                    clone.Transform(val);
                    successors.Add(new Successor(val.ToString(), clone));
                }
            }

            return(successors);
        }
Exemple #2
0
 private void Transform(RubickMovementTypes _move, bool _save = true)
 {
     if (_save)
     {
         //UnityEngine.Debug.LogFormat("Move <b>{0}</b>", _move);
         m_moveStack.Add(_move);
     }
     //m_matrix.Transform(_move);
     m_pieces.ForEach(p => p.Transform(_move));
     m_pieces.Sort((p1, p2) =>
     {
         if (p1.state > p2.state)
         {
             return(1);
         }
         else if (p2.state > p1.state)
         {
             return(-1);
         }
         else
         {
             return(0);
         }
     });
 }
Exemple #3
0
        public void Resolve()
        {
            rubickCube.Apply();
            Problem problem = new Problem(rubickCube,
                                          new RubickSuccessorFunction(),
                                          new RubickGoalTest(),
                                          new RubickHeuristicFunction());
            Search search = new IterativeDeepeningSearch();
            //Search search = new AStarSearch(new GraphSearch());
            SearchAgent agent      = new SearchAgent(problem, search);
            int         iterations = -1;
            ArrayList   actions    = agent.getActions();
            Hashtable   info       = agent.getInstrumentation();

            for (int i = 0; i < actions.Count; i++)
            {
                RubickMovementTypes move = (RubickMovementTypes)Enum.Parse(typeof(RubickMovementTypes), (string)actions[i]);
                rubickCube.Transform(move);
            }
            //aStarSearchTree.Search(rubickCube);
            //if (aStarSearchTree.result != null)
            //{
            //    rubickCube = aStarSearchTree.result;
            //    iterations = aStarSearchTree.iterations;
            //}
            DispatchEvent(new RubickCubeResolvedOutputEvent((RubickColorMatrix)rubickCube.Clone(), iterations));
        }
Exemple #4
0
        public static int GetEventIndex(RubickMovementTypes _moveType)
        {
            switch (_moveType)
            {
            case RubickMovementTypes.TopTurnRight:
                return(0);

            case RubickMovementTypes.TopTurnLeft:
                return(1);

            case RubickMovementTypes.BottomTurnRight:
                return(2);

            case RubickMovementTypes.BottomTurnLeft:
                return(3);

            case RubickMovementTypes.LeftTurnUp:
                return(4);

            case RubickMovementTypes.LeftTurnDown:
                return(5);

            case RubickMovementTypes.RightTurnUp:
                return(6);

            case RubickMovementTypes.RightTurnDown:
                return(7);
            }
            return(-1);
        }
Exemple #5
0
        private List <RubickColorMatrix> GetBestNeighbors(RubickColorMatrix _node)
        {
            List <RubickColorMatrix> neighbors = new List <RubickColorMatrix>();
            int min = int.MaxValue;
            RubickColorMatrix minNeightbor = null;

            var moves = System.Enum.GetValues(typeof(RubickMovementTypes));

            for (int i = 0; i < moves.Length; i++)
            {
                RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i);
                if (val != RubickMovementTypes.None)
                {
                    RubickColorMatrix clone = (RubickColorMatrix)_node.Clone();
                    clone.Transform(val);
                    int cost = clone.HeuristicCostEstimate();
                    if (cost < min)
                    {
                        min          = cost;
                        minNeightbor = clone;
                    }
                }
            }

            if (min == _node.HeuristicCostEstimate())
            {
                UnityEngine.Debug.Log("Duh");
            }
            neighbors.Add(minNeightbor);
            return(neighbors);
        }
Exemple #6
0
        private List <RubickColorMatrix> GenerateNeighbors(RubickColorMatrix _node)
        {
            List <RubickColorMatrix> neighbors = new List <RubickColorMatrix>();

            RubickMovementTypes lastMove = _node.stackSize > 0 ? _node.moveStack[_node.moveStack.Count - 1] : RubickMovementTypes.None;

            if (lastMove != RubickMovementTypes.None)
            {
                lastMove = (RubickMovementTypes)(-((int)lastMove));
            }

            var moves = System.Enum.GetValues(typeof(RubickMovementTypes));

            for (int i = 0; i < moves.Length; i++)
            {
                RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i);
                if (val != RubickMovementTypes.None && val != lastMove)
                {
                    RubickColorMatrix clone = (RubickColorMatrix)_node.Clone();
                    clone.Transform(val);
                    neighbors.Add(clone);
                }
            }

            return(neighbors);
        }
Exemple #7
0
        public void Shuffle(int _steps = 100)
        {
            Random rand = new Random(DateTime.Now.Millisecond);

            while (_steps > 0)
            {
                int num = rand.Next(4) + 1;
                num = rand.NextDouble() > 0.5 ? num : -num;
                RubickMovementTypes move = (RubickMovementTypes)num;
                Transform(move);
                _steps--;
            }
        }
Exemple #8
0
        private void Transform(RubickMovementTypes _move, bool _save = true)
        {
            if (_save)
            {
                m_moveStack.Add(_move);
            }
            switch (_move)
            {
            case RubickMovementTypes.TopTurnRight:
                TransformRow(0, -1);
                TransformRow(1, 1);
                break;

            case RubickMovementTypes.TopTurnLeft:
                TransformRow(0, 1);
                TransformRow(1, -1);
                break;

            case RubickMovementTypes.BottomTurnRight:
                TransformRow(2, 1);
                TransformRow(3, -1);
                break;

            case RubickMovementTypes.BottomTurnLeft:
                TransformRow(2, -1);
                TransformRow(3, 1);
                break;

            case RubickMovementTypes.LeftTurnUp:
                TransformColumn(0, 1);
                TransformColumn(1, -1);
                break;

            case RubickMovementTypes.LeftTurnDown:
                TransformColumn(0, -1);
                TransformColumn(1, 1);
                break;

            case RubickMovementTypes.RightTurnUp:
                TransformColumn(2, -1);
                TransformColumn(3, 1);
                break;

            case RubickMovementTypes.RightTurnDown:
                TransformColumn(2, 1);
                TransformColumn(3, -1);
                break;
            }
        }
Exemple #9
0
        private List <RubickMatrix> GenerateNeighbors(RubickMatrix _node)
        {
            List <RubickMatrix> neighbors = new List <RubickMatrix>();

            var moves = System.Enum.GetValues(typeof(RubickMovementTypes));

            for (int i = 0; i < moves.Length; i++)
            {
                RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i);
                if (val != RubickMovementTypes.None)
                {
                    RubickMatrix clone = (RubickMatrix)_node.Clone();
                    clone.Transform(val);
                    neighbors.Add(clone);
                }
            }

            return(neighbors);
        }
Exemple #10
0
        public void ApplyMove(RubickMovementTypes _move, bool animated = false)
        {
            Transform t = null;

            switch (_move)
            {
            case RubickMovementTypes.TopTurnRight:
                if (!animated)
                {
                    TurnRight(pieces[0], pieces[1], pieces[4], pieces[5]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(0, -90, 0), pieces[0], pieces[1], pieces[4], pieces[5]));
                }
                t         = pieces[0];
                pieces[0] = pieces[4];
                pieces[4] = pieces[5];
                pieces[5] = pieces[1];
                pieces[1] = t;
                break;

            case RubickMovementTypes.TopTurnLeft:
                if (!animated)
                {
                    TurnLeft(pieces[0], pieces[1], pieces[4], pieces[5]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(0, 90, 0), pieces[0], pieces[1], pieces[4], pieces[5]));
                }
                t         = pieces[0];
                pieces[0] = pieces[1];
                pieces[1] = pieces[5];
                pieces[5] = pieces[4];
                pieces[4] = t;
                break;

            case RubickMovementTypes.BottomTurnRight:
                if (!animated)
                {
                    TurnRight(pieces[3], pieces[2], pieces[7], pieces[6]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(0, -90, 0), pieces[3], pieces[2], pieces[7], pieces[6]));
                }
                t         = pieces[3];
                pieces[3] = pieces[7];
                pieces[7] = pieces[6];
                pieces[6] = pieces[2];
                pieces[2] = t;
                break;

            case RubickMovementTypes.BottomTurnLeft:
                if (!animated)
                {
                    TurnLeft(pieces[3], pieces[2], pieces[7], pieces[6]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(0, 90, 0), pieces[3], pieces[2], pieces[7], pieces[6]));
                }
                t         = pieces[3];
                pieces[3] = pieces[2];
                pieces[2] = pieces[6];
                pieces[6] = pieces[7];
                pieces[7] = t;
                break;

            case RubickMovementTypes.LeftTurnUp:
                if (!animated)
                {
                    TurnUp(pieces[0], pieces[3], pieces[7], pieces[4]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(90, 0, 0), pieces[0], pieces[3], pieces[7], pieces[4]));
                }
                t         = pieces[0];
                pieces[0] = pieces[3];
                pieces[3] = pieces[7];
                pieces[7] = pieces[4];
                pieces[4] = t;
                break;

            case RubickMovementTypes.LeftTurnDown:
                if (!animated)
                {
                    TurnDown(pieces[0], pieces[3], pieces[7], pieces[4]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(-90, 0, 0), pieces[0], pieces[3], pieces[7], pieces[4]));
                }
                t         = pieces[0];
                pieces[0] = pieces[4];
                pieces[4] = pieces[7];
                pieces[7] = pieces[3];
                pieces[3] = t;
                break;

            case RubickMovementTypes.RightTurnUp:
                if (!animated)
                {
                    TurnUp(pieces[1], pieces[2], pieces[6], pieces[5]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(90, 0, 0), pieces[1], pieces[2], pieces[6], pieces[5]));
                }
                t         = pieces[1];
                pieces[1] = pieces[2];
                pieces[2] = pieces[6];
                pieces[6] = pieces[5];
                pieces[5] = t;
                break;

            case RubickMovementTypes.RightTurnDown:
                if (!animated)
                {
                    TurnDown(pieces[1], pieces[2], pieces[6], pieces[5]);
                }
                else
                {
                    StartCoroutine(TurnAnimated(new Vector3(-90, 0, 0), pieces[1], pieces[2], pieces[6], pieces[5]));
                }
                t         = pieces[1];
                pieces[1] = pieces[5];
                pieces[5] = pieces[6];
                pieces[6] = pieces[2];
                pieces[2] = t;
                break;

            default:
                break;
            }
        }
Exemple #11
0
 private void AnimatemMovement(RubickMovementTypes _move)
 {
 }
Exemple #12
0
        public void Transform(RubickMovementTypes _moveType)
        {
            int eventIndex = GetEventIndex(_moveType);

            int oldState = state;

            state = s_stateTrasitionTable[state, eventIndex];

            if (oldState == state)
            {
                return;
            }

            ClearAux();

            if (oldState == 0)
            {
                if (_moveType == RubickMovementTypes.TopTurnRight)
                {
                    m_dataAux[FRONT] = data[LEFT];
                    m_dataAux[RIGHT] = data[FRONT];
                    m_dataAux[UP]    = data[UP];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnDown)
                {
                    m_dataAux[LEFT]  = data[LEFT];
                    m_dataAux[DOWN]  = data[FRONT];
                    m_dataAux[FRONT] = data[UP];
                }
                else if (_moveType == RubickMovementTypes.TopTurnLeft)
                {
                    m_dataAux[BACK] = data[LEFT];
                    m_dataAux[LEFT] = data[FRONT];
                    m_dataAux[UP]   = data[UP];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnUp)
                {
                    m_dataAux[LEFT] = data[LEFT];
                    m_dataAux[UP]   = data[FRONT];
                    m_dataAux[BACK] = data[UP];
                }
            }
            else if (oldState == 1)
            {
                if (_moveType == RubickMovementTypes.TopTurnRight)
                {
                    m_dataAux[BACK]  = data[RIGHT];
                    m_dataAux[RIGHT] = data[FRONT];
                    m_dataAux[UP]    = data[UP];
                }
                else if (_moveType == RubickMovementTypes.TopTurnLeft)
                {
                    m_dataAux[FRONT] = data[RIGHT];
                    m_dataAux[LEFT]  = data[FRONT];
                    m_dataAux[UP]    = data[UP];
                }
                else if (_moveType == RubickMovementTypes.RightTurnUp)
                {
                    m_dataAux[RIGHT] = data[RIGHT];
                    m_dataAux[UP]    = data[FRONT];
                    m_dataAux[BACK]  = data[UP];
                }
                else if (_moveType == RubickMovementTypes.RightTurnDown)
                {
                    m_dataAux[RIGHT] = data[RIGHT];
                    m_dataAux[DOWN]  = data[FRONT];
                    m_dataAux[FRONT] = data[UP];
                }
            }
            else if (oldState == 2)
            {
                if (_moveType == RubickMovementTypes.BottomTurnLeft)
                {
                    m_dataAux[FRONT] = data[RIGHT];
                    m_dataAux[LEFT]  = data[FRONT];
                    m_dataAux[DOWN]  = data[DOWN];
                }
                else if (_moveType == RubickMovementTypes.BottomTurnRight)
                {
                    m_dataAux[BACK]  = data[RIGHT];
                    m_dataAux[RIGHT] = data[FRONT];
                    m_dataAux[DOWN]  = data[DOWN];
                }
                else if (_moveType == RubickMovementTypes.RightTurnUp)
                {
                    m_dataAux[RIGHT] = data[RIGHT];
                    m_dataAux[UP]    = data[FRONT];
                    m_dataAux[FRONT] = data[DOWN];
                }
                else if (_moveType == RubickMovementTypes.RightTurnDown)
                {
                    m_dataAux[RIGHT] = data[RIGHT];
                    m_dataAux[DOWN]  = data[FRONT];
                    m_dataAux[BACK]  = data[DOWN];
                }
            }
            else if (oldState == 3)
            {
                if (_moveType == RubickMovementTypes.BottomTurnLeft)
                {
                    m_dataAux[LEFT] = data[FRONT];
                    m_dataAux[BACK] = data[LEFT];
                    m_dataAux[DOWN] = data[DOWN];
                }
                else if (_moveType == RubickMovementTypes.BottomTurnRight)
                {
                    m_dataAux[RIGHT] = data[FRONT];
                    m_dataAux[FRONT] = data[LEFT];
                    m_dataAux[DOWN]  = data[DOWN];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnUp)
                {
                    m_dataAux[UP]    = data[FRONT];
                    m_dataAux[LEFT]  = data[LEFT];
                    m_dataAux[FRONT] = data[DOWN];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnDown)
                {
                    m_dataAux[DOWN] = data[FRONT];
                    m_dataAux[LEFT] = data[LEFT];
                    m_dataAux[BACK] = data[DOWN];
                }
            }
            else if (oldState == 4)
            {
                if (_moveType == RubickMovementTypes.TopTurnLeft)
                {
                    m_dataAux[UP]    = data[UP];
                    m_dataAux[RIGHT] = data[BACK];
                    m_dataAux[BACK]  = data[LEFT];
                }
                else if (_moveType == RubickMovementTypes.TopTurnRight)
                {
                    m_dataAux[UP]    = data[UP];
                    m_dataAux[LEFT]  = data[BACK];
                    m_dataAux[FRONT] = data[LEFT];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnUp)
                {
                    m_dataAux[BACK] = data[UP];
                    m_dataAux[DOWN] = data[BACK];
                    m_dataAux[LEFT] = data[LEFT];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnDown)
                {
                    m_dataAux[FRONT] = data[UP];
                    m_dataAux[UP]    = data[BACK];
                    m_dataAux[LEFT]  = data[LEFT];
                }
            }
            else if (oldState == 5)
            {
                if (_moveType == RubickMovementTypes.TopTurnLeft)
                {
                    m_dataAux[UP]    = data[UP];
                    m_dataAux[RIGHT] = data[BACK];
                    m_dataAux[FRONT] = data[RIGHT];
                }
                else if (_moveType == RubickMovementTypes.TopTurnRight)
                {
                    m_dataAux[UP]   = data[UP];
                    m_dataAux[LEFT] = data[BACK];
                    m_dataAux[BACK] = data[RIGHT];
                }
                else if (_moveType == RubickMovementTypes.RightTurnUp)
                {
                    m_dataAux[BACK]  = data[UP];
                    m_dataAux[DOWN]  = data[BACK];
                    m_dataAux[RIGHT] = data[RIGHT];
                }
                else if (_moveType == RubickMovementTypes.RightTurnDown)
                {
                    m_dataAux[FRONT] = data[UP];
                    m_dataAux[UP]    = data[BACK];
                    m_dataAux[RIGHT] = data[RIGHT];
                }
            }
            else if (oldState == 6)
            {
                if (_moveType == RubickMovementTypes.BottomTurnLeft)
                {
                    m_dataAux[DOWN]  = data[DOWN];
                    m_dataAux[RIGHT] = data[BACK];
                    m_dataAux[FRONT] = data[RIGHT];
                }
                else if (_moveType == RubickMovementTypes.BottomTurnRight)
                {
                    m_dataAux[DOWN] = data[DOWN];
                    m_dataAux[LEFT] = data[BACK];
                    m_dataAux[BACK] = data[RIGHT];
                }
                else if (_moveType == RubickMovementTypes.RightTurnUp)
                {
                    m_dataAux[FRONT] = data[DOWN];
                    m_dataAux[DOWN]  = data[BACK];
                    m_dataAux[RIGHT] = data[RIGHT];
                }
                else if (_moveType == RubickMovementTypes.RightTurnDown)
                {
                    m_dataAux[BACK]  = data[DOWN];
                    m_dataAux[UP]    = data[BACK];
                    m_dataAux[RIGHT] = data[RIGHT];
                }
            }
            else if (oldState == 7)
            {
                if (_moveType == RubickMovementTypes.BottomTurnLeft)
                {
                    m_dataAux[DOWN]  = data[DOWN];
                    m_dataAux[RIGHT] = data[BACK];
                    m_dataAux[BACK]  = data[LEFT];
                }
                else if (_moveType == RubickMovementTypes.BottomTurnRight)
                {
                    m_dataAux[DOWN]  = data[DOWN];
                    m_dataAux[LEFT]  = data[BACK];
                    m_dataAux[FRONT] = data[LEFT];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnUp)
                {
                    m_dataAux[FRONT] = data[DOWN];
                    m_dataAux[DOWN]  = data[BACK];
                    m_dataAux[LEFT]  = data[LEFT];
                }
                else if (_moveType == RubickMovementTypes.LeftTurnDown)
                {
                    m_dataAux[BACK] = data[DOWN];
                    m_dataAux[UP]   = data[BACK];
                    m_dataAux[LEFT] = data[LEFT];
                }
            }

            Array.Copy(m_dataAux, data, LENGTH);
        }