如何将这 4 个循环函数简化为 1 个函数?
How to simplify this 4 loop functions into 1 function?
我有运动。一个 int[8][8] 国际象棋网格。我必须找出白色是否可以带走黑色。
输入是:(小写=黑色,大写=白色)
tc.drf.t
ppp.pppp
...p...c
.....f..
..C..P..
..P.D.P.
PP.....P
T.F.RFCT
对于qeen/towers,我使用了一个循环来检查每个方向(top/bottom/left/right),现在有4个简单的循环函数,看起来差不多。
我只想拥有一个功能,但找不到方法。
有什么想法吗?
static boolean attackRowRt(String[] board, int y, int fromX){
for(int x=fromX+1; x<=7; x++){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
static boolean attackRowLt(String[] board, int y, int fromX){
for(int x=fromX-1; x>=0; x--){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
static boolean attackColBtm(String[] board, int x, int fromY){
for(int y=fromY+1; y<=7; y++){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
static boolean attackColTop(String[] board, int x, int fromY){
for(int y=fromY-1; y>=0; y--){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
您的所有四个方法共享三行代码,这些代码可以提取到一个单独的方法中,您可以从当前方法中调用该方法(如果您反转与 [=11 的比较,则可以将其简化为两行代码=]).所以基本上有一个单独的方法来执行以下操作并从您的方法中调用它:
char attacked = board[y].charAt(x);
if(attacked != '.') {
return Character.isLowerCase(attacked);
}
此外,你的方法是成对的:attackColTop()
和attackRowLt
是一样的,另外两个方法也是一样的。如果唯一的区别是您传递给方法的参数的值,则您不需要有两个执行相同操作的方法:您可以将这两个方法归为一个并使用适当的值调用它。
每个方法的逻辑都是一样的,只是走的方向不同。因此,通过将其作为参数传递,您可以在所有方向上重复使用相同的方法:
static boolean attackLine(String[] board, int fromY, int fromX, int deltaX, int deltaY) {
int x = fromX + deltaX;
int y = fromY + deltaY;
while (true) {
if (x <0 || x > 7 || y <0 || y > 7) {
// outside board, this is the end
return false;
}
System.out.println(String.format("checking (x,y):(%d,%d)", x, y));
char attacked = board[y].charAt(x);
if (attacked != '.')
{
System.out.println(String.format("piece found at (x,y):(%d,%d)", x, y));
return Character.isLowerCase(attacked);
}
x += deltaX;
y += deltaY;
}
}
public static void main(String[] args) {
String[] board = new String[] { //
"tc.drf.t", //
"ppp.pppp", //
"...p...c", //
".....f..", //
"..C..P..", //
"..P.D.P.", //
"PP.....P", //
"T.F.RFCT" };
// white queen left up
System.out.println("" + attackLine(board, 7, 4, -1, -1));
// white queen right up
System.out.println("" + attackLine(board, 7, 4, 1, -1));
// white queen left down
System.out.println("" + attackLine(board, 7, 4, -1, 1));
// white queen right down
System.out.println("" + attackLine(board, 7, 4, 1, 1));
// white tower up
System.out.println("" + attackLine(board, 7, 0, 0, -1));
}
我有运动。一个 int[8][8] 国际象棋网格。我必须找出白色是否可以带走黑色。 输入是:(小写=黑色,大写=白色)
tc.drf.t
ppp.pppp
...p...c
.....f..
..C..P..
..P.D.P.
PP.....P
T.F.RFCT
对于qeen/towers,我使用了一个循环来检查每个方向(top/bottom/left/right),现在有4个简单的循环函数,看起来差不多。 我只想拥有一个功能,但找不到方法。 有什么想法吗?
static boolean attackRowRt(String[] board, int y, int fromX){
for(int x=fromX+1; x<=7; x++){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
static boolean attackRowLt(String[] board, int y, int fromX){
for(int x=fromX-1; x>=0; x--){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
static boolean attackColBtm(String[] board, int x, int fromY){
for(int y=fromY+1; y<=7; y++){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
static boolean attackColTop(String[] board, int x, int fromY){
for(int y=fromY-1; y>=0; y--){
char attacked = board[y].charAt(x);
if(attacked == '.') continue;
return Character.isLowerCase(attacked);
}
return false;
}
您的所有四个方法共享三行代码,这些代码可以提取到一个单独的方法中,您可以从当前方法中调用该方法(如果您反转与 [=11 的比较,则可以将其简化为两行代码=]).所以基本上有一个单独的方法来执行以下操作并从您的方法中调用它:
char attacked = board[y].charAt(x);
if(attacked != '.') {
return Character.isLowerCase(attacked);
}
此外,你的方法是成对的:attackColTop()
和attackRowLt
是一样的,另外两个方法也是一样的。如果唯一的区别是您传递给方法的参数的值,则您不需要有两个执行相同操作的方法:您可以将这两个方法归为一个并使用适当的值调用它。
每个方法的逻辑都是一样的,只是走的方向不同。因此,通过将其作为参数传递,您可以在所有方向上重复使用相同的方法:
static boolean attackLine(String[] board, int fromY, int fromX, int deltaX, int deltaY) {
int x = fromX + deltaX;
int y = fromY + deltaY;
while (true) {
if (x <0 || x > 7 || y <0 || y > 7) {
// outside board, this is the end
return false;
}
System.out.println(String.format("checking (x,y):(%d,%d)", x, y));
char attacked = board[y].charAt(x);
if (attacked != '.')
{
System.out.println(String.format("piece found at (x,y):(%d,%d)", x, y));
return Character.isLowerCase(attacked);
}
x += deltaX;
y += deltaY;
}
}
public static void main(String[] args) {
String[] board = new String[] { //
"tc.drf.t", //
"ppp.pppp", //
"...p...c", //
".....f..", //
"..C..P..", //
"..P.D.P.", //
"PP.....P", //
"T.F.RFCT" };
// white queen left up
System.out.println("" + attackLine(board, 7, 4, -1, -1));
// white queen right up
System.out.println("" + attackLine(board, 7, 4, 1, -1));
// white queen left down
System.out.println("" + attackLine(board, 7, 4, -1, 1));
// white queen right down
System.out.println("" + attackLine(board, 7, 4, 1, 1));
// white tower up
System.out.println("" + attackLine(board, 7, 0, 0, -1));
}