Пример #1
0
        private Dictionary <BrickPosition, IBrick> RestoreColumnFromGameDataAndMergeWithGameField(
            ICurrentGameData currentGameData,
            GameField gameField)
        {
            Dictionary <BrickPosition, IBrick> column;

            if (currentGameData.Column == null)
            {
                column = null;
            }
            else
            {
                column = new Dictionary <BrickPosition, IBrick>();

                foreach (var pair in currentGameData.Column)
                {
                    var brickPosition = BrickPosition.FromTuple(pair.Key);

                    if (gameField.TryGetValue(brickPosition, out var brick))
                    {
                        column.Add(brickPosition, brick);
                    }
                }
            }

            return(column);
        }
Пример #2
0
        public void ExplodeBomb(BombExplode explosion)
        {
            lock (_bombs)
            {
                // Find bomb
                IEnumerable <Bomb> bombEnum = from bomb in _bombs
                                              where (bomb.Position.X == explosion.X && bomb.Position.Y == explosion.Y)
                                              select bomb;

                Bomb explodingBomb = bombEnum.First();
                explodingBomb.Range      = explosion.Range;
                explodingBomb.MapToCheck = _currentMap;

                Deployment.Current.Dispatcher.BeginInvoke(explodingBomb.Explode);

                _bombs.Remove(explodingBomb);
            }

            foreach (BrickPosition destroyedBrickPos in explosion.DestroyedBricks)
            {
                Point absoluteBrickPosition = Util.GetAbsoluteCoordinates(new Point(destroyedBrickPos.X, destroyedBrickPos.Y));

                lock (_mainState.Bricks)
                {
                    IEnumerable <Brick.Brick> foundBrick = _mainState.Bricks.Where(brick => brick.Position.X == absoluteBrickPosition.X && brick.Position.Y == absoluteBrickPosition.Y);

                    if (foundBrick.Count() > 0)
                    {
                        BrickPosition pos = destroyedBrickPos;
                        Deployment.Current.Dispatcher.BeginInvoke(() => ((DestroyableBrick)foundBrick.First()).ShutDown(pos.SpawnedPowerup));
                    }
                }
            }
        }
Пример #3
0
 private void OnSwipeLeft()
 {
     if (!move && player.GetComponent <PlayerCotrol>().GetCanShoot())
     {
         move        = true;
         newPosition = BrickPosition.GetPositionOnLeftSwipe(transform.position);
     }
 }
Пример #4
0
 private void FixedUpdate()
 {
     if (move)
     {
         transform.position = Vector3.MoveTowards(transform.position, new Vector3(newPosition.x, transform.position.y, newPosition.z), 0.1f);
         if (BrickPosition.IsEqualsPosition(newPosition, transform.position))
         {
             move = false;
         }
     }
 }
Пример #5
0
        private GameField RestoreGameFieldFromGameData(ICurrentGameData currentGameData)
        {
            var settings = ContainerProvider.Resolve <ISettingsProvider>().GetSettingsInstance();

            var gameField = new GameField(settings.FieldWidth, settings.FieldHeight);

            foreach (var pair in currentGameData.GameField)
            {
                gameField.Add(BrickPosition.FromTuple(pair.Key), new Brick {
                    BrickKind = pair.Value
                });
            }

            return(gameField);
        }
Пример #6
0
        public bool GravitateGameField(GameField gameField)
        {
            var brickAffectedByGravity = false;

            var settings = ContainerProvider.Resolve <ISettingsProvider>().GetSettingsInstance();

            var indexOfLastButOneRow = settings.FieldHeight - 2;

            for (var i = 0; i < settings.FieldWidth; i++)
            {
                for (var j = indexOfLastButOneRow; j >= 0; j--)
                {
                    var brickPosition = new BrickPosition {
                        XCoordinate = i, YCoordinate = j
                    };

                    if (!gameField.TryGetValue(brickPosition, out var brick))
                    {
                        continue;
                    }

                    var           positionUnderBrick  = brickPosition.IncrementYCoordinate();
                    BrickPosition?targetBrickPosition = null;

                    while (positionUnderBrick.YCoordinate < settings.FieldHeight)
                    {
                        if (!gameField.ContainsKey(positionUnderBrick))
                        {
                            targetBrickPosition = positionUnderBrick;
                        }

                        positionUnderBrick = positionUnderBrick.IncrementYCoordinate();
                    }

                    if (!targetBrickPosition.HasValue)
                    {
                        continue;
                    }

                    gameField.Remove(brickPosition);
                    gameField.Add(targetBrickPosition.Value, brick);

                    brickAffectedByGravity = true;
                }
            }

            return(brickAffectedByGravity);
        }
Пример #7
0
    private void SpawnNewVawe(int count)
    {
        HashSet <BrickPosition.position> position = new HashSet <BrickPosition.position>();

        while (position.Count < count)
        {
            position.Add(new BrickPosition.position(Random.Range(0, 4), Random.Range(1, 6)));
        }

        foreach (BrickPosition.position pos in position)
        {
            Vector3    newBrickPosition = BrickPosition.GetBrickCoord(pos.GetSide(), pos.GetPosition());
            GameObject newBrick         = Instantiate(brick, newBrickPosition, Quaternion.identity);
            newBrick.GetComponent <Brick>().SetHP(hpBricks, hpBricks);
        }
    }
        public void AllBricksAreAtBottomFieldAfterGravitate()
        {
            var gameSettings = new MockGameSettings
            {
                FieldWidth  = 10,
                FieldHeight = 10
            };

            ContainerProvider.Resolve <ISettingsProvider>().SetSettingsInstance(gameSettings);

            var gameField          = GenerateRandomField(gameSettings.FieldWidth, gameSettings.FieldHeight);
            var gravitationService = new Services.GravitationService();

            gravitationService.GravitateGameField(gameField);

            for (var x = 0; x < gameSettings.FieldWidth; x++)
            {
                var topBrickInColumnFound = false;

                for (var y = 0; y < gameSettings.FieldHeight; y++)
                {
                    var brickPosition = new BrickPosition {
                        XCoordinate = x, YCoordinate = y
                    };

                    if (topBrickInColumnFound)
                    {
                        Assert.IsTrue(gameField.ContainsKey(brickPosition));
                    }
                    else
                    {
                        if (gameField.ContainsKey(brickPosition))
                        {
                            topBrickInColumnFound = true;
                        }
                    }
                }
            }
        }
Пример #9
0
 protected override BrickPosition GetPredecessorPosition(BrickPosition brickPosition)
 {
     return(brickPosition.IncrementXCoordinate().DecrementYCoordinate());
 }
Пример #10
0
        /// <summary>
        /// Checks if any bombs have exploded
        /// </summary>
        private void CheckBombs()
        {
            lock (_bombs)
            {
                List <Bomb> defunctBombs = new List <Bomb>();

                foreach (Bomb bomb in _bombs.Where(bomb => bomb.IsTimeUp()))
                {
                    Point absoluteBombPosition = Util.ToRealCoordinates(bomb.Position);

                    List <Player> players = null;

                    lock (_clients)
                    {
                        players = (from client in _clients select client.LocalPlayer).ToList();
                    }

                    List <Player> deadPlayers = null;

                    // Find and destroy bricks
                    Point[] destroyedBrickPos = _level.GetDestroyedBricksAndPlayers(bomb, players, out deadPlayers);

                    foreach (Player deadPlayer in deadPlayers)
                    {
                        deadPlayer.Dead = true;
                    }

                    // Kill all dead players
                    lock (_clients)
                    {
                        foreach (Client cl in _clients)
                        {
                            Client client = cl;

                            ThreadPool.QueueUserWorkItem(o =>
                            {
                                foreach (Player deadPlayer in deadPlayers)
                                {
                                    client.SendStatusUpdate(new PlayerDeath(deadPlayer.Color));
                                }
                            });
                        }
                    }

                    // Spawn powerups
                    BrickPosition[] destroyedBricks = new BrickPosition[destroyedBrickPos.Length];

                    int i = 0;

                    Random rnd = new Random();

                    foreach (Point pos in destroyedBrickPos)
                    {
                        int powerupNum = rnd.Next(10); //

                        Powerup powerup;

                        switch (powerupNum)
                        {
                        case 1:
                            powerup = Powerup.AdditionalBomb;
                            break;

                        case 2:
                            powerup = Powerup.ManualTrigger;
                            break;

                        case 3:
                            powerup = Powerup.BombRange;
                            break;

                        case 4:
                            powerup = Powerup.ScrambledControls;
                            break;

                        default:
                            powerup = Powerup.None;
                            break;
                        }

                        _level.SetPowerup(pos, powerup);
                        destroyedBricks[i++] = new BrickPosition(pos, powerup);

                        if (powerup != Powerup.None)
                        {
                            Console.WriteLine((string)("Spawned powerup " + powerup));
                        }
                    }

                    lock (_clients)
                    {
                        foreach (Client cl in _clients)
                        {
                            Client client = cl;
                            Bomb   bmb    = bomb;
                            ThreadPool.QueueUserWorkItem(o => client.SendStatusUpdate(new BombExplosion(absoluteBombPosition.X, absoluteBombPosition.Y, bmb.Range, destroyedBricks)));
                        }
                    }

                    defunctBombs.Add(bomb);
                }

                _bombs.RemoveAll(defunctBombs.Contains);
            }
        }
Пример #11
0
 protected abstract BrickPosition GetPredecessorPosition(BrickPosition brickPosition);