【问题标题】:If statements not working as intended如果语句没有按预期工作
【发布时间】:2013-04-12 05:28:37
【问题描述】:

基本上,我目前正在尝试为 Android 制作黑白棋游戏,我的 if 语句让我有点头疼,似乎如果条件适用于不止一个,它只会通过其中一个语句的动作只留下另一个。我的代码如下:

if (check[position] == 0
                            && (check[position - 8] == 2
                                    || check[position + 8] == 2
                                    || check[position + 1] == 2
                                    || check[position - 1] == 2
                                    || check[position - 9] == 2
                                    || check[position + 9] == 2
                                    || check[position - 7] == 2 || check[position + 7] == 2)) {

                        if (check[position + 8] == 2) {
                            for (int i = position; i < 56; i += 8) {
                                if (check[i] == 1) {
                                    for (int j = position; j < i; j += 8) {
                                        check[j] = 1;
                                    }
                                    playerno = 2;
                                    break;
                                } else
                                    break;
                            }
                        } else if (check[position - 8] == 2) {
                            for (int i = position; i > 8; i -= 8) {
                                if (check[i] == 1) {
                                    for (int j = position; j > i; j -= 8) {
                                        check[j] = 1;
                                    }
                                    playerno = 2;
                                    break;
                                } else
                                    break;
                            }
                        } else if (check[position + 1] == 2) {
                            for (int i = position; i < board.length; i++) {
                                if (check[i] == 1) {
                                    for (int j = position; j < i; j++) {
                                        check[j] = 1;
                                    }
                                    playerno = 2;
                                    break;
                                }
                                if (i == 7 || i == 15 || i == 23 || i == 31
                                        || i == 39 || i == 47 || i == 55
                                        || i == 63) {
                                    break;
                                }
                            }
                        } else if (check[position - 1] == 2) {
                            for (int i = position; i > 0; i--) {
                                if (check[i] == 1) {
                                    for (int j = position; j > i; j--) {
                                        check[j] = 1;
                                    }
                                    playerno = 2;
                                    break;
                                }
                                if (i == 0 || i == 8 || i == 16 || i == 24
                                        || i == 32 || i == 40 || i == 48
                                        || i == 56) {
                                    break;
                                }
                            }
                        }

Check 只是一个 int 数组,它记录了哪个玩家在棋盘上持有该特定棋子 现在由于某种原因,如果我的位置满足其中两个条件,它只会通过一个 if 语句,而且通常不是这个产生游戏将其视为无效动作,我想知道如何解决这个问题?

【问题讨论】:

  • 你试过用递归来解决这个问题吗?向外扫描即可。
  • 正确的格式发生了什么?
  • 如果你的位置在棋盘的顶部或底部,这些条件会溢出数组。
  • 对不起,我什至不会尝试这个。请不要使用一维数组来模拟二维板。解决这个问题,然后再回来问有什么问题。
  • 使用一维数组是有原因的,如果你阅读了这个问题,你会看到我正在为 Android 编程,我一直被教导最好尝试使用在 Android 中尽可能使用一维数组,所以这就是我学会的方法。

标签: java android if-statement reversi


【解决方案1】:

AlexR 是对的,你的逻辑太复杂了,而且格式让你的代码极难阅读,也很难调试。

我不会为您解决所有问题,但这里有一些建议的更改。大多数情况下,您应该将您的逻辑分解成小块。

编辑:根据我上面的评论,将板实现为一个类:

class Board {
    private final int[] check = new int[BOARD_WIDTH*BOARD_HEIGHT];
    public Board() { for (int i=0; i < BOARD_WIDTH*BOARD_HEIGHT; check[i++] = 0); }
    public final int get(int x, int y) { return check[y*BOARD_WIDTH + x]; }
    public final void set(int x, int y, int val) { check[y*BOARD_WIDTH+x] = val; }

    /**
     * Return true if this square is free
     */
    public final boolean isFree(int x, int y) {
      if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) return false;
      int position = y*BOARD_WIDTH + x;
      return check[position] == 0;
    }

    /**
     * Return true if this square is occupied by opponent
     */
    public final boolean isOccupiedBy2(int x, int y) {
      if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) return false;
      int position = y*BOARD_WIDTH + x;
      return check[position] == 2;
    }

    /**
     * Return true if any neighboring square is occupied by opponent
     */
    final boolean isNeighborOccupied(int x, int y) {
      for (int i=x-1; i >= x+1; ++i)
        for (int j=y-1; j >= y+1; ++j)
          if ((i != x || j != y) && isOccupiedBy2(i,j)) return true;
      return false;
    }
    // etc.
}

现在从那里开始,重新编写上面的逻辑:

if (board.isFree(x,y) && board.isNeighborOccupied(x,y)) {
    if (board.isOccupiedBy2(x,y+1)) {
        ...
    }
    else if (board.isOccupiedBy2(x,y-1)) {
        ...
    }
    else if (board.isOccupiedBy2(x+1,y)) {
        ...
    }
    else if (board.isOccupiedBy2(x-1,y)) {
        ...
    }
}

看看这有多容易阅读?调试起来也容易得多。

最后,看看 Eran 的帖子是否没有解决您的错误。这四个条件中只有一个会被执行。由于您只测试八个相邻方格中的四个,我猜您的意思是测试上、左、下、右,所以也许第二个“else”是一个错误。

【讨论】:

    【解决方案2】:

    如果我的职位满足其中两个条件 遍历 if 语句之一

    你指的是这个说法吗?

    if (conditionA) {
      BlockA
    } else if (conditionB) {
      BlockB
    }  else if (conditionC) {
      BlockC
    }  else if (conditionD) {
      BlockD
    }
    

    如果你这样做了,难怪只有一个 if 块被执行。仅执行第一个条件为 true 的块。

    如果要允许执行多个块,请将其更改为:

    if (conditionA) {
      BlockA
    } 
    if (conditionB) {
      BlockB
    } 
    if (conditionC) {
      BlockC
    }
    if (conditionD) {
      BlockD
    }
    

    【讨论】:

      【解决方案3】:

      首先,您的条件极其复杂且难以阅读。尝试简化它们。尝试将一个复杂的条件分解为几个更简单的表达式。并使用调试器。

      【讨论】:

      • 这不应该是评论吗?
      猜你喜欢
      • 2021-06-14
      • 2012-08-16
      • 2011-11-29
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多