public void TestMatrixPiece_ClearAndFill()
        {
            var sut = new MatrixPiece(new Vector2Int(1, 1));

            Assert.AreEqual(false, sut.CellAt(new Vector2Int(0, 0)));

            sut.Fill();
            Assert.AreEqual(true, sut.CellAt(new Vector2Int(0, 0)));

            sut.Clear();
            Assert.AreEqual(false, sut.CellAt(new Vector2Int(0, 0)));
        }
예제 #2
0
        public bool PutPiece(MatrixPiece piece, Vector2Int origin)
        {
            if (IsPieceBlockedAt(origin, piece))
            {
                return(false);
            }
            if (piece.board != null)
            {
                return(false);
            }

            piece.board  = new WeakReference <MatrixBoard>(this);
            piece.origin = origin;

            for (int x = 0; x < piece.Width; x++)
            {
                for (int y = 0; y < piece.Height; y++)
                {
                    var pieceLocation     = new Vector2Int(x, y);
                    var isOccupiedByPiece = piece.CellAt(pieceLocation);
                    if (!isOccupiedByPiece)
                    {
                        continue;
                    }

                    var cell = CellAt(origin + pieceLocation);
                    cell.piece         = piece;
                    cell.pieceLocation = pieceLocation;
                }
            }

            return(true);
        }
        public void TestMatrixPiece_BuildFromShape()
        {
            var sut = new MatrixPiece(new Vector2Int(1, 1));

            Assert.AreEqual(false, sut.CellAt(new Vector2Int(0, 0)));

            var pieceShape = new List <string>();

            pieceShape.Add(" *");
            pieceShape.Add("*");

            sut.BuildFromShape(pieceShape);

            Assert.AreEqual(2, sut.Width);
            Assert.AreEqual(2, sut.Height);

            Assert.AreEqual(false, sut.CellAt(new Vector2Int(0, 0)));
            Assert.AreEqual(true, sut.CellAt(new Vector2Int(1, 0)));
            Assert.AreEqual(true, sut.CellAt(new Vector2Int(0, 1)));
            Assert.AreEqual(false, sut.CellAt(new Vector2Int(1, 1)));
        }
예제 #4
0
        public bool IsPieceBlockedAt(Vector2Int origin, MatrixPiece piece, HashSet <MatrixPiece> excludePieces)
        {
            for (int x = 0; x < piece.Width; x++)
            {
                for (int y = 0; y < piece.Height; y++)
                {
                    var pieceLocation     = new Vector2Int(x, y);
                    var isOccupiedByPiece = piece.CellAt(pieceLocation);
                    if (!isOccupiedByPiece)
                    {
                        continue;
                    }

                    var location = origin + pieceLocation;

                    if (IsCellBlockedAt(location))
                    {
                        // If specified, ignore some pieces for check
                        if (excludePieces.Count > 0)
                        {
                            var cell = CellAt(location);
                            if (null != cell)
                            {
                                if (excludePieces.Contains(cell.piece))
                                {
                                    continue;
                                }
                            }
                        }

                        return(true);
                    }
                }
            }

            return(false);
        }
예제 #5
0
        public void RemovePiece(MatrixPiece piece)
        {
            if (null == piece)
            {
                return;
            }
            if (piece.board.TryGetTarget(out MatrixBoard ownerBoard))
            {
                if (ownerBoard != this)
                {
                    Debug.Log("Error. Can't remove a piece from a different board");
                    return;
                }
            }
            piece.board = null;

            for (int x = 0; x < piece.Width; x++)
            {
                for (int y = 0; y < piece.Height; y++)
                {
                    var pieceLocation     = new Vector2Int(x, y);
                    var isOccupiedByPiece = piece.CellAt(pieceLocation);
                    if (!isOccupiedByPiece)
                    {
                        continue;
                    }

                    var cell = CellAt(piece.origin + pieceLocation);
                    if (cell.piece != piece)
                    {
                        Debug.Log("Error. Cell/piece mismatch");
                        continue;
                    }
                    cell.piece = null;
                }
            }
        }
        public void TestMatrixBoard()
        {
            var sut    = new MatrixBoard(new Vector2Int(3, 3));
            var lPiece = new MatrixPiece(new Vector2Int(3, 2));

            lPiece.SetCell(new Vector2Int(0, 0), true);
            lPiece.SetCell(new Vector2Int(1, 0), true);
            lPiece.SetCell(new Vector2Int(2, 0), true);
            lPiece.SetCell(new Vector2Int(2, 1), true);

            var squarePiece = new MatrixPiece(new Vector2Int(2, 2));

            squarePiece.Fill();
            Assert.AreEqual(true, squarePiece.CellAt(new Vector2Int(0, 0)));
            Assert.AreEqual(true, squarePiece.CellAt(new Vector2Int(1, 0)));
            Assert.AreEqual(true, squarePiece.CellAt(new Vector2Int(0, 1)));
            Assert.AreEqual(true, squarePiece.CellAt(new Vector2Int(1, 1)));

            Assert.AreEqual(true, sut.PutPiece(lPiece, new Vector2Int(0, 0)));
            Assert.AreEqual(false, sut.PutPiece(squarePiece, new Vector2Int(0, 0)));
            Assert.AreEqual(false, sut.PutPiece(squarePiece, new Vector2Int(1, 0)));
            Assert.AreEqual(false, sut.PutPiece(squarePiece, new Vector2Int(1, 1)));
            Assert.AreEqual(true, sut.PutPiece(squarePiece, new Vector2Int(0, 1)));

            Assert.AreEqual(lPiece, sut.PieceAt(new Vector2Int(0, 0)));
            Assert.AreEqual(lPiece, sut.PieceAt(new Vector2Int(1, 0)));
            Assert.AreEqual(lPiece, sut.PieceAt(new Vector2Int(2, 0)));
            Assert.AreEqual(lPiece, sut.PieceAt(new Vector2Int(2, 1)));

            Assert.AreEqual(squarePiece, sut.PieceAt(new Vector2Int(0, 1)));
            Assert.AreEqual(squarePiece, sut.PieceAt(new Vector2Int(1, 1)));
            Assert.AreEqual(squarePiece, sut.PieceAt(new Vector2Int(0, 2)));
            Assert.AreEqual(squarePiece, sut.PieceAt(new Vector2Int(1, 2)));

            Assert.AreEqual(new Vector2Int(0, 1), squarePiece.origin);
            Assert.AreEqual(new Vector2Int(0, 0), lPiece.origin);

            Assert.AreEqual(new Vector2Int(0, 0), sut.CellAt(new Vector2Int(0, 0)).pieceLocation);
            Assert.AreEqual(new Vector2Int(1, 0), sut.CellAt(new Vector2Int(1, 0)).pieceLocation);
            Assert.AreEqual(new Vector2Int(2, 0), sut.CellAt(new Vector2Int(2, 0)).pieceLocation);

            Assert.AreEqual(new Vector2Int(0, 0), sut.CellAt(new Vector2Int(0, 1)).pieceLocation);
            Assert.AreEqual(new Vector2Int(1, 0), sut.CellAt(new Vector2Int(1, 1)).pieceLocation);

            Assert.IsTrue(sut.IsCellBlockedAt(new Vector2Int(0, 0)));
            Assert.IsFalse(sut.IsCellBlockedAt(new Vector2Int(2, 2)));

            Assert.IsTrue(sut.IsPieceBlockedAt(new Vector2Int(0, 1), squarePiece));

            var excludeList = new HashSet <MatrixPiece>();

            excludeList.Add(squarePiece);
            Assert.IsFalse(sut.IsPieceBlockedAt(new Vector2Int(0, 1), squarePiece, excludeList));
            Assert.IsTrue(sut.IsPieceBlockedAt(new Vector2Int(1, 1), squarePiece, excludeList));

            sut.RemovePiece(squarePiece);
            Assert.IsFalse(sut.IsPieceBlockedAt(new Vector2Int(0, 1), squarePiece));

            Assert.AreEqual(null, sut.CellAt(new Vector2Int(0, 1)).piece);
            Assert.AreEqual(null, sut.CellAt(new Vector2Int(1, 1)).piece);
            Assert.AreEqual(null, sut.CellAt(new Vector2Int(0, 2)).piece);
            Assert.AreEqual(null, sut.CellAt(new Vector2Int(1, 2)).piece);
        }