【问题标题】:Java - Cleaning up lots of if statementsJava - 清理大量 if 语句
【发布时间】:2016-05-31 05:30:55
【问题描述】:

我正在用 Java 编写一个类似于 2048 游戏的小项目,它几乎完全基于数组操作。我为我遇到的问题写了一个解决方案,它运行良好,但是代码非常混乱。如果有人可以帮助清理它,也许通过使用不同的技术或其他东西,它只是很多 if 语句。

// This bit gets rid of the empty tiles between numbers.
    // Eg {2,2,0,4} becomes {2,2,4,0}.
    for(int i =1; i<row.length; i++) {

        if(row[i-1] == 0)
        {
            row[i-1] = row[i];
            row[i] = 0;
        }
    }

    for(int j=row.length-1; j>=1; j--) {
        if(row[j-1] == 0 ) {
            row[j-1] = row[j];
            row[j] = 0;
        }
    }

    int nonEmpty = 0; // Count the number of non empty tiles
    for(int i=0; i<row.length; i++) {
        if(row[i] != 0)
            nonEmpty++;
    }

    if(nonEmpty == 2) {
        if(row[1] == row[0]) {
            row[0] *= 2;
            row[1] = 0;
        }
    }
    else if(nonEmpty == 3) {
        if(row[1] == row[0]) {
            row[0] *= 2;
            row[1] = row[2];
            row[2] = 0;
        }
        else if(row[2] == row[1]) {
            row[1] *= 2;
            row[2] = 0;
        }
    }
    else if(nonEmpty==4) {
        if(row[1] == row[0]) {
            row[0] *= 2;
            row[1] = 0;

            if(row[2] == row[3]) {
                row[2] *= 2;
                row[3] = 0;
            }
        }
        else if(row[2] == row[1]) {
            row[1] *= 2;
            row[2] = row[3];
            row[3] = 0;
        }
        else if(row[3] == row[2]) {
            row[2] *= 2;
            row[3] = 0;
        }

    }

    // Get rid of 0s between numbers again.
for(int i =1; i<row.length; i++) {

        if(row[i-1] == 0)
        {
            row[i-1] = row[i];
            row[i] = 0;
        }
    }

    for(int j=row.length-1; j>=1; j--) {
        if(row[j-1] == 0 ) {
            row[j-1] = row[j];
            row[j] = 0;
        }
    }

这里的每个 if/else if 语句都是至关重要的,因为它可以处理所有情况。我不是要求有人把它全部清理干净,但如果我能提供一些指针或例子,那就太好了。

谢谢大家

【问题讨论】:

  • 对我来说看起来不错。不管你有多少 if/else/conditional statements。
  • 是的,我也觉得很酷
  • 你可以使用 swtich() 代替所有 if-else if 语句
  • 当您似乎在迭代相同的数组时,您能否将您的一些逻辑组合成更少的for 循环?
  • 您是否考虑过 Java 中的集合框架。我希望 Linked List 能为您解决问题

标签: java if-statement nested-loops


【解决方案1】:

试试这个

void set(int indexFrom, int... values) {
    for (int v : values)
        row[indexFrom++] = v;
}

然后重写

if(row[1] == row[0]) {
    row[0] *= 2;
    row[1] = row[2];
    row[2] = 0;
}
else if(row[2] == row[1]) {
    row[1] *= 2;
    row[2] = 0;
}

if (row[1] == row[0])
    set(0, row[0] * 2, row[2], 0);
else if (row[2] == row[1])
    set(1, row[1] * 2, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多