Esempio n. 1
0
        /// <summary>
        /// Turns the snake to oposite side.
        /// </summary>
        private Direction TurnBack()
        {
            //the snake can't move if crashed
            if (IsCrashed)
            {
                return(Direction.None);
            }

            int curSnakePosition = 0;
            var reversePosition  = SnakeBodyWithHead.Count - 1;

            while (curSnakePosition < reversePosition)
            {
                var curPosition = SnakeBodyWithHead[curSnakePosition].CurPosition;

                SnakeBodyWithHead[curSnakePosition].CurPosition  = SnakeBodyWithHead[reversePosition].CurPosition;
                SnakeBodyWithHead[curSnakePosition].PrevPosition = null;

                SnakeBodyWithHead[reversePosition].CurPosition  = curPosition;
                SnakeBodyWithHead[reversePosition].PrevPosition = null;

                ++curSnakePosition;
                reversePosition = SnakeBodyWithHead.Count - curSnakePosition - 1;
            }

            Direction direction = GetDirestion(Head.CurPosition, BodyFirst.CurPosition);

            Head.Direction = direction;
            Tail.Direction = direction;
            WriteLine($"TurnBack: direction - {direction}");

            DirectionQueue.Dequeue();

            return(direction);
        }
Esempio n. 2
0
 public void Clear()
 {
     ID = 0;
     DirectionQueue.Clear();
     Sprite = 0;
     Name   = string.Empty;
     Guild  = string.Empty;
 }
Esempio n. 3
0
        public void GoUp()
        {
            ThrowIfCanNotMove();
            var direction = Direction.Up;

            if (IsDownMoving(Head.CurPosition, BodyFirst.CurPosition))
            {
                direction = TurnBack();
            }
            DirectionQueue.Enqueue(direction);
        }
Esempio n. 4
0
        public void GoLeft()
        {
            ThrowIfCanNotMove();
            var direction = Direction.Left;

            if (IsRightMoving(Head.CurPosition, BodyFirst.CurPosition))
            {
                direction = TurnBack();
            }
            DirectionQueue.Enqueue(direction);
        }
Esempio n. 5
0
        public async void Run(bool isRuning)
        {
            _isRuning = isRuning;
            while (_isRuning && !IsCrashed)
            {
                try
                {
                    Direction = DirectionQueue.Dequeue(Direction);
                    Move(Direction);

                    await TaskEx.Delay(Speed);
                }
                catch (Exception e)
                {
                    throw new Exception($"Something wrong in Run method of Snake class. {e.StackTrace}");
                }
            }
        }
Esempio n. 6
0
        /// <summary>
        /// 移動する方向を考え、結果を返却します。
        /// </summary>
        /// <param name="context">フィールド状態</param>
        /// <returns>移動方向</returns>
        public Direction Think(FieldContext context)
        {
            Debug.Assert(this.HasInjected, "依存性の注入が完了していません");

            var direction = Direction.None;
            var me        = context.OperationPlayer;

            if (context.FieldEvent[me.ToInt()] == FieldEvent.None)
            {
                if (this.RequiredEnqueue)
                {
                    var directions = this.SearchLogic.Search(context);
                    foreach (var d in directions)
                    {
                        this.DirectionQueue.Enqueue(d);
                    }
                    this.RequiredEnqueue = false;
                }

                if (this.DirectionQueue.Count() > 0)
                {
                    // スライムを動かす
                    direction = DirectionQueue.Dequeue();
                }
                else
                {
                    // 移動が終わったのでひたすら下移動
                    direction = Direction.Down;
                }
            }
            else
            {
                // キューの破棄
                this.DirectionQueue.Clear();
                this.RequiredEnqueue = true;
            }

            return(direction);
        }
Esempio n. 7
0
        /// <summary>
        /// Processa o movimento da sprite.
        /// </summary>
        public void ProcessMovement()
        {
            if (DirectionQueue.Count > 0)
            {
                if (!Move)
                {
                    Dir = (Direction)DirectionQueue.Dequeue();

                    if (Dir == Direction.Up)
                    {
                        OffSetY = 16;
                    }

                    if (Dir == Direction.Down)
                    {
                        OffSetY = -16;
                    }

                    if (Dir == Direction.Left)
                    {
                        OffSetX = 16;
                    }

                    if (Dir == Direction.Right)
                    {
                        OffSetX = -16;
                    }

                    Move = true;
                }
            }

            if (!Move)
            {
                return;
            }

            if (Environment.TickCount >= this.moveTime + 35)
            {
                moveTime = Environment.TickCount;

                switch (Dir)
                {
                case Direction.Up:
                    Y       -= 4;
                    OffSetY -= 4;
                    if (OffSetY <= 0)
                    {
                        Move       = false;
                        Coordinate = new Point(Coordinate.X, Coordinate.Y - 1);
                    }
                    break;

                case Direction.Down:
                    Y       += 4;
                    OffSetY += 4;
                    if (OffSetY >= 0)
                    {
                        Move       = false;
                        Coordinate = new Point(Coordinate.X, Coordinate.Y + 1);
                    }
                    break;

                case Direction.Left:
                    X       -= 4;
                    OffSetX -= 4;
                    if (OffSetX <= 0)
                    {
                        Move       = false;
                        Coordinate = new Point(Coordinate.X - 1, Coordinate.Y);
                    }
                    break;

                case Direction.Right:
                    X       += 4;
                    OffSetX += 4;
                    if (OffSetX >= 0)
                    {
                        Move       = false;
                        Coordinate = new Point(Coordinate.X + 1, Coordinate.Y);
                    }
                    break;
                }
            }
        }