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); }
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); } }
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; } }