嵌套的if语句C++

Aer*_*rus 2 c++ if-statement nested

我正在用C++编写一个Snake程序(使用JNI进行可视化),并且有效的移动按钮要么是(逆时针移动90°)要么是向右移动(顺时针移动90°).

在游戏循环的每个循环中,我从GUI界面检索一个键事件,并根据该键事件移动我的蛇,这是我这样做的方式:

if(key_event != NULL){
    if(key_event == LEFT){
        if(moveDirection == UP || moveDirection == DOWN){
            moveDirection = LEFT;
            (moveDirection == UP) ? /*change turn after head*/ : /*change turn after head*/;
        } //else if (moveDir == LEFT || RIGHT)
    } //else if (key_event == RIGHT)
    //...
}
Run Code Online (Sandbox Code Playgroud)

if with:/*change turn after head*/是因为如果蛇向下移动并向左移动则转弯处有另一个图形,然后向上向左移动.

这导致很多if语句的和不很readible,所以我不知道是否有解决嵌套的if语句这样的通用方法.

编辑:
key_event和moveDirection是枚举.

小智 6

感觉就像有限状态机是你需要的.您可以将键定义为事件,将蛇位置定义为状态,并根据事件(按下的键)描述从一种状态到另一种状态的转换.这将解决问题并使用转换表而不是嵌套if语句,并使您的实现不易出错.Boost Statechart Library可以帮助您快速实施.


raR*_*aRa 5

我本人会有另一个功能来应用此举.

if(key_event != NULL){
    if(key_event == LEFT){
       moveLeft();
    }
    ...
}

void moveLeft()
{
  switch(moveDirection)
  {
    case UP:
    case DOWN:
      moveDirection = LEFT;
      break;
    case ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用switch case,在我看来这个例子更容易阅读而不是if .. else if .. else if ...

关键是,当您有嵌套循环时,看看是否可以将其中的一些分解为函数以简化问题.

我希望这有帮助.