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