コード例 #1
0
ファイル: RoboField.cs プロジェクト: SeeSharpSoft/MonoRobots
        public static RoboField CreateField(FieldType type, RoboBoard board)
        {
            RoboField field = CreateField(type);

            field.Board = board;
            return(field);
        }
コード例 #2
0
        private void SetField(RoboField[,] fields, RoboField field, int x, int y)
        {
            field.X     = x;
            field.Y     = y;
            field.Board = this;

            fields[x, y] = field;
        }
コード例 #3
0
ファイル: RoboField.cs プロジェクト: SeeSharpSoft/MonoRobots
        public static RoboField DecodeField(char encoded)
        {
            if (RoboField.FIELDCODING.ContainsKey(encoded))
            {
                return(RoboField.CreateField(RoboField.FIELDCODING[encoded]));
            }

            return(RoboField.CreateField((FieldType)((int)encoded - (int)'a')));
        }
コード例 #4
0
        private void Clear(RoboField[,] fields, Size size)
        {
            if (size == null)
            {
                return;
            }

            for (int y = 0; y < size.Height; y++)
            {
                for (int x = 0; x < size.Width; x++)
                {
                    SetField(fields, RoboField.CreateField(FieldType.Empty), x, y);
                }
            }
        }
コード例 #5
0
        public void MirrorFieldsVertical()
        {
            RoboField[,] fields = new RoboField[Size.Width, Size.Height];

            if (Fields != null)
            {
                for (int i = 0; i < Size.Width; i++)
                {
                    for (int j = 0; j < Size.Height; j++)
                    {
                        Fields[i, j].MirrorVertical();
                        fields[i, Size.Height - j - 1] = Fields[i, j];
                    }
                }
            }

            _fields = fields;
        }
コード例 #6
0
        public void MirrorFieldsHorizontal()
        {
            RoboField[,] fields = new RoboField[Size.Width, Size.Height];

            if (Fields != null)
            {
                for (int i = 0; i < Size.Width; i++)
                {
                    for (int j = 0; j < Size.Height; j++)
                    {
                        Fields[i, j].MirrorHorizontal();
                        fields[Size.Width - i - 1, j] = Fields[i, j];
                    }
                }
            }

            _fields = fields;
        }
コード例 #7
0
        public void RotateFields()
        {
            RoboField[,] fields = new RoboField[Size.Height, Size.Width];

            if (Fields != null)
            {
                for (int i = 0; i < Size.Width; i++)
                {
                    for (int j = 0; j < Size.Height; j++)
                    {
                        Fields[i, j].Rotate();
                        fields[Size.Height - j - 1, i] = Fields[i, j];
                    }
                }
            }

            _size   = new Size(Size.Height, Size.Width);
            _fields = fields;
        }
コード例 #8
0
        public void Load(TextReader reader, Difficulty difficulty)
        {
            Difficulty = difficulty;

            Size = GetSize(reader.ReadLine());

            for (int y = 0; y < Size.Height; y++)
            {
                for (int x = 0; x < Size.Width; x++)
                {
                    RoboField field = null;
                    if (y == 0 || x == 0 || y == Size.Height - 1 || x == Size.Width - 1)
                    {
                        field = (difficulty == Difficulty.Hard ?
                                 RoboField.CreateField(FieldType.Hole) : RoboField.DecodeField('p'));
                    }
                    else
                    {
                        char encoded = (char)reader.Read();
                        if (encoded == '\r' || encoded == '\n')
                        {
                            x--;
                            continue;
                        }
                        field = (difficulty == Difficulty.Easy &&
                                 (encoded == RoboField.EncodeField(FieldType.Hole) ||
                                  encoded == RoboField.EncodeField(FieldType.Oil) ||
                                  encoded == RoboField.EncodeField(FieldType.ScrapLeftRight) ||
                                  encoded == RoboField.EncodeField(FieldType.ScrapUpDown))) ?
                                RoboField.DecodeField(' ') :
                                RoboField.DecodeField(encoded);
                    }

                    SetField(field, x, y);
                }
                //new line?!
                if (y > 0 && y < Size.Height - 1)
                {
                    reader.Read();
                }
            }
        }
コード例 #9
0
ファイル: RoboAction.cs プロジェクト: SeeSharpSoft/MonoRobots
        /// <summary>
        /// Performs a robot movement.
        /// </summary>
        /// <param name="position">Position of the robot before the action.</param>
        /// <param name="board">Board to perform action on.</param>
        /// <returns>Position of robot after performing the action.</returns>
        public override RoboPosition PerformAction(RoboPosition position, RoboBoard board)
        {
            RoboField field = board.GetField(position);

            if (!field.CanLeave(this.Direction))
            {
                return(position);
            }

            RoboPosition result = PerformAction(position);

            RoboField neighbor = board.GetField(result);

            if (neighbor == null || !neighbor.CanEnter(RoboRotation.Rotate(this.Direction, Rotation.Around)))
            {
                return(position);
            }

            return(result);
        }
コード例 #10
0
        public void SetSize(int x, int y)
        {
            RoboField[,] fields = new RoboField[x + 2, y + 2];

            Clear(fields, new Size(x + 2, y + 2));

            if (Fields != null)
            {
                for (int i = 0; i < x + 2 && i < Size.Width; i++)
                {
                    for (int j = 0; j < y + 2 && j < Size.Height; j++)
                    {
                        fields[i, j] = Fields[i, j];
                    }
                }
            }

            _size   = new Size(x + 2, y + 2);
            _fields = fields;
        }
コード例 #11
0
        private RoboBoard GetBoard(RoboBoard original, RoboPlayer actualPlayer, IEnumerable <RoboPlayer> players)
        {
            RoboBoard board = Board.CopyBoard();

            if (Interaction == RoboPlayerInteraction.Blocked)
            {
                foreach (RoboPlayer player in players)
                {
                    if (player == actualPlayer ||
                        board.GetField(player.Position).IsDestination ||
                        player.Position.IsDead)
                    {
                        continue;
                    }

                    board.Fields[player.Position.X, player.Position.Y] =
                        RoboField.CreateField(FieldType.WallDown | FieldType.WallUp | FieldType.WallLeft | FieldType.WallRight);
                }
            }

            return(board);
        }
コード例 #12
0
ファイル: RoboField.cs プロジェクト: SeeSharpSoft/MonoRobots
 public override string ToString()
 {
     return(RoboField.EncodeField(FieldType).ToString());
 }
コード例 #13
0
ファイル: RoboField.cs プロジェクト: SeeSharpSoft/MonoRobots
        public static RoboField CreateField(FieldType type)
        {
            RoboField result = Activator.CreateInstance(GetTypeOf(type), type) as RoboField;

            return(result);
        }
コード例 #14
0
        public RoboPosition GetStartPosition()
        {
            RoboField start = GetStart();

            return(new RoboPosition(start.X, start.Y, start.StartDirection));
        }
コード例 #15
0
 public void SetField(RoboField field, int x, int y)
 {
     SetField(Fields, field, x, y);
 }