Example #1
0
    void UpdateAI()
    {
        float bestUtilityValue            = int.MaxValue;
        VoxelSnakeDirection bestDirection = VoxelSnakeDirection.Up;

        int  utilityValue = 0;
        Int3 delta;

        Vector4 vBackgroundColor = backgroundColor;
        Vector4 vFoodColor       = foodColor;

        foreach (VoxelSnakeDirection dir in Enum.GetValues(typeof(VoxelSnakeDirection)))
        {
            delta = GetDeltaByDirection(dir);

            Int3 nextPos = (mCurrent + delta) % mWorldSize;
            utilityValue = mLastFoodPosition.ManhattanDistance(nextPos);
            Vector4 vNextPosVoxelColor = GetVoxelColor(nextPos);

            if ((vBackgroundColor - vNextPosVoxelColor).sqrMagnitude > 0.001f &&
                (vFoodColor - vNextPosVoxelColor).sqrMagnitude > 0.001f)
            {
                utilityValue = int.MaxValue;
            }

            if (utilityValue < bestUtilityValue)
            {
                bestUtilityValue = utilityValue;
                bestDirection    = dir;
            }
        }

        currentSnakeDirection = bestDirection;
    }
Example #2
0
    Int3 GetDeltaByDirection(VoxelSnakeDirection dir)
    {
        if (dir == VoxelSnakeDirection.Forward)
        {
            return(new Int3(0, 0, 1));
        }
        else if (dir == VoxelSnakeDirection.Backward)
        {
            return(new Int3(0, 0, -1));
        }
        else if (dir == VoxelSnakeDirection.Left)
        {
            return(new Int3(-1, 0, 0));
        }
        else if (dir == VoxelSnakeDirection.Right)
        {
            return(new Int3(1, 0, 0));
        }
        else if (dir == VoxelSnakeDirection.Down)
        {
            return(new Int3(0, -1, 0));
        }
        else if (dir == VoxelSnakeDirection.Up)
        {
            return(new Int3(0, 1, 0));
        }

        // Up
        return(new Int3(0, 1, 0));
    }