Ejemplo n.º 1
0
        public virtual void Move(ActionPlayer action)
        {
            if (_movedPlayer != null)
            {
                _movedPlayer();
            }

            bool okDirect = false;

            Coordinate prePosition = new Coordinate(Position.PosX, Position.PosY);    // position before move, previous position, it was create for delete coordinate tank after his move

            switch (action)
            {
            case ActionPlayer.PressRight:
                if (DirectionTank.HasFlag(Direction.Right))
                {
                    okDirect = true;
                }
                else
                {
                    DirectionTank = Direction.Right;
                }
                break;

            case ActionPlayer.PressLeft:
                if (DirectionTank.HasFlag(Direction.Left))
                {
                    okDirect = true;
                }
                else
                {
                    DirectionTank = Direction.Left;
                }
                break;

            case ActionPlayer.PressUp:
                if (DirectionTank.HasFlag(Direction.Up))
                {
                    okDirect = true;
                }
                else
                {
                    DirectionTank = Direction.Up;
                }
                break;

            case ActionPlayer.PressDown:
                if (DirectionTank.HasFlag(Direction.Down))
                {
                    okDirect = true;
                }
                else
                {
                    DirectionTank = Direction.Down;
                }
                break;

            case ActionPlayer.NoAction:
                break;

            default:
                throw new ActionNotFoundException
                          (string.Format("\n{0} Method: Move, Class: Tank, parametrs Action: {1} - not found!!!", DateTime.Now, action));
            }

            if (okDirect && IsPermitMove())
            {
                Position.Move(DirectionTank, Characteristic.MS); // move tank
                DeletePrePosition(prePosition);                  // delete 1 row or 1 column in owner game field
                AddNewPostion(this);                             // add 1 row or 1 column in owner game field
            }
        }
Ejemplo n.º 2
0
        public bool IsPermitMove()
        {
            bool permitOk = true;

            Coordinate permitCoordinate = new Coordinate(Position.PosX, Position.PosY);

            //start posX, posY for tank is upper left  corner
            // new coordinate with direction same tank move new coordinate on step equal movespeed(MS) tank
            switch (DirectionTank)
            {
            case Direction.Right:
                permitCoordinate.PosX = Position.PosX;
                permitCoordinate.PosY = Position.PosY + ConstantValue.WIDTH_TANK;
                break;

            case Direction.Left:
                permitCoordinate.PosX = Position.PosX;
                permitCoordinate.PosY = Position.PosY - 1;
                break;

            case Direction.Up:
                permitCoordinate.PosX = Position.PosX - 1;
                permitCoordinate.PosY = Position.PosY;
                break;

            case Direction.Down:
                permitCoordinate.PosX = Position.PosX + ConstantValue.HEIGHT_TANK;
                permitCoordinate.PosY = Position.PosY;
                break;
            }

            if (!permitCoordinate.IsPermitMoveCoordinate(DirectionTank))
            {
                return(false);
            }

            Coordinate tempForMove = new Coordinate(permitCoordinate);

            if (DirectionTank.HasFlag(Direction.Right) || DirectionTank.HasFlag(Direction.Left))
            {
                for (int permitRow = permitCoordinate.PosX; permitRow < ConstantValue.HEIGHT_TANK
                     + permitCoordinate.PosX; permitRow++)
                {
                    tempForMove.PosX = permitRow;

                    if (_owner.IsContain(tempForMove))
                    {
                        if (!(_owner[tempForMove] is GrassBlock))
                        {
                            permitOk = false;
                            break;
                        }
                    }
                }
            }
            else
            {
                for (int permitCol = permitCoordinate.PosY; permitCol < ConstantValue.WIDTH_TANK
                     + permitCoordinate.PosY; permitCol++)
                {
                    tempForMove.PosY = permitCol;

                    if (_owner.IsContain(tempForMove))
                    {
                        if (!(_owner[tempForMove] is GrassBlock))
                        {
                            permitOk = false;
                            break;
                        }
                    }
                }
            }

            return(permitOk);
        }