/// <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); }
public void Clear() { ID = 0; DirectionQueue.Clear(); Sprite = 0; Name = string.Empty; Guild = string.Empty; }
public void GoUp() { ThrowIfCanNotMove(); var direction = Direction.Up; if (IsDownMoving(Head.CurPosition, BodyFirst.CurPosition)) { direction = TurnBack(); } DirectionQueue.Enqueue(direction); }
public void GoLeft() { ThrowIfCanNotMove(); var direction = Direction.Left; if (IsRightMoving(Head.CurPosition, BodyFirst.CurPosition)) { direction = TurnBack(); } DirectionQueue.Enqueue(direction); }
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}"); } } }
/// <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); }
/// <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; } } }