[英]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.