亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使 if 語句更小并避免在 java 中出于相同原因使用太多循環

如何使 if 語句更小并避免在 java 中出于相同原因使用太多循環

泛舟湖上清波郎朗 2022-10-26 16:49:03
此代碼用于我的一項任務(連接四個)。我需要使這段代碼少于 25 行,并使“if”語句更短。此外,該板有 6 行和 7 列。我的代碼試圖弄清楚一個人是否贏了。我試圖將所有循環合并為一個循環,但這并沒有給我一個正確的答案。public static boolean determineWin(String[][] board) {    boolean won = false;    for (int i = 0; i < 6; i++) {        for (int j = 0; j < 4; j++) {            if (board[i][j] != ". ") {                if (board[i][j].equals(board[i][j+1]) && board[i][j+1].equals(board[i][j+2]) && board[i][j+2].equals(board[i][j+3])) {                    won = true;                    break;                }            }        }    }    for (int i = 5; i > 2; i--) {        for (int j = 6; j > 2; j--) {            if (board[i][j] != ". ") {                if (board[i][j].equals(board[i-1][j-1]) && board[i-1][j-1].equals(board[i-2][j-2]) && board[i-2][j-2].equals(board[i-3][j-3])){                    won = true;                    break;                }            }        }        for (int j = 0; j < 4; j++) {            if (board[i][j] != ". ") {                if (board[i][j].equals(board[i-1][j+1]) && board[i-1][j+1].equals(board[i-2][j+2]) && board[i-2][j+2].equals(board[i-3][j+3])){                    won = true;                    break;                }            }        }        for (int j = 0; j < 7; j++) {            if (board[i][j] != ". ") {                if (board[i][j].equals(board[i-1][j]) && board[i-1][j].equals(board[i-2][j]) && board[i-2][j].equals(board[i-3][j])){                    won = true;                    break;                }            }        }    }    return won;}結果應該與上面的代碼相同,但我只需要代碼稍微小一點(25 行)并且 if 語句更短。
查看完整描述

1 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

上面的代碼效率低下,因為它有 4 個單獨for的循環(用于跟蹤您可以獲勝的 4 個方向:1)從左到右,2)從上到下,3)對角線 4)對角線/其他方向 -AND- 因為if語句必須檢查 4 個連續的位置。


為了優化解決方案,您可以認識到您可以在棋盤中的每個位置保持已經發生的情況,對于您可以贏得的 4 個可能方向中的每一個(4 個唯一狀態)state。how many consecutive same pieces


以在水平方向獲勝為例。當您沿著同一行從左向右移動時,如果左側的塊相同,則狀態計數器將增加 1。如果有“.”,則計數器重置為 0。如果有不同的棋子,則計數器重置為 1。如果這 4 個狀態計數器中的任何一個變為 4,則您處于獲勝位置。


下面的代碼對于水平(狀態變量0)和垂直(狀態變量1)的獲勝方向是完整的。將完成表示每個對角線方向的兩行(狀態變量 2 和 3)留作練習。


public static boolean determineWin(String[][] board) {


    int[][][] counters = new int[board[0].length+1][board.length+1][4];


    for (int y=0; y<board.length; y++) {

        for (int x=0; x<board[0].length; x++) {

            if (!board[y][x].equals(".")) {

                counters[y][x][0] = (x>0 && board[y][x].equals(board[y][x-1])) ? counters[y][x-1][0] + 1 : 1;

                counters[y][x][1] = (y>0 && board[y][x].equals(board[y-1][x])) ? counters[y-1][x][1] + 1 : 1;

                // Diagonal 1 TODO:  counters[y][x][2] = 

                // Diagonal 2 TODO:  counters[y][x][3] = 

                if (counters[y][x][0] == 4 || counters[y][x][1] == 4 || counters[y][x][2] == 4 || counters[y][x][3] == 4)

                    return true;

            }

        }

    }

    return false;

}


查看完整回答
反對 回復 2022-10-26
  • 1 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號