我已经使用java一年多了。我最近为我的java课做了一个井字游戏作为作业。老师评分后,他对我的验证方法逻辑写了评论。即使我得到了100%他说我的验证方法中的逻辑太麻烦了。他说,我检查for语句或while语句是为了清理验证方法中的一些代码。这是我的问题真的有办法把所有条件if语句放到for循环或while循环中吗?如果是的话,我想知道这背后的逻辑是什么。这个程序有一组5个数组,但是在这个验证方法中,我只处理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");
}
}
如果有一种方法可以使用按钮组合的数学级数找到获胜者,那么您可能可以在循环中提取检查。
您还可以通过提取重复的任务来重构您的代码,例如(如已经建议的)这样做:
- 在单独的函数中提取按钮的
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;