Example #1
0
 public void ConstructMany()
 {
     for (int i = 0; i < 100; i++)
     {
         IScreenshot screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", TimeSpan.Zero);
     }
 }
Example #2
0
        public void GetTileMeanException()
        {
            var         timestamp  = TimeSpan.FromSeconds(6);
            IScreenshot screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", timestamp);

            screenshot.GetTileMean(0, 0);
            screenshot.GetTileMean(19, 17);

            Assert.Throws <ArgumentException>(() =>
            {
                screenshot.GetTileMean(-1, 0);
            });
            Assert.Throws <ArgumentException>(() =>
            {
                screenshot.GetTileMean(0, -1);
            });
            Assert.Throws <ArgumentException>(() =>
            {
                screenshot.GetTileMean(20, 0);
            });
            Assert.Throws <ArgumentException>(() =>
            {
                screenshot.GetTileMean(0, 18);
            });
        }
Example #3
0
        public void Extract()
        {
            var extractor  = new TetrisExtractor(_config);
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var gameState = extractor.Extract(screenshot, null);

            stopwatch.Stop();
            Debug.Write($"Extraction in {stopwatch.ElapsedMilliseconds} ms");

            Assert.NotNull(gameState);
            Assert.NotNull(gameState.Board);
            Assert.NotNull(gameState.Piece);
            Assert.NotNull(gameState.NextPiece);

            _logger.Info(gameState.Piece);
            _logger.Info(gameState.NextPiece);

            _logger.Info(gameState);
            _logger.Info(gameState.Board);
        }
Example #4
0
        public void ExtractNextPieceFuzzyFailCandidates(string path, Tetrimino expected)
        {
            var screenshot = new EmguScreenshot(path, DateTime.Now.Subtract(DateTime.MinValue));

            var result = _pieceExtractor.ExtractNextPieceFuzzy(screenshot);

            Assert.AreEqual(expected, result.Result);
        }
Example #5
0
        public void ExtractNextPiece()
        {
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var nextPiece = _pieceExtractor.ExtractNextPiece(screenshot);

            Assert.AreEqual(Tetrimino.L, nextPiece);
        }
Example #6
0
        public void GetPieceMask(int x, int y, int expected)
        {
            var extractor  = new TetrisExtractor(_config);
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", DateTime.Now.Subtract(DateTime.MinValue));

            var mask = extractor.GetPieceMask(screenshot, x, y);

            Assert.AreEqual(expected, mask);
        }
Example #7
0
        public void ExtractPieceSpawnedFuzzy1()
        {
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var result = _pieceExtractor.ExtractSpawnedPieceFuzzy(screenshot, 3);

            Assert.True(result.IsAccepted(0.5));
            Assert.AreEqual(Tetrimino.S, result.Result.Tetrimino);
        }
Example #8
0
        public void ExtractNextPieceInvalid()
        {
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", DateTime.Now.Subtract(DateTime.MinValue));

            Assert.Throws <ApplicationException>(() =>
            {
                _pieceExtractor.ExtractNextPiece(screenshot);
            });
        }
Example #9
0
        public void NextPieceProbabilityOne()
        {
            var tetrimino  = Tetrimino.L;
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var probability = _matcher.GetProbabilityNextPiece(screenshot, tetrimino);

            Assert.AreEqual(1.0, probability);
        }
Example #10
0
        public void ConstructorFile()
        {
            var file      = "Screenshots/tetris_start.png";
            var timestamp = TimeSpan.FromSeconds(6);

            IScreenshot screenshot = new EmguScreenshot(file, timestamp);

            Assert.NotNull(screenshot);
            Assert.AreEqual(timestamp, screenshot.Timestamp);
        }
Example #11
0
        public void NextPieceProbabilityNotOne()
        {
            var tetrimino  = Tetrimino.O;
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var probability = _matcher.GetProbabilityNextPiece(screenshot, tetrimino);

            Assert.GreaterOrEqual(probability, 0.0);
            Assert.Less(probability, 1.0);
        }
Example #12
0
        public void ExtractNextPieceFuzzy()
        {
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var result = _pieceExtractor.ExtractNextPieceFuzzy(screenshot);

            Assert.True(result.IsAccepted(0.5));
            Assert.False(result.IsRejected(0.5));
            Assert.AreEqual(Tetrimino.L, result.Result);
        }
Example #13
0
        public void PieceMatcher()
        {
            // source image
            string path        = "Screenshots/white.png";
            var    sourceImage = new Mat(path, LoadImageType.Grayscale);
            var    screenshot  = new EmguScreenshot(sourceImage, DateTime.Now.Subtract(DateTime.MinValue));

            var pieceMatcher = new TemplateMatcher();

            pieceMatcher.GetProbabilityNextPiece(screenshot, Tetrimino.I);
        }
Example #14
0
        public void NextPieceProbabilityZero()
        {
            var image      = new Mat("Screenshots/white.png", LoadImageType.Grayscale);
            var screenshot = new EmguScreenshot(image, DateTime.Now.Subtract(DateTime.MinValue));

            foreach (var tetrimino in Tetriminos.All)
            {
                var probability = _matcher.GetProbabilityNextPiece(screenshot, tetrimino);
                Assert.AreEqual(0.0, probability);
            }
        }
Example #15
0
        public void GetProbability(Tetrimino tetrimino, int x, int y, double expectedProbability)
        {
            var extractor  = new TetrisExtractor(_config);
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", DateTime.Now.Subtract(DateTime.MinValue));

            var piece = new Piece(tetrimino, 0, x, y);

            var probability = extractor.GetProbability(screenshot, piece);

            Assert.LessOrEqual(probability, 1.0);
            Assert.GreaterOrEqual(probability, 0.0);
            Assert.AreEqual(expectedProbability, probability);
        }
Example #16
0
        public void ExtractPieceSpawnedFalledPieceIsInOrigin()
        {
            var extractor  = new TetrisExtractor(_config);
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            var piece = extractor.ExtractSpawnedPiece(screenshot, 10);

            Assert.NotNull(piece);
            Assert.AreEqual(Tetrimino.S, piece.Tetrimino);
            Assert.AreEqual(0, piece.Orientation);
            Assert.AreEqual(0, piece.X);
            Assert.AreEqual(0, piece.Y);
        }
Example #17
0
        public void ExtractPieceSpawnedFuzzy2()
        {
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", DateTime.Now.Subtract(DateTime.MinValue));

            var result = _pieceExtractor.ExtractSpawnedPieceFuzzy(screenshot, 5);

            Assert.True(result.IsRejected(_probabilityThreshold));
            Assert.False(result.IsAccepted(_probabilityThreshold));

            result = _pieceExtractor.ExtractSpawnedPieceFuzzy(screenshot, 6);

            Assert.True(result.IsAccepted(_probabilityThreshold));
            Assert.AreEqual(Tetrimino.Z, result.Result.Tetrimino);
        }
Example #18
0
        public void ConfirmPieceMovement()
        {
            var extractor  = new TetrisExtractor(_config);
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", DateTime.Now.Subtract(DateTime.MinValue));

            var lastPosition = new Piece(Tetrimino.Z, 0, 1, -6);

            var newPosition = extractor.ExtractMovedPieceWithoutErrorTolerance(screenshot, lastPosition, Move.Left, 0);

            Assert.NotNull(newPosition);

            Assert.AreEqual(Tetrimino.Z, newPosition.Tetrimino);
            Assert.AreEqual(0, newPosition.Orientation);
            Assert.AreEqual(0, newPosition.X);
            Assert.AreEqual(-6, newPosition.Y);
        }
Example #19
0
        public void ConstructorMat()
        {
            var mat = new Mat("Screenshots/tetris_start.png", LoadImageType.Grayscale);

            Assert.NotNull(mat);

            var width     = mat.Width;
            var height    = mat.Height;
            var timestamp = TimeSpan.FromSeconds(6);

            IScreenshot screenshot = new EmguScreenshot(mat, timestamp);

            Assert.AreEqual(width, screenshot.Width);
            Assert.AreEqual(height, screenshot.Height);

            Assert.AreEqual(timestamp, screenshot.Timestamp);
        }
Example #20
0
        public void Step(Action <Mat> showImage = null, Action <Mat> showProcessedImage = null)
        {
            // get image as photo of the gameboy screen (input)
            Mat      image = Capture();
            TimeSpan time  = Clock.Time;

            // process image
            Mat processed = Quantizer.Quantize(image);

            showImage?.Invoke(image);

            if (_messages.Count > 0)
            {
                // send messages to agent
                Agent.Send(PopAllMessages());
            }

            if (Play)
            {
                IScreenshot screenshot = new EmguScreenshot(processed, time);
                screenshot.OriginalImage = image;

                try
                {
                    // extracts the game state
                    Agent.Extract(screenshot);

                    processed = Agent.Visualize(processed);
                    showProcessedImage?.Invoke(processed);

                    // presses the buttons
                    Agent.Play(Executor);
                }
                catch (GameOverException)
                {
                    OnGameOver();
                }
            }
            else
            {
                showProcessedImage?.Invoke(processed);
            }

            OnAfterStep();
        }
Example #21
0
        public void GetPixel()
        {
            var image = new Mat("Screenshots/tetris_start.png", LoadImageType.Grayscale);

            Assert.NotNull(image);

            var timestamp = TimeSpan.FromSeconds(6);

            IScreenshot screenshot = new EmguScreenshot(image, timestamp);

            Assert.AreEqual(0, screenshot.GetPixel(0, 0));
            Assert.AreEqual(255, screenshot.GetPixel(160 - 1, 144 - 1));

            Assert.AreEqual(255, screenshot.GetPixel(25, 20));
            Assert.AreEqual(170, screenshot.GetPixel(25, 25));
            Assert.AreEqual(85, screenshot.GetPixel(25, 33));
            Assert.AreEqual(0, screenshot.GetPixel(25, 44));
        }
Example #22
0
        public void GetTileMean()
        {
            var         timestamp  = TimeSpan.FromSeconds(6);
            IScreenshot screenshot = new EmguScreenshot("Screenshots/tetris_play_2.png", timestamp);

            for (int i = 0; i < 5; i++)
            {
                // test multiple time
                Assert.AreEqual(31, screenshot.GetTileMean(0, 0));
            }

            Assert.AreEqual(103, screenshot.GetTileMean(1, 0));
            Assert.AreEqual(255, screenshot.GetTileMean(2, 0));

            Assert.AreEqual(85, screenshot.GetTileMean(5, 7));

            Assert.AreEqual(255, screenshot.GetTileMean(5, 6));
        }
Example #23
0
        public void GetProbabilityPerformance()
        {
            var screenshot = new EmguScreenshot("Screenshots/tetris_play_1.png", DateTime.Now.Subtract(DateTime.MinValue));

            // 4 x 10 x 17
            for (int orientation = 0; orientation < 4; orientation++)
            {
                for (int x = -4; x <= 5; x++)
                {
                    for (int y = -16; y <= 0; y++)
                    {
                        var piece = new Piece(Tetrimino.T, orientation, x, y);

                        var probability = _matcher.GetProbabilityCurrentPiece(screenshot, piece);

                        Assert.GreaterOrEqual(probability, 0.0);
                        Assert.LessOrEqual(probability, 1.0);
                    }
                }
            }
        }