0

我正在处理我的 Java 作业 - Minesweeper 游戏克隆。我有两个几乎相同的(只有文本标签和文本框架不同)方法 gameWon() 和 gameLost() 负责在游戏结束时显示“Game Won!”/“Game Lost”窗口。我知道代码重复是不好的做法,所以我想对其进行优化。问题是我对 OOP 有点陌生,我不确定该怎么做。也许我可以以某种方式将这些方法合并为一个,以便在不同情况下采取不同的行动,或者继承可能会有用。我真的不知道,希望你们中的一些人能帮助我一点。感谢您的回答。

以下是这些方法的代码:

游戏结束

public static void gameOver() {

        F1 = new JFrame("Game Over"); 
        F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

        F1.setSize(360, 120);
        Container content = F1.getContentPane();
        content.setBackground(Color.white);
        content.setLayout(new FlowLayout()); 

        JLabel textLabel = new JLabel("Sorry, you have lost this game! Better luck next time.",SwingConstants.CENTER); 
        textLabel.setPreferredSize(new Dimension(360, 40));
        content.add(textLabel, BorderLayout.CENTER);

        JButton button = new JButton("Exit");
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        }); 
        content.add(button);

        button = new JButton("Restart This Game");  
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                F1.dispose();
                Board.doRepaint();
            }
        });         
        content.add(button);

        button = new JButton("Play Again"); 
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                F1.dispose();
                restartGame();
            }
        });         
        content.add(button);

        F1.setLocationRelativeTo(null);
        F1.setVisible(true); 
    }

游戏赢了

public static void gameWon() {  
   F1 = new JFrame("Game Won"); 
   F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

   F1.setSize(360, 120);
   Container content = F1.getContentPane();
   content.setBackground(Color.white);
   content.setLayout(new FlowLayout()); 

   JLabel textLabel = new JLabel("Congratulations, you have won the game!",SwingConstants.CENTER); 
   textLabel.setPreferredSize(new Dimension(360, 40));
   content.add(textLabel, BorderLayout.CENTER);

   JButton button = new JButton("Exit");
   button.addActionListener(new ActionListener() {

     public void actionPerformed(ActionEvent e)
     {
        System.exit(0);
     }
  }); 
  content.add(button);

  button = new JButton("Restart This Game");    
  button.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
        F1.dispose();
        Board.doRepaint();
    }
  });       
  content.add(button);

  button = new JButton("Play Again");   
  button.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
        F1.dispose();
        restartGame();
    }
  });       
  content.add(button);

  F1.setLocationRelativeTo(null);
  F1.setVisible(true); 
}
4

4 回答 4

1

你应该只有一个方法,调用它gameOver(....),乍一看,你只需要两个参数title,和message。然后,只更改两行代码:

public static void gameOver(final String title, final String message) {
  .....
  F1 = new JFrame(title);
  .....
  JLabel textLabel = new JLabel(message ,SwingConstants.CENTER);
}

然后,不要调用两个方法,而是使用不同的参数调用相同的方法:

gameOver("Game Won", "Congratulations, you have won the game!");
于 2013-05-27T22:33:08.250 回答
1

您可以做的最简单的事情是将标题和消息的字符串作为参数,或者通过一个布尔参数来表示游戏是否已经获胜并在设置字符串的方法中进行布尔测试,例如:

public static void gameOver(boolean won) {
    ....
    F1 = new JFrame(won?"Game Won":"Game Over");
    ....
}
于 2013-05-27T22:33:34.750 回答
0

更仔细地查看代码,仅按照其他答案中的建议传递布尔值或字符串参数是不够的。您必须要做的工作是识别所有(这里:两个)方法通用和不同的代码。在你的情况下,我会想出这个:

  • 标题
  • 信息
  • 按钮 1 消息
  • 按钮 1 监听器
  • 按钮 2 消息
  • 按钮 2 监听器

    public static void showTwoButtonMessage(String title, String message,
     String button1Message, ActionListener listener1,
     String button2Message, ActionListener listener2){
    //...
    }
    

因此,您有一个简洁的小方法,您可以重复使用它来显示任何两个按钮窗口。

于 2013-05-31T15:17:42.310 回答
0
public static void gameEnd(boolean hasWon) {

    String title = hasWon ? "Game Won" : "Game Over";
    F1 = new JFrame(title); 
    F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    F1.setSize(360, 120);
    Container content = F1.getContentPane();
    content.setBackground(Color.white);
    content.setLayout(new FlowLayout()); 

    String message = hasWon ? "Congratulations, you have won the game!" :
          "Sorry, you have lost this game! Better luck next time.";
    JLabel textLabel = new JLabel(message,SwingConstants.CENTER);
    textLabel.setPreferredSize(new Dimension(360, 40));
    content.add(textLabel, BorderLayout.CENTER);

    JButton button = new JButton("Exit");
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
    }); 
    content.add(button);

    button = new JButton("Restart This Game");  
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            F1.dispose();
            Board.doRepaint();
        }
    });         
    content.add(button);

    button = new JButton("Play Again"); 
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            F1.dispose();
            restartGame();
        }
    });         
    content.add(button);

    F1.setLocationRelativeTo(null);
    F1.setVisible(true); 
}
于 2013-05-27T22:32:00.290 回答