예제 #1
0
        public async Task FruitShouldFirstAppearAfterSetNumberOfPills()
        {
            var fruitLocation = _gameSettings.PacMan.Location.FarAway();

            _gameSettings.Fruit = fruitLocation;
            _gameSettings.FruitAppearsAfterCoinsEaten.Add(5);

            _gameSettings.Coins.Add(_gameSettings.PacMan.Location.Left);
            for (var i = 1; i <= 5; i++)
            {
                _gameSettings.Coins.Add(_gameSettings.Coins[i - 1].Left);
            }
            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();
            await game.ChangeDirection(Direction.Left);

            await _gameClock.Tick();

            await _gameClock.Tick();

            await _gameClock.Tick();

            await _gameClock.Tick();

            await _gameClock.Tick();

            game.Fruits.Should().BeEquivalentTo(new {
                Location = _gameSettings.Fruit,
                Type     = FruitType.Cherry
            });
        }
예제 #2
0
        private async Task PlayUntilBonusLife(Game game)
        {
            game.StartGame();

            await game.ChangeDirection(Direction.Down);

            await _gameClock.Tick();
        }
예제 #3
0
        public async Task EatingFruitOnEveryLevel(int levelNumber, int scoreIncrement)
        {
            var now       = DateTime.UtcNow;
            var gameClock = new TestGameClock();

            _gameSettings.Coins.Add(_gameSettings.PacMan.Location.Left);
            _gameSettings.Coins.Add(_gameSettings.PacMan.Location.Left.Left);
            _gameSettings.Fruit = _gameSettings.PacMan.Location.Left.Above;
            _gameSettings.FruitAppearsAfterCoinsEaten.Add(1);

            var game = new Game(gameClock, _gameSettings);

            game.StartGame();

            for (var level = 0; level < levelNumber - 1; level++)
            {
                await game.ChangeDirection(Direction.Left);

                await gameClock.Tick(now);  //Fruit appears

                await gameClock.Tick(now);  //Level completed

                if (game.Status != GameStatus.ChangingLevel)
                {
                    throw new Exception($"Game status should be GameStatus.ChangingLevel not {game.Status}");
                }

                WeExpectThat(game.PacMan).IsAt(_gameSettings.PacMan.Location.Left.Left);

                await gameClock.Tick(now.AddSeconds(7));  //Screen flashes

                WeExpectThat(game.PacMan).IsAt(_gameSettings.PacMan.Location);
            }

            await game.ChangeDirection(Direction.Left);

            await gameClock.Tick(now.AddSeconds(7)); // Eat coin, fruit appears

            WeExpectThat(game.PacMan).IsAt(_gameSettings.PacMan.Location.Left);

            await game.ChangeDirection(Direction.Up);

            var score = game.Score;

            await gameClock.Tick(); // Eat coin, fruit appears

            game.Should().BeEquivalentTo(new {
                Level = levelNumber,
                Score = score + scoreIncrement
            });
        }
예제 #4
0
        public async Task IncrementsScoreBy50WhenPowerPillCollected()
        {
            _gameSettings.PowerPills.Add(_gameSettings.PacMan.Location.Below);
            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();
            await game.ChangeDirection(Direction.Down);

            await _gameClock.Tick();

            game.Score.Should().Be(50);
        }
예제 #5
0
        public async Task GameContainsAllCoins()
        {
            var gameBoard = new TestGameSettings();

            gameBoard.Coins.Add((1, 1));
            gameBoard.Coins.Add((1, 2));
            gameBoard.Coins.Add((2, 2));

            var gameClock = new TestGameClock();
            var game      = new Game(gameClock, gameBoard);

            game.StartGame();
            await gameClock.Tick();

            game.Coins.Should().BeEquivalentTo(
                new CellLocation(1, 1),
                new CellLocation(1, 2),
                new CellLocation(2, 2)
                );
        }
예제 #6
0
        public async Task LivesStayTheSameWhenNotCollidingWithAGhost()
        {
            var ghost = GhostBuilder.New().WithLocation(_gameSettings.PacMan.Location.Right).Create();

            _gameSettings.Ghosts.Add(ghost);

            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();
            var currentLives = game.Lives;

            await game.ChangeDirection(Direction.Left);

            await _gameClock.Tick();

            game.Lives.Should().Be(currentLives);
        }
예제 #7
0
        public async Task LivesStayTheSameWhenNotCollidingWithAGhost()
        {
            var x = _gameSettings.PacMan.Location.X + 1;
            var y = _gameSettings.PacMan.Location.Y;

            _gameSettings.Ghosts.Add(new Ghost("Ghost1", new CellLocation(x, y), Direction.Left, CellLocation.TopLeft, new StandingStillGhostStrategy()));

            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();
            var currentLives = game.Lives;

            game.ChangeDirection(Direction.Left);
            await _gameClock.Tick();

            game.Lives.Should().Be(currentLives);
        }
예제 #8
0
        public async Task PacManWalksInFacingDirection(Direction directionToFace, int changeInX, int changeInY)
        {
            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();

            var(x, y) = game.PacMan.Location;

            game.ChangeDirection(directionToFace);

            await _gameClock.Tick();

            game.PacMan.Should().BeEquivalentTo(new
            {
                Location  = new CellLocation(x + changeInX, y + changeInY),
                Direction = directionToFace
            });
        }
예제 #9
0
        public async Task GhostMovesInDirectionOfStrategy()
        {
            var ghost = GhostBuilder.New()
                        .WithChaseStrategyRight()
                        .Create();

            _gameSettings.Ghosts.Add(ghost);

            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();
            await _gameClock.Tick();

            game.Ghosts[ghost.Name].Should().BeEquivalentTo(new
            {
                Location = new
                {
                    X = 1,
                    Y = 0
                }
            });
        }
예제 #10
0
        public async Task ScoreDoesNotChangeWhenNoCoinIsCollected()
        {
            var game  = new Game(_gameClock, _gameSettings);
            var score = game.Score;

            game.ChangeDirection(Direction.Down);

            await _gameClock.Tick();

            game.Score.Should().Be(score);
        }
예제 #11
0
        public async Task GhostMovesInDirectionOfStrategy()
        {
            var strategy = new GhostGoesRightStrategy();

            _gameSettings.Ghosts.Add(new Ghost("Ghost1", new CellLocation(0, 0), Direction.Left, CellLocation.TopLeft, strategy));

            var game = new Game(_gameClock, _gameSettings);

            game.StartGame();
            await _gameClock.Tick();

            game.Ghosts["Ghost1"].Should().BeEquivalentTo(new
            {
                Location = new {
                    X = 1,
                    Y = 0
                }
            });
        }