Exemplo n.º 1
0
    public static MatrixVector RotateHalfPi(MatrixVector a)
    {
        int x = 0 * a.x + -1 * a.y;
        int y = 1 * a.x + 0 * a.y;

        return(new MatrixVector(x, y));
    }
Exemplo n.º 2
0
    private bool IsPositionsAvailable(List <MatrixVector> elementPositions, MatrixVector direction)
    {
        foreach (MatrixVector position in _currentBlock.blockElementPositions)
        {
            _grid[position.x, position.y] = 0;
        }

        foreach (MatrixVector position in elementPositions)
        {
            MatrixVector nextVector = MatrixVector.Sum(position, direction);

            bool overLowerBound = nextVector.y >= _rowsCount;
            bool overSideBounds = nextVector.x < 0 || nextVector.x >= _columnsCount;

            if (overLowerBound || overSideBounds)
            {
                foreach (MatrixVector p in _currentBlock.blockElementPositions)
                {
                    _grid[p.x, p.y] = 1;
                }

                return(false);
            }

            bool gridIsNotEmpty = _grid[nextVector.x, nextVector.y] == 1;

            if (gridIsNotEmpty)
            {
                foreach (MatrixVector p in _currentBlock.blockElementPositions)
                {
                    _grid[p.x, p.y] = 1;
                }

                return(false);
            }
        }

        return(true);
    }
Exemplo n.º 3
0
    private void MoveBlock(MatrixVector direction)
    {
        if (!IsPositionsAvailable(_currentBlock.blockElementPositions, direction))
        {
            return;
        }

        for (int i = 0; i < _currentBlock.blockElementPositions.Count; i++)
        {
            _grid[_currentBlock.blockElementPositions[i].x, _currentBlock.blockElementPositions[i].y] = 0;
            _gridView.SetGridElementEnabled(_currentBlock.blockElementPositions[i], false);

            _currentBlock.blockElementPositions[i] =
                MatrixVector.Sum(_currentBlock.blockElementPositions[i], direction);
        }

        foreach (MatrixVector position in _currentBlock.blockElementPositions)
        {
            _grid[position.x, position.y] = 1;
            _gridView.SetGridElementEnabled(position, true);
        }
    }
Exemplo n.º 4
0
    public void RotateBlock()
    {
        if (!_currentBlock.Rotatable)
        {
            return;
        }

        List <MatrixVector> nextPositions = new List <MatrixVector>();
        MatrixVector        offset        = default(MatrixVector);

        bool canRotateAroundAnyElement = false;

        for (int i = 0; i < _currentBlock.blockElementPositions.Count; i++)
        {
            int xOffset = 0;
            int yOffset = 0;
            nextPositions.Clear();

            for (int j = 0; j < _currentBlock.blockElementPositions.Count; j++)
            {
                MatrixVector Vr           = MatrixVector.Substract(_currentBlock.blockElementPositions[j], _currentBlock.blockElementPositions[i]);
                MatrixVector Vt           = MatrixVector.RotateHalfPi(Vr);
                MatrixVector nextPosition = MatrixVector.Sum(_currentBlock.blockElementPositions[i], Vt);

                nextPositions.Add(nextPosition);

                if (nextPosition.x < 0 && nextPosition.x < xOffset)
                {
                    xOffset = nextPosition.x;
                }

                if (nextPosition.x >= _columnsCount && nextPosition.x > xOffset)
                {
                    xOffset = nextPosition.x - (_columnsCount - 1);
                }

                if (nextPosition.y < 0 && nextPosition.y < yOffset)
                {
                    yOffset = nextPosition.y;
                }

                if (nextPosition.y >= _rowsCount && nextPosition.y > yOffset)
                {
                    yOffset = nextPosition.y - (_rowsCount - 1);
                }
            }

            foreach (MatrixVector position in _currentBlock.blockElementPositions)
            {
                _gridView.SetGridElementEnabled(position, true);
            }

            offset = new MatrixVector(-xOffset, -yOffset);

            if (IsPositionsAvailable(nextPositions, offset))
            {
                canRotateAroundAnyElement = true;
                break;
            }
        }

        if (!canRotateAroundAnyElement)
        {
            return;
        }

        foreach (var blockPosition in _currentBlock.blockElementPositions)
        {
            _gridView.SetGridElementEnabled(blockPosition, false);
            _grid[blockPosition.x, blockPosition.y] = 0;
        }

        for (int i = 0; i < _currentBlock.blockElementPositions.Count; i++)
        {
            _currentBlock.blockElementPositions[i] = MatrixVector.Sum(nextPositions[i], offset);
            _gridView.SetGridElementEnabled(_currentBlock.blockElementPositions[i], true);
            _grid[_currentBlock.blockElementPositions[i].x, _currentBlock.blockElementPositions[i].y] = 1;
        }
    }
Exemplo n.º 5
0
 public static void SetValue <T>(this T[,] matrix, T value, MatrixVector coords)
 {
     matrix[coords.Row, coords.Col] = value;
 }
Exemplo n.º 6
0
 public static T GetValue <T>(this T[,] matrix, MatrixVector coords)
 {
     return(matrix[coords.Row, coords.Col]);
 }
Exemplo n.º 7
0
 public void SetGridElementEnabled(MatrixVector matrixVector, bool enabled)
 {
     _gridElements[matrixVector.x, matrixVector.y].SetImageEnabled(enabled);
 }
Exemplo n.º 8
0
 public static MatrixVector Substract(MatrixVector a, MatrixVector b)
 {
     return(new MatrixVector(a.x - b.x, a.y - b.y));
 }
Exemplo n.º 9
0
 public static MatrixVector Sum(MatrixVector a, MatrixVector b)
 {
     return(new MatrixVector(a.x + b.x, a.y + b.y));
 }
Exemplo n.º 10
0
 public static MatrixVector RandRangeIn(MatrixVector min, MatrixVector max)
 {
     return(new MatrixVector(RandRangeIn(min.Row, max.Row), RandRangeIn(min.Col, max.Col)));
 }