思考outLoud条件if语句比。声明

时间:2014-03-22 19:54:36

标签: java for-loop while-loop conditional

我用java工作了一年多一点。我最近已经建立了一个tic tac tow游戏作为我的java类的任务。在讲师评分之后,他围绕我的验证方法逻辑写了一条评论。即使我得到100%,他说我的验证方法中的逻辑太麻烦了。他说我会查看for语句或while语句,以便清除验证方法中的一些代码。这是我的问题是,有没有办法将所有条件if语句放入for循环或while循环?如果是这样,我想知道背后有什么逻辑。这个程序有一组五个数组,但在这个验证方法中我只使用了JButton数组。

JButton button = new Jbutton[9];

public void validate()
    {
        if(button[0].getText().equals(button[1].getText()) && button[1].getText().equals(button[2].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[0].getText());
            gameOver();
            return;
        }
        else if(button[3].getText().equals(button[4].getText()) && button[4].getText().equals(button[5].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[3].getText());
            gameOver();
            return;
        }
        else if(button[6].getText().equals(button[7].getText()) && button[7].getText().equals(button[8].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[6].getText());
            gameOver();
            return;
        }
        else if(button[0].getText().equals(button[3].getText()) && button[3].getText().equals(button[6].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[0].getText());
            gameOver();
            return;
        }
        else if(button[1].getText().equals(button[4].getText()) && button[4].getText().equals(button[7].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[1].getText());
            gameOver();
            return;
        }
        else if(button[1].getText().equals(button[4].getText()) && button[4].getText().equals(button[7].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[1].getText());
            gameOver();
            return;
        }
        else if(button[2].getText().equals(button[5].getText()) && button[5].getText().equals(button[8].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[2].getText());
            gameOver();
            return;
        }
        else if(button[0].getText().equals(button[4].getText()) && button[4].getText().equals(button[8].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[0].getText());
            gameOver();
            return;
        }
        else if(button[2].getText().equals(button[4].getText()) && button[4].getText().equals(button[6].getText()))
        {
            JOptionPane.showMessageDialog(null,"Thank you the winner is" + button[2].getText());
            gameOver();
            return;
        }

        int i;

        for(i=0;i<button.length;i++)
        {
            if(button[i].isEnabled())
            {
                break;
            }
        }


        if(i == button.length)
        {
            JOptionPane.showMessageDialog(null,"This was a Draw");
        }
    }

1 个答案:

答案 0 :(得分:0)

如果有一种方法可以使用按钮组合的数学进展来找到获胜者,那么您可以在循环中提取检查。

您还可以通过提取重复性任务来重构代码,例如(如已建议的那样)执行此操作:

  • 在单独的函数中提取按钮的if条件
  • 在单独的函数中提取消息
  • 在单独的函数中提取返回索引并调用gameOver()并仅返回一次

您的代码将更具可读性和更短:

    private Boolean checkConditionFor(int button1, int button2, int button3) {
        return button[button1].getText().equals(button[button2].getText()) 
            && button[button2].getText().equals(button[button3].getText());
    }

    private void messageFor(int id) {
        JOptionPane.showMessageDialog(null, "Thank you the winner is" + button[id].getText());
        gameOver();
    }

    private int winner() {
        if(checkConditionFor(0, 1, 2) || 
           checkConditionFor(0, 3, 6) || 
           checkConditionFor(0, 4, 8)) { return 0; }
        if(checkConditionFor(3, 4, 5)) { return 3; }
        if(checkConditionFor(6, 7, 8)) { return 6; }
        if(checkConditionFor(1, 4, 7)) { return 1; }
        if(checkConditionFor(2, 5, 8) || 
           checkConditionFor(2, 4, 6)) { return 2; }
    }

现在只需调用validate方法中的函数:

    messageFor(winner());
    return;