Optimering i søgeroutine
Hejsa jeg sidder her og bakser lidt med at lave en udgave af "tic tac toe" game som er mere generisk, forstået på den måde at man selv kan sætte størrelsen på brættet (rækker og kolonner), og også selv bestemme det påkrævede antal på række for at vinde spillet.jeg har nu fået bikset en søge routine sammen som virker, dog synes jeg den er noget grim for at sige det mildt, så det jeg søger er en optimering af min routine om det være sig rekursion elleren helt anden teknik er entlig underordnet.
og så lidt kode:
private static final int ROWS = 10;
private static final int COLUMNS = 10;
private static final int NUM_ON_ROW = 5;
private int[][] board;
private boolean matchValues(int first, int second)
{
return first > 0 && second > 0 && first == second;
}
/*
* If there is a winner the number of that one is returned. If
* no winner, a 0 is returned
*/
public int winner()
{
for (int row = 0; row < ROWS; row++) {
for (int column = 0; column < COLUMNS - NUM_ON_ROW + 1; column++) {
boolean found = false;
for (int tic = 1; tic < NUM_ON_ROW; tic++) {
found = matchValues(board[row][column], board[row][column + tic]);
if (!found) {
break;
}
}
if (found) {
return board[row][column];
}
}
}
for (int column = 0; column < COLUMNS; column++) {
for (int row = 0; row < ROWS - NUM_ON_ROW + 1; row++) {
boolean found = false;
for (int tic = 1; tic < NUM_ON_ROW; tic++) {
found = matchValues(board[row][column], board[row + tic][column]);
if (!found) {
break;
}
}
if (found) {
return board[row][column];
}
}
}
for (int row = 0; row < ROWS - NUM_ON_ROW + 1; row++) {
for (int column = 0; column < COLUMNS - NUM_ON_ROW + 1; column++) {
boolean found = false;
for (int tic = 1; tic < NUM_ON_ROW; tic++) {
found = matchValues(board[row][column], board[row + tic][column + tic]);
if (!found) {
break;
}
}
if (found) {
return board[row][column];
}
}
}
for (int row = ROWS - 1; row >= NUM_ON_ROW - 1; row--) {
for (int column = 0; column < COLUMNS - NUM_ON_ROW + 1; column++) {
boolean found = false;
for (int tic = 1; tic < NUM_ON_ROW; tic++) {
found = matchValues(board[row][column], board[row - tic][column + tic]);
if (!found) {
break;
}
}
if (found) {
return board[row][column];
}
}
}
return 0;
}