2014-12-07 1 views
0

В отладчике я проверил, что moveAmount равен 1, когда он должен быть, но когда я получаю оператор if в классе, он выполняет второй оператор if, который требует movementAmount будет 10.Неверное выражение «если» вызвало ошибочные результаты

Объект My Point, позиция, заканчивается как плюс плюс один дополнительный, так что координата Y оказывается равной 11, а не 10, я думаю, что это может быть частью проблемы.

Класс:

public partial class Robot 
{ 
    public string direction = "north"; 
    private Point position = new Point(0, 0); 
    private int movementAmount = 1; 

    public Robot() {} 

    public void moveRobot() 
    { 
     if (direction == "north" || direction == "North" & movementAmount == 1) 
     { 
      position.Y += movementAmount; 
     } 
     if (direction == "north" || direction == "North" & movementAmount == 10) 
     { 
      position.Y += movementAmount; 
     } 
     if (direction == "east" || direction == "East" & movementAmount == 1) 
     { 
      position.X += movementAmount; 
     } 
     if (direction == "east" || direction == "East" & movementAmount == 10) 
     { 
      position.X += movementAmount; 
     } 
     if (direction == "south" || direction == "South" & movementAmount == 1) 
     { 
      position.Y -= movementAmount; 
     } 
     if (direction == "south" || direction == "South" & movementAmount == 10) 
     { 
      position.Y -= movementAmount; 
     } 
     if (direction == "west" || direction == "West" & movementAmount == 1) 
     { 
      position.X -= movementAmount; 
     } 
     if (direction == "west" || direction == "West" & movementAmount == 10) 
     { 
      position.X -= movementAmount; 
     } 
    } 

    public Point Position 
    { 
     get 
     { 
      return position; 
     } 
    } 

    public int MovementAmount 
    { 
     get 
     { 
      return movementAmount; 
     } 
     set 
     { 
      movementAmount = value; 
      if (movementAmount != 1 & movementAmount != 10) 
      { 
       throw new ArgumentOutOfRangeException("Must be 1 or 10"); 
      } 
     } 
    } 
} 

} 

Основная программа:

public partial class frmSimpleRobot : Form 
{ 
    public frmSimpleRobot() 
    { 
     InitializeComponent(); 
    } 

    Robot arrow = new Robot(); 

    private void btnGoOne_Click(object sender, EventArgs e) 
    { 
     arrow.MovementAmount = 1; 
    } 

    private void btnGoTen_Click(object sender, EventArgs e) 
    { 
     arrow.MovementAmount = 10; 
    } 

    private void btnNorth_Click(object sender, EventArgs e) 
    { 
     arrow.direction = "north"; 
     arrow.moveRobot(); 
     lblRobotPos.Text = "(X=" + arrow.Position.X.ToString() + ", " + "Y=" + arrow.Position.Y.ToString() + ")"; 
    } 

    private void btnEast_Click(object sender, EventArgs e) 
    { 
     arrow.direction = "east"; 
     arrow.moveRobot(); 
     lblRobotPos.Text = "(X=" + arrow.Position.X.ToString() + ", " + "Y=" + arrow.Position.Y.ToString() + ")"; 
    } 

    private void btnSouth_Click(object sender, EventArgs e) 
    { 
     arrow.direction = "south"; 
     arrow.moveRobot(); 
     lblRobotPos.Text = "(X=" + arrow.Position.X.ToString() + ", " + "Y=" + arrow.Position.Y.ToString() + ")"; 
    } 

    private void btnWest_Click(object sender, EventArgs e) 
    { 
     arrow.direction = "west"; 
     arrow.moveRobot(); 
     lblRobotPos.Text = "(X=" + arrow.Position.X.ToString() + ", " + "Y=" + arrow.Position.Y.ToString() + ")"; 
    } 


} 

}

помощь, пожалуйста?

+0

Когда 'direction ==" north "', значение 'movementAmount' не имеет большого значения. Используйте '()' –

+0

@AlexBell: Как могут быть истинны оба «направления ==» на север «' ** и ** 'направление ==« Север »? –

+0

Лучше всего использовать либо «else if», либо «switch», как указано ниже. С уважением, –

ответ

4

Вы должны были положить выражения || в круглые скобки. Оператор & (и оператор &&, который вы фактически должны были использовать) имеет более высокий приоритет, поэтому до тех пор, пока соответствующая строка направления соответствует, все выражение было истинным.

Сказали, что этот код просто сумасшедший (никакого преступления не было :)). Трудно читать, неэффективно и подвержено ошибкам (например, ваш вопрос). Попробуйте что-нибудь подобное вместо этого:

public void moveRobot() 
{ 
    switch (direction) 
    { 
    case "north": 
    case "North": 
     position.Y += movementAmount; 
     break; 
    case "east": 
    case "East": 
     position.X += movementAmount; 
     break; 
    case "south": 
    case "South": 
     position.Y -= movementAmount; 
     break; 
    case "west": 
    case "West": 
     position.X -= movementAmount; 
     break; 
    } 
} 

Еще лучше было бы сделать direction в enum вместо string, чтобы убедиться, что вы всегда получите правильное значение.

+3

'переключатель (direction.ToLower())'? –

+2

Вышеупомянутое больше соответствует исходному коду OP. Обратите внимание: если вы будете использовать нижний регистр, вы должны называть 'direction.ToLowerInvariant()'. Но это расточительно, поскольку он (относительно дорого) создает новый экземпляр 'string' только для целей сравнения, когда оператор' switch' может обрабатывать параметры просто отлично. Кроме того, при вызове 'ToLower()' разрешено использовать такие вещи, как «NoRTH» и т. Д., Когда исходный код этого не сделал. Независимо от того, разумно ли это определить из данного кода. Использование 'enum' (которое я предложил) сделает весь вопрос спорным. –

+1

использование перечисления определенно лучше, как вы указали всегда действительное значение. – DRapp

 Смежные вопросы

  • Нет связанных вопросов^_^