我将如何在代码中使用抽象类或接口来最大程度地减少重复?

时间:2019-04-28 23:56:42

标签: java

我目前正在尝试为基本的四连网游戏重构代码。

我已经注意到我的play.java文件中有很多重复内容,涉及到知道哪个玩家水平或垂直创建了获胜模式。

由于水平和垂直获胜标准保持不变,我该如何创建抽象类或接口以最大程度地减少代码重复?

play.java

public class play {

private Connect4Game connect;
public play(Connect4Game connect) {
    this.connect=connect;
}

public void playGame() {
    System.out.println("Welcome to Connect 4");
    System.out.println("To play the game type in the number of the column you want to drop you counter in");
    System.out.println("Player One = r Player 2 = y");
    System.out.println("");


    board boardObj = new board(connect);
    boardObj.printBoard();


    boolean win = false;

    while(!win){

        // player 1
        String userInput = getUserInput();
        int move = Integer.parseInt(userInput);

        counter counterObj = new counter(connect);
        counterObj.placeCounter('r', move);


        boolean hasWon = false;
        int count = 0;

        // check horizontal
        for(int i=0; i<connect.board.length; i++){
            for(int j=0; j<connect.board[i].length; j++){
                if(connect.board[i][j] == 'r'){
                    count = count + 1;
                    if(count == 4){
                        hasWon = true;

                    }
                }
                else{
                    count = 0;
                }
            }

        }

        // check vertical 
        count = 0;
        for(int i=0; i<connect.board[0].length; i++){
            for(int j=0; j<connect.board.length; j++){
                if(connect.board[j][i] == 'r'){
                    count = count + 1;
                    if(count >= 4){
                        hasWon = true;

                    }
                }
                else{
                    count = 0;
                }
            }

        }

        boardObj.printBoard();
        if(hasWon){
            win = true;
            System.out.println("You Have Won!!!");
        }

        else {

            //player 2
            userInput = getUserInput();
            move = Integer.parseInt(userInput);


            counterObj.placeCounter('y',move);


            hasWon = false;
            count = 0;

            // check horizontal
            for(int i=0; i<connect.board.length; i++){
                for(int j=0; j<connect.board[i].length; j++){
                    if(connect.board[i][j] == 'y'){
                        count = count + 1;
                        if(count >= 4){
                            hasWon = true;

                        }
                    }
                    else{
                        count = 0;
                    }
                }

            }

            // check vertical 
            count = 0;
            for(int i=0; i<connect.board[0].length; i++){
                for(int j=0; j<connect.board.length; j++){
                    if(connect.board[j][i] == 'y'){
                        count = count + 1;
                        if(count >= 4){
                            hasWon = true;

                        }
                    }
                    else{
                        count = 0; 
                    }
                }

            }
            boardObj.printBoard();
            if(hasWon){
                win = true;
                System.out.println("You Have Won!!!");
            }
        }

    }

}



public String getUserInput(){
    String toReturn = null;
    try{            
        toReturn = connect.input.readLine();
    }
    catch(Exception e){

    }
    return toReturn;
}

}

2 个答案:

答案 0 :(得分:4)

在这种情况下都不会有帮助。抽象类将用于建立大多数子类将支持的预定方法。它还将包括方法的方法签名,这在实现可能有所不同的地方很有用,具体取决于如何使用该类。即使那样,预定义的方法也可以根据需要被覆盖。

接口仅通过签名(抽象方法声明)形式化所需类的方法,以实现要在用户和类之间执行合同的类。

由于您没有创建多个类,因此没有任何好处。

我最好的建议是将水平和垂直检查合并到方法中,并根据需要添加其他方法以减少重复代码。

答案 1 :(得分:2)

使用提取方法开始重构。您的两组嵌套循环可以转换为方法。也许您可以通过调用四次的方法将其简化为一组嵌套循环。