Exemplo n.º 1
0
        private void OffsetPointToBlankTile(ref WrappingScreenGrid grid, MineField mineField, ref Point coordinates)
        {
            var searchCoordinates = coordinates;
            var maskIndex         = mineField.GetMaskIndex(coordinates);
            var tileFound         = false;

            for (var maxAdjacents = 1; maxAdjacents < 9; maxAdjacents++)
            {
                do
                {
                    searchCoordinates.X++;

                    if (searchCoordinates.X >= mineField.Width)
                    {
                        searchCoordinates.X = 0;
                        searchCoordinates.Y++;

                        if (searchCoordinates.Y >= mineField.Height)
                        {
                            searchCoordinates.Y = 0;
                        }

                        if (searchCoordinates.Y % BitMaskGrid.Size == 0)
                        {
                            maskIndex += mineField.MasksPerRow;
                        }
                    }

                    if (searchCoordinates.X % BitMaskGrid.Size == 0)
                    {
                        maskIndex++;

                        if (maskIndex >= mineField.MaskAmount)
                        {
                            maskIndex = 0;
                        }
                    }

                    if (!mineField.MineMasks[maskIndex][searchCoordinates.X, searchCoordinates.Y] &&
                        CalculateAdjacents(mineField, searchCoordinates) < maxAdjacents)
                    {
                        var offset = coordinates - searchCoordinates; // Swap?
                        grid.ShiftObserver(offset, out var wrappedBorder);

                        coordinates = searchCoordinates;
                        tileFound   = true;
                        break;
                    }
                } while (searchCoordinates != coordinates);

                if (tileFound)
                {
                    break;
                }
            }
        }
Exemplo n.º 2
0
        //private void ShiftFrames(ref ScreenTextureGrid grid, int shiftX, int shiftY)
        //{
        //    int directionX, directionY;
        //    int gridStartX, gridStartY, gridEndX, gridEndY;

        //    if (shiftX <= 0)
        //    {
        //        directionX = 1;
        //        gridStartX = 0;
        //        gridEndX = grid.Width + shiftX;
        //    }
        //    else
        //    {
        //        directionX = -1;
        //        gridStartX = grid.Width - 1;
        //        gridEndX = shiftX - 1;
        //    }

        //    if (shiftY <= 0)
        //    {
        //        directionY = 1;
        //        gridStartY = 0;
        //        gridEndY = grid.Height + shiftY;
        //    }
        //    else
        //    {
        //        directionY = -1;
        //        gridStartY = grid.Height - 1;
        //        gridEndY = shiftY - 1;
        //    }

        //    for (int x = gridStartX; x != gridEndX; x += directionX)
        //    {
        //        for (int y = gridStartY; y != gridEndY; y += directionY)
        //        {
        //            grid[x, y] = grid[x - shiftX, y - shiftY];
        //        }
        //    }
        //}

        private void BufferSearchVertical(ArrayGrid <Sprite> grid, MineField mineField, Vector2 cameraPosition,
                                          int shiftX, int shiftY)
        {
            int startX, endX;

            if (shiftX <= 0)
            {
                startX = grid.Width - 1;
                endX   = startX + shiftX;
            }
            else
            {
                startX = 0;
                endX   = shiftX;
            }

            var searchBuffer = new bool[9];
            var bufferHead   = 0;

            var mineMasks   = mineField.MineMasks;
            var revealMasks = mineField.RevealMasks;

            var startCoordinate = ((-mineField.Position + cameraPosition) / grid.TileSize).ToPoint();

            startCoordinate.X %= mineField.Width;
            startCoordinate.Y %= mineField.Height;
            var bufferTopLeftCoordinate = startCoordinate - new Point(1);

            if (bufferTopLeftCoordinate.X < 0)
            {
                bufferTopLeftCoordinate.X += mineField.Width;
            }
            if (bufferTopLeftCoordinate.Y < 0)
            {
                bufferTopLeftCoordinate.Y += mineField.Height;
            }
            var maskIndex =
                mineField.GetMaskIndex(
                    bufferTopLeftCoordinate); // The index of the mask our start tile is in (top left corner of buffer).

            for (var x = 0; x < shiftX; x++)  // For all (now) empty columns
            {
                var mineCount = 0;

                // First, we put the six tiles above our first sample tile into the buffer.

                var bufferCoordinate = startCoordinate;

                for (var bufferY = -1; bufferY < 1;)
                {
                    bufferCoordinate.Y = startCoordinate.Y + bufferY;
                    if (bufferCoordinate.Y < 0)
                    {
                        bufferCoordinate.Y += mineField.Height;
                    }
                    else if (bufferCoordinate.Y >= mineField.Height)
                    {
                        bufferCoordinate.Y -= mineField.Height;
                    }

                    var line           = mineMasks[maskIndex][bufferCoordinate.Y % BitMaskGrid.Size];
                    var resetMaskIndex = false;

                    for (var bufferX = 0; bufferX < 3;)
                    {
                        bufferCoordinate.X = bufferTopLeftCoordinate.X + bufferX;

                        if (bufferCoordinate.X >= mineField.Width)
                        {
                            bufferCoordinate.X -= mineField.Width;
                        }

                        var isMine =
                            (line & (BitMaskGrid.MostSignificantBitOnly >> (bufferCoordinate.X % BitMaskGrid.Size))) !=
                            0;
                        searchBuffer[bufferHead++] = isMine;
                        if (isMine)
                        {
                            mineCount++;
                        }

                        if ((++bufferX + startCoordinate.X) % BitMaskGrid.Size == 0)
                        {
                            maskIndex++;

                            if (maskIndex % mineField.MasksPerRow == 0)
                            {
                                maskIndex -= mineField.MasksPerRow;
                            }
                            resetMaskIndex = true;
                        }
                    }

                    if (resetMaskIndex)
                    {
                        if (maskIndex % mineField.MasksPerRow == 0)
                        {
                            maskIndex += mineField.MasksPerRow;
                        }

                        maskIndex--;
                    }

                    if ((++bufferY + startCoordinate.Y) % BitMaskGrid.Size == 0)
                    {
                        maskIndex += mineField.MasksPerRow;

                        if (maskIndex >= mineField.MaskAmount)
                        {
                            maskIndex %= mineField.MasksPerRow;
                        }
                    }
                }

                bufferCoordinate.Y = startCoordinate.Y;

                for (var y = 0; y < grid.Height;)
                {
                    var line           = mineMasks[maskIndex][bufferCoordinate.Y];
                    var resetMaskIndex = false;

                    for (var lineX = 0; lineX < 3;)
                    {
                        bufferCoordinate.X = startCoordinate.X + lineX;
                        if (bufferCoordinate.X < 0)
                        {
                            bufferCoordinate.X += mineField.Width;
                        }
                        else if (bufferCoordinate.X >= mineField.Width)
                        {
                            bufferCoordinate.X -= mineField.Width;
                        }

                        var isMine = (line & (BitMaskGrid.MostSignificantBitOnly >>
                                              ((startCoordinate.X + lineX) % BitMaskGrid.Size))) != 0;
                        if (isMine ^ searchBuffer[bufferHead])
                        {
                            if (isMine)
                            {
                                mineCount++;
                            }
                            else
                            {
                                mineCount--;
                            }
                        }

                        searchBuffer[bufferHead++] = isMine;

                        if (bufferHead > 8)
                        {
                            bufferHead = 0;
                        }

                        if ((++lineX + startCoordinate.X) % BitMaskGrid.Size == 0)
                        {
                            maskIndex++;

                            if (maskIndex % mineField.MasksPerRow == 0)
                            {
                                maskIndex -= mineField.MasksPerRow;
                            }

                            resetMaskIndex = true;
                        }
                    }

                    var orig = grid[x, y];
                    orig.SetFrames(mineField.IsRevealed(bufferCoordinate) ? mineCount : 12, 0);
                    grid[x, y] = orig;

                    if (mineCount == 0)
                    {
                    }

                    if (resetMaskIndex)
                    {
                        if (maskIndex % mineField.MasksPerRow == 0)
                        {
                            maskIndex += mineField.MasksPerRow;
                        }

                        maskIndex--;
                    }

                    if (++y + startCoordinate.Y % BitMaskGrid.Size == 0)
                    {
                        maskIndex += mineField.MasksPerRow;

                        if (maskIndex >= mineField.MaskAmount)
                        {
                            maskIndex %= mineField.MasksPerRow;
                        }
                    }

                    bufferCoordinate.Y++;

                    if (bufferCoordinate.Y >= mineField.Height)
                    {
                        bufferCoordinate.Y -= mineField.Height;
                    }
                }
            }
        }