簡體   English   中英

如何在棋盤游戲中使用循環編寫較短的代碼

[英]How can I write shorter code by using loops in a board game

我為“ X”和“ o”游戲編寫代碼,現在一切正常,但是例如,我想優化代碼並使函數更短

我計划了游戲,以便玩家與計算機對戰,而計算機的優先級將是首先獲勝,然后阻止對手並最終填充空白單元格。因此,我在列上編寫了函數,在行上編寫了函數,在對角線上編寫了函數,並且使用了許多條件,我想知道您是否知道如何通過使用循環或附加功能(例如theat函數)來縮短代碼,例如theat函數檢查計算機是否可以連續贏3次

    public static  boolean ComuterrowWin(char [][] board){
        if((board[0][0]=='O' && board[0][1]=='O') && board[0][2]!='X'){
            board[0][2]='O'; return true;}
        else if((board[0][1]=='O' && board[0][2]=='O') && board[0][0]!='X'){
            board[0][0]='O'; return true;}
        else if((board[0][0]=='O' && board[0][2]=='O') && board[0][1]!='X'){
            board[0][1]='O'; return true;}
        else if((board[1][0]=='O' && board[1][1]=='O') && board[1][2]!='X'){
            board[1][2]='O'; return true;}
        else if((board[1][1]=='O' && board[1][2]=='O' && board[1][0]!='X')){
            board[1][0]='O'; return true;}
        else if((board[1][0]=='O' && board[1][2]=='O') && board[1][1]!='X'){
            board[1][1]='O'; return true;}
        else if((board[2][0]=='O' && board[2][1]=='O') && board[2][2]!='X'){
            board[2][2]='O'; return true;}
        else if((board[2][1]=='O' && board[2][2]=='O') && board[2][0]!='X'){
            board[2][0]='O'; return true;}
        else if((board[2][0]=='O' && board[2][2]=='O') && board[2][1]!='X'){
            board[2][1]='O'; return true;}
        return false;
    }

如果要保留數據結構,可以嘗試此操作。 只需將行至少組織成一個循環:

public static  boolean ComuterrowWin(char [][] board){
    for (int row=0; row<=2; row++) {
        if((board[row][0]=='O' && board[row][1]=='O') && board[row][2]!='X'){
            board[row][2]='O'; return true;}
        if((board[row][1]=='O' && board[row][2]=='O') && board[row][0]!='X'){
            board[row][0]='O'; return true;}
        if((board[row][0]=='O' && board[row][2]=='O') && board[row][1]!='X'){
            board[row][1]='O'; return true;}
    }
    return false;
}

好的 :-)。 這個如何 ?

public static  boolean ComuterrowWin(char [][] board){
    for (int row=0; row<=2; row++) {
        for (int col=0; col<=2; col++) {
            if((board[row][(col+1)%3]=='O' && board[row][(col+2)%3]=='O') && board[row][col]!='X'){
                board[row][col]='O'; return true;}
        }
    }
    return false;
}

改編@galcoholic的答案,這個怎么樣,

public static  boolean ComuterrowWin(char [][] board){
        int[][] win = {{0, 1, 2}, {1, 2, 0}, {0, 2, 1}};
        for (int row = 0; row < 3; row++) {
            for(int i = 0; i < 3; i++){
                if((board[row][win[i][0]]=='O' && board[row][win[i][1]]=='O') && board[row][win[i][2]]!='X'){
                    board[row][win[i][2]]='O';
                    return true;}
            }
        }
        return false;
    }

為了解決對角線問題,我建議您這樣做,

public static  boolean ComdiagonalgWin(char [][] board){

        // For main diagonal, x_index = y_index
        for(int row = 0; row < 3; row++){
            if((board[row % 3][row % 3] == 'O' && board[(row + 1) % 3][(row + 1) % 3]=='O') && board[(row + 2) % 3][(row + 2) % 3]!='X')
                board[(row + 2) % 3][(row + 2) % 3] = 'O'; return true;
        }
        // For other diagonal, x_index + y_index = 2(or the number of rows you have - 1)
        for(int row = 0, col = 2; row < 3 && col >= 0; row++, col--){
            if((board[row % 3][col % 3] == 'O' && board[(row + 1) % 3][(col + 1) % 3]=='O') && board[(row + 2) % 3][(col + 2) % 3]!='X')
                board[(row + 2) % 3][(col + 2) % 3] = 'O'; return true;
        }

        return false;
    }

你可以看到,遞增運算符,使用在增量和增量再發生的地方第一unincremented值。 遞增的值將在下一次使用變量時使用,這是我在兩種情況下的用法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM