예제 #1
0
        public void TestNumberOfShipFields()
        {
            int numRows    = 4;
            int numColumns = 3;
            var grid       = new BimaruGrid(numRows, numColumns);

            Assert.IsTrue(grid.NumberOfUndeterminedFieldsPerColumn.SequenceEqual(new int[numColumns].InitValues(numRows)));
            Assert.IsTrue(grid.NumberOfShipFieldsPerColumn.SequenceEqual(new int[numColumns].InitValues(0)));
            Assert.IsTrue(grid.NumberOfUndeterminedFieldsPerRow.SequenceEqual(new int[numRows].InitValues(numColumns)));
            Assert.IsTrue(grid.NumberOfShipFieldsPerRow.SequenceEqual(new int[numRows].InitValues(0)));

            // SUW
            // UUS
            // UUU
            // SUU
            grid[new GridPoint(0, 0)] = BimaruValue.SHIP_SINGLE;
            grid[new GridPoint(3, 2)] = BimaruValue.WATER;
            grid[new GridPoint(3, 0)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(2, 2)] = BimaruValue.SHIP_SINGLE;
            grid[new GridPoint(2, 2)] = BimaruValue.WATER;
            grid[new GridPoint(2, 2)] = BimaruValue.SHIP_UNDETERMINED;

            Assert.IsTrue(grid.NumberOfUndeterminedFieldsPerColumn.SequenceEqual(new int[] { 2, 4, 2 }));
            Assert.IsTrue(grid.NumberOfShipFieldsPerColumn.SequenceEqual(new int[] { 2, 0, 1 }));
            Assert.IsTrue(grid.NumberOfUndeterminedFieldsPerRow.SequenceEqual(new int[] { 2, 3, 2, 1 }));
            Assert.IsTrue(grid.NumberOfShipFieldsPerRow.SequenceEqual(new int[] { 1, 0, 1, 1 }));
        }
예제 #2
0
        public void TestShipCountChaos()
        {
            var grid = new BimaruGrid(3, 3);

            // USU
            // SSS
            // USU
            grid[new GridPoint(0, 1)] = BimaruValue.SHIP_CONT_UP;
            grid[new GridPoint(1, 0)] = BimaruValue.SHIP_CONT_RIGHT;
            grid[new GridPoint(1, 1)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(1, 2)] = BimaruValue.SHIP_CONT_LEFT;
            grid[new GridPoint(2, 1)] = BimaruValue.SHIP_CONT_DOWN;

            Assert.IsTrue(new int[] { 0, 0, 0, 2 }.SequenceEqual(grid.NumberOfShipsPerLength));

            grid[new GridPoint(1, 1)] = BimaruValue.SHIP_SINGLE;

            Assert.IsTrue(new int[] { 0, 1, 0, 0 }.SequenceEqual(grid.NumberOfShipsPerLength));

            grid[new GridPoint(1, 1)] = BimaruValue.SHIP_CONT_RIGHT;

            Assert.IsTrue(new int[] { 0, 0, 1, 0 }.SequenceEqual(grid.NumberOfShipsPerLength));

            grid[new GridPoint(1, 1)] = BimaruValue.SHIP_MIDDLE;

            Assert.IsTrue(new int[] { 0, 0, 0, 2 }.SequenceEqual(grid.NumberOfShipsPerLength));
        }
예제 #3
0
        private IEnumerable <GridPoint> GetSomeOffGridPoints(BimaruGrid grid)
        {
            yield return(new GridPoint(0, -1));

            yield return(new GridPoint(-1, 0));

            yield return(new GridPoint(-1, -1));

            yield return(new GridPoint(0, grid.NumberOfColumns));

            yield return(new GridPoint(-1, grid.NumberOfColumns - 1));

            yield return(new GridPoint(-1, grid.NumberOfColumns));

            yield return(new GridPoint(grid.NumberOfRows, 0));

            yield return(new GridPoint(grid.NumberOfRows - 1, -1));

            yield return(new GridPoint(grid.NumberOfRows, -1));

            yield return(new GridPoint(grid.NumberOfRows - 1, grid.NumberOfColumns));

            yield return(new GridPoint(grid.NumberOfRows, grid.NumberOfColumns - 1));

            yield return(new GridPoint(grid.NumberOfRows, grid.NumberOfColumns));
        }
예제 #4
0
        public virtual object Clone()
        {
            BimaruGrid clonedGrid = new BimaruGrid(NumberOfRows, NumberOfColumns);

            clonedGrid.OverwriteWith(this);

            return(clonedGrid);
        }
예제 #5
0
        public void TestDefaultFieldValues()
        {
            var grid = new BimaruGrid(3, 4);

            foreach (var p in grid.AllPoints())
            {
                Assert.AreEqual(BimaruValue.UNDETERMINED, grid[p]);
            }
        }
예제 #6
0
        public void TestGetOffGridFieldValues()
        {
            var grid = new BimaruGrid(3, 4);

            foreach (var p in GetSomeOffGridPoints(grid))
            {
                Assert.AreEqual(BimaruValue.WATER, grid[p]);
            }
        }
예제 #7
0
        public IGame GenerateEmptyGame(int numRows, int numColumns)
        {
            var rowTally     = new GridTally(numRows);
            var columnTally  = new GridTally(numColumns);
            var shipSettings = new ShipTarget();
            var grid         = new BimaruGrid(numRows, numColumns);

            return(new Game(rowTally, columnTally, shipSettings, grid));
        }
예제 #8
0
        public void TestSetOffGridFieldValuesToWater()
        {
            var grid = new BimaruGrid(3, 4);

            foreach (var p in GetSomeOffGridPoints(grid))
            {
                grid[p] = BimaruValue.WATER;
            }
        }
예제 #9
0
        public void TestIsValidOffGrid()
        {
            var grid = new BimaruGrid(2, 2);

            Assert.IsTrue(grid.IsValid);
            grid[new GridPoint(0, 0)] = BimaruValue.SHIP_CONT_DOWN;
            grid[new GridPoint(0, 1)] = BimaruValue.WATER;
            Assert.IsFalse(grid.IsValid);
            grid[new GridPoint(0, 0)] = BimaruValue.WATER;
            Assert.IsTrue(grid.IsValid);
        }
예제 #10
0
        public void TestIsValidHorizontal()
        {
            var grid = new BimaruGrid(2, 2);

            Assert.IsTrue(grid.IsValid);
            grid[new GridPoint(0, 0)] = BimaruValue.SHIP_SINGLE;
            grid[new GridPoint(0, 1)] = BimaruValue.SHIP_UNDETERMINED;
            Assert.IsFalse(grid.IsValid);
            grid[new GridPoint(0, 0)] = BimaruValue.WATER;
            Assert.IsTrue(grid.IsValid);
        }
예제 #11
0
        public void TestSetOffGridFieldValuesToNotWater()
        {
            var grid = new BimaruGrid(3, 4);

            foreach (var p in GetSomeOffGridPoints(grid))
            {
                foreach (var v in BimaruValues.AllBimaruValues().Where(v => v != BimaruValue.WATER))
                {
                    Assert.ThrowsException <InvalidFieldValueChange>(() => grid[p] = v);
                }
            }
        }
예제 #12
0
        public void TestFillUndeterminedFieldsColumnToNo()
        {
            var grid = new BimaruGrid(2, 3);

            grid.FillUndeterminedFieldsColumn(1, BimaruValueConstraint.NO);

            BimaruValue[,] expectedFieldValues = new BimaruValue[2, 3]
            {
                { BimaruValue.UNDETERMINED, BimaruValue.UNDETERMINED, BimaruValue.UNDETERMINED },
                { BimaruValue.UNDETERMINED, BimaruValue.UNDETERMINED, BimaruValue.UNDETERMINED }
            };

            grid.AssertEqual(expectedFieldValues);
        }
예제 #13
0
        public void TestFillUndeterminedFieldsRowToShip()
        {
            var grid = new BimaruGrid(2, 3);

            grid.FillUndeterminedFieldsRow(1, BimaruValueConstraint.SHIP);

            BimaruValue[,] expectedFieldValues = new BimaruValue[2, 3]
            {
                { BimaruValue.UNDETERMINED, BimaruValue.UNDETERMINED, BimaruValue.UNDETERMINED },
                { BimaruValue.SHIP_UNDETERMINED, BimaruValue.SHIP_UNDETERMINED, BimaruValue.SHIP_UNDETERMINED }
            };

            grid.AssertEqual(expectedFieldValues);
        }
예제 #14
0
        public void TestNullArguments()
        {
            int numRows    = 4;
            int numColumns = 3;

            var rowTally    = new GridTally(numRows);
            var columnTally = new GridTally(numColumns);
            var shipTarget  = new ShipTarget();
            var grid        = new BimaruGrid(numRows, numColumns);

            Assert.ThrowsException <ArgumentNullException>(() => new Game(null, columnTally, shipTarget, grid));
            Assert.ThrowsException <ArgumentNullException>(() => new Game(rowTally, null, shipTarget, grid));
            Assert.ThrowsException <ArgumentNullException>(() => new Game(rowTally, columnTally, null, grid));
            Assert.ThrowsException <ArgumentNullException>(() => new Game(rowTally, columnTally, shipTarget, null));
        }
예제 #15
0
        public void TestOverwriteWith()
        {
            var grid = new BimaruGrid(1, 2);
            var p0   = new GridPoint(0, 0);
            var p1   = new GridPoint(0, 1);

            grid[p0] = BimaruValue.SHIP_SINGLE;
            grid[p1] = BimaruValue.UNDETERMINED;

            var overwrittenGrid = new BimaruGrid(2, 3);

            overwrittenGrid.OverwriteWith(grid);

            grid.AssertEqual(overwrittenGrid);
        }
예제 #16
0
        public void TestShipCountOne()
        {
            var grid = new BimaruGrid(4, 3);

            // SWU
            // UUS
            // UUU
            // SUU
            grid[new GridPoint(0, 0)] = BimaruValue.SHIP_SINGLE;
            grid[new GridPoint(3, 0)] = BimaruValue.SHIP_CONT_DOWN;
            grid[new GridPoint(3, 1)] = BimaruValue.WATER;
            grid[new GridPoint(2, 2)] = BimaruValue.SHIP_SINGLE;

            Assert.IsTrue(new int[] { 0, 2, 0, 0, 0 }.SequenceEqual(grid.NumberOfShipsPerLength));
        }
예제 #17
0
        public void TestFillUndeterminedFieldsColumnPreset()
        {
            var grid = new BimaruGrid(2, 3);

            grid[new GridPoint(0, 1)] = BimaruValue.WATER;

            grid.FillUndeterminedFieldsColumn(1, BimaruValueConstraint.SHIP);

            BimaruValue[,] expectedFieldValues = new BimaruValue[2, 3]
            {
                { BimaruValue.UNDETERMINED, BimaruValue.WATER, BimaruValue.UNDETERMINED },
                { BimaruValue.UNDETERMINED, BimaruValue.SHIP_UNDETERMINED, BimaruValue.UNDETERMINED }
            };

            grid.AssertEqual(expectedFieldValues);
        }
예제 #18
0
        public void TestShipCountTwo()
        {
            var grid = new BimaruGrid(4, 3);

            // SWU
            // SUU
            // USS
            // UUU
            grid[new GridPoint(2, 0)] = BimaruValue.SHIP_CONT_UP;
            grid[new GridPoint(3, 0)] = BimaruValue.SHIP_CONT_DOWN;
            grid[new GridPoint(3, 1)] = BimaruValue.WATER;
            grid[new GridPoint(1, 1)] = BimaruValue.SHIP_CONT_RIGHT;
            grid[new GridPoint(1, 2)] = BimaruValue.SHIP_CONT_LEFT;

            Assert.IsTrue(new int[] { 0, 0, 2, 0, 0 }.SequenceEqual(grid.NumberOfShipsPerLength));
        }
예제 #19
0
        public void TestColumnTallyGridMismatch()
        {
            GridTally rowTally = new GridTally(4);
            GridTally columnTally;
            var       shipTarget = new ShipTarget();
            var       grid       = new BimaruGrid(4, 3);

            columnTally = new GridTally(2);
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => new Game(rowTally, columnTally, shipTarget, grid));

            columnTally = new GridTally(3);
            new Game(rowTally, columnTally, shipTarget, grid);

            columnTally = new GridTally(4);
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => new Game(rowTally, columnTally, shipTarget, grid));
        }
예제 #20
0
        public void TestClone()
        {
            var grid = new BimaruGrid(1, 2);
            var p0   = new GridPoint(0, 0);
            var p1   = new GridPoint(0, 1);

            grid[p0] = BimaruValue.SHIP_SINGLE;
            grid[p1] = BimaruValue.UNDETERMINED;

            BimaruGrid clonedGrid = (BimaruGrid)grid.Clone();

            grid.AssertEqual(clonedGrid);

            grid[p1] = BimaruValue.SHIP_SINGLE;

            Assert.AreEqual(BimaruValue.UNDETERMINED, clonedGrid[p1]);
        }
예제 #21
0
        public void TestShipCountFour()
        {
            var grid = new BimaruGrid(4, 3);

            // SUS
            // UUS
            // SUS
            // SUS
            grid[new GridPoint(0, 0)] = BimaruValue.SHIP_CONT_UP;
            grid[new GridPoint(1, 0)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(3, 0)] = BimaruValue.SHIP_CONT_DOWN;

            grid[new GridPoint(0, 2)] = BimaruValue.SHIP_CONT_UP;
            grid[new GridPoint(1, 2)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(2, 2)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(3, 2)] = BimaruValue.SHIP_CONT_DOWN;

            Assert.IsTrue(new int[] { 0, 0, 0, 0, 1 }.SequenceEqual(grid.NumberOfShipsPerLength));
        }
예제 #22
0
        public void TestShipCountThree()
        {
            var grid = new BimaruGrid(4, 3);

            // SSS
            // UUS
            // SUS
            // SUS
            grid[new GridPoint(0, 0)] = BimaruValue.SHIP_CONT_UP;
            grid[new GridPoint(1, 0)] = BimaruValue.SHIP_UNDETERMINED;
            grid[new GridPoint(3, 0)] = BimaruValue.SHIP_CONT_RIGHT;
            grid[new GridPoint(3, 1)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(3, 2)] = BimaruValue.SHIP_CONT_LEFT;
            grid[new GridPoint(0, 2)] = BimaruValue.SHIP_CONT_UP;
            grid[new GridPoint(1, 2)] = BimaruValue.SHIP_MIDDLE;
            grid[new GridPoint(2, 2)] = BimaruValue.SHIP_CONT_DOWN;

            Assert.IsTrue(new int[] { 0, 0, 0, 2, 0 }.SequenceEqual(grid.NumberOfShipsPerLength));
        }
예제 #23
0
        public void TestIsFullyDetermined()
        {
            var grid = new BimaruGrid(1, 2);
            var p0   = new GridPoint(0, 0);
            var p1   = new GridPoint(0, 1);

            Assert.IsFalse(grid.IsFullyDetermined);
            grid[p0] = BimaruValue.WATER;
            grid[p1] = BimaruValue.SHIP_UNDETERMINED;
            Assert.IsFalse(grid.IsFullyDetermined);
            grid[p1] = BimaruValue.SHIP_CONT_DOWN;
            Assert.IsTrue(grid.IsFullyDetermined);
            grid[p1] = BimaruValue.SHIP_CONT_LEFT;
            Assert.IsTrue(grid.IsFullyDetermined);
            grid[p1] = BimaruValue.SHIP_CONT_RIGHT;
            Assert.IsTrue(grid.IsFullyDetermined);
            grid[p1] = BimaruValue.SHIP_CONT_UP;
            Assert.IsTrue(grid.IsFullyDetermined);
            grid[p1] = BimaruValue.SHIP_MIDDLE;
            Assert.IsTrue(grid.IsFullyDetermined);
            grid[p1] = BimaruValue.SHIP_SINGLE;
            Assert.IsTrue(grid.IsFullyDetermined);
        }