示例#1
0
        public void Normalise()
        {
            var report = new TestReport();
            var p      = Puzzle.Builder.DefaultTestPuzzle();

            Assert.True(p.Definition.Wall.Equals(p[0, 0]));
            Assert.True(p.Definition.Void == p[1, 1]);
            Assert.True(p.Definition.Player == p[4, 4]);
            Assert.True(p[4, 4].IsPlayer);

            Assert.Equal(new VectorInt2(4, 4), p.Player.Position);

            var norm = StaticAnalysis.Normalise(p);

            report.WriteLine(norm.ToString());
            Assert.Equal(new TestReport(@"###########
####.######
###..###..#
##.X......#
#...PX.#..#
###.X###..#
###..#OO..#
###.##O#.##
##......###
##.....####
###########
"), report);
        }
        private BitStream Encode(Puzzle puzzle)
        {
            var norm = StaticAnalysis.RemoveOuter(StaticAnalysis.Normalise(puzzle));
            var bs   = new BitStream();

            foreach (var cell in RunLength.Encode(norm.ForEachTile(), this))
            {
                var s = cell.Item1.Cell;
                if (s == puzzle.Definition.Void ||
                    s == puzzle.Definition.Wall)
                {
                    EncodeItem(cell, Control.None, bs);
                }

                if (s == puzzle.Definition.Floor)
                {
                    EncodeItem(cell, Control.Floor, bs);
                }

                if (s == puzzle.Definition.Goal)
                {
                    bs.AddRange(BitStream.Encode(Control.Goal));
                }
                if (s == puzzle.Definition.Crate)
                {
                    bs.AddRange(BitStream.Encode(Control.Crate));
                }
                if (s == puzzle.Definition.CrateGoal)
                {
                    bs.AddRange(BitStream.Encode(Control.CrateGoal));
                }
                if (s == puzzle.Definition.Player)
                {
                    bs.AddRange(BitStream.Encode(Control.Player));
                }
                if (s == puzzle.Definition.PlayerGoal)
                {
                    bs.AddRange(BitStream.Encode(Control.PlayerGoal));
                }
            }

            bs.AddRange(BitStream.Encode(Control.End));
            return(bs);
        }