I have to implement connect4 with a simulated intelligence. It already works, but it is very slow. We have to get al the threats of the two Player. a threat is 3 coins ina row with a empty field between or at the ends of the row. I want to calculate only the new threats after every move and delete the threats which are no longer thhreats. I wrote some methods to check every direction if there is a new threat from the last move.
private Field row(int row, int column, String Player) {
Field field = null;
if(column - 1 >= 0 && column + 1 < board.getColumn() && board.getValue(row, column-1).equals(Player)
&& board.getValue(row, column+1).equals(Player)) {
if(column -2 >= 0 &&board.getValue(row, column-2).equals(" ")) {
return field = new Field(row, column -2);
}
else if(column + 2 < board.getColumn()&& board.getValue(row, column+2).equals(" ")) {
return field = new Field(row, column +2);
}
}
else if(column - 2 >= 0 && board.getValue(row, column-1).equals(Player)
&& board.getValue(row, column-2).equals(Player)) {
if(column -3 >= 0 &&board.getValue(row, column-3).equals(" ")) {
return field = new Field(row, column -3);
}
else if(column +1 < board.getColumn()&& board.getValue(row, column+1).equals(" ")) {
return field = new Field(row, column +1);
}
}
else if(column +2 < board.getColumn() && board.getValue(row, column+1).equals(Player)
&& board.getValue(row, column+2).equals(Player)) {
if(column -1 >= 0 &&board.getValue(row, column-1).equals(" ")) {
return field = new Field(row, column -1);
}
else if(column +3 < board.getColumn()&& board.getValue(row, column+3).equals(" ")) {
return field = new Field(row, column +3);
}
}
else if(column - 2 >= 0 && column + 1 < board.getColumn() && board.getValue(row, column-2).equals(Player)
&& board.getValue(row, column+1).equals(Player)) {
if(column -1 >= 0 &&board.getValue(row, column-1).equals(" ")) {
return field = new Field(row, column -1);
}
}
else if(column - 1 >= 0 && column +2 < board.getColumn() && board.getValue(row, column-1).equals(Player)
&& board.getValue(row, column+2).equals(Player)) {
if(column +1 < board.getColumn() &&board.getValue(row, column+1).equals(" ")) {
return field = new Field(row, column +1);
}
}
else if(column - 3 >= 0 && board.getValue(row, column-2).equals(Player) && board.getValue(row, column-3).equals(Player)) {
if(board.getValue(row, column-1).equals(" ")) {
return new Field (row, column -1);
}
}
else if(column-3 >= 0 && board.getValue(row, column-1).equals(Player) && board.getValue(row, column-3).equals(Player)) {
if(board.getValue(row, column-2).equals(" ")) {
return new Field(row, column - 2);
}
}
else if(column + 3 < board.getColumn() && board.getValue(row, column+2).equals(Player) && board.getValue(row, column+3).equals(Player)) {
if(board.getValue(row, column+1).equals(" ")) {
return new Field(row, column + 1);
}
}
else if(column + 3 < board.getColumn() && board.getValue(row, column+1).equals(Player) && board.getValue(row, column+3).equals(Player)) {
if(board.getValue(row, column+2).equals(" ")) {
return new Field(row, column +2);
}
}
return field;
}
private Field column(int row, int column, String Player) {
Field field = null;
if (row + 2 < board.getRow()
&& board.getValue(row + 1, column).equals(Player)
&& board.getValue(row + 2, column).equals(Player)) {
if(row-1 >= 0 && board.getValue(row-1, column).equals(" ")) {
return field = new Field(row-1, column);
}
}
return field;
}
private Field diagonalRight(int row, int column, String Player) {
Field field = null;
if(row - 1 >= 0 && column - 1 >= 0 && row + 1 < board.getRow() && column + 1 < board.getColumn()
&& board.getValue(row+ 1, column-1).equals(Player)&& board.getValue(row-1, column+1).equals(Player)) {
if(row + 2 < board.getRow() && column - 2 >= 0 && board.getValue(row+2, column-2).equals(" ")) {
return field = new Field(row+2, column - 2);
}
else if (row - 2 >=0 && column + 2 < board.getColumn() && board.getValue(row-2, column+2).equals(" ")) {
return field = new Field(row-2, column + 2);
}
}
else if(row + 2 < board.getRow() && column - 2 >= 0 && board.getValue(row+ 1, column-1).equals(Player)&& board.getValue(row+2, column-2).equals(Player)) {
if(row +3 < board.getRow() && column - 3 >= 0 && board.getValue(row+3, column-3).equals(" ")) {
return field = new Field(row+3, column - 3);
}
else if (row - 1 >=0 && column + 1 < board.getColumn() && board.getValue(row-1, column+1).equals(" ")) {
return field = new Field(row-1, column + 1);
}
}
else if(row - 2 >= 0 && column +2 < board.getColumn() && board.getValue(row- 1, column+1).equals(Player)&& board.getValue(row-2, column+2).equals(Player)) {
if(row -3>= 0 && column + 3 < board.getColumn() && board.getValue(row-3, column+3).equals(" ")) {
return field = new Field(row-3, column +3);
}
else if (row + 1 < board.getRow() && column -1 >=0 && board.getValue(row+1, column-1).equals(" ")) {
return field = new Field(row+1, column -1);
}
}
else if(row - 2 >= 0 && column - 1 >= 0 && row + 1 < board.getRow() && column + 2 < board.getColumn()
&& board.getValue(row+ 1, column-1).equals(Player)&& board.getValue(row-2, column+2).equals(Player)) {
if (row - 1 >=0 && column + 1 < board.getColumn() && board.getValue(row-1, column+1).equals(" ")) {
return field = new Field(row-1, column + 1);
}
}
else if(row + 2 < board.getRow() && column -2 >= 0 && row - 1 >= 0 && column + 1 < board.getColumn()
&& board.getValue(row+ 2, column-2).equals(Player)&& board.getValue(row-1, column+1).equals(Player)) {
if (row + 1 < board.getRow() && column - 1 >= 0 && board.getValue(row+1, column-1).equals(" ")) {
return field = new Field(row+1, column - 1);
}
}
else if(row + 3 < board.getRow() && column + 3 < board.getColumn() && board.getValue(row + 2, column+2).equals(Player) && board.getValue(row+3, column+3).equals(Player)) {
if( board.getValue(row+1, column+1).equals(" ")) {
return new Field(row+1, column +1);
}
}
else if(row + 3 < board.getRow() && column + 3 < board.getColumn() && board.getValue(row+3, column+3).equals(Player) && board.getValue(row+1, column+1).equals(Player)) {
if(board.getValue(row+2, column+2).equals(" ")) {
return new Field (row +2, column + 2);
}
}
else if(row - 3 >= 0 && column - 3 >= 0 && board.getValue(row-3, column-3).equals(Player) && board.getValue(row-2, column-2).equals(Player)) {
if(board.getValue(row-1, column-1).equals(" ")) {
return new Field(row-1, column -1);
}
}
else if(row-3 >=0 && column -3>= 0 && board.getValue(row-3, column-3).equals(Player) && board.getValue(row-1, column-1).equals(Player)) {
if(board.getValue(row-2, column-2).equals(" ")) {
return new Field (row-2, column - 2);
}
}
return field ;
}
private Field diagonalLeft(int row, int column, String Player) {
Field field = null;
if(row - 1 >= 0 && column - 1 >= 0 && row + 1 < board.getRow() && column + 1 < board.getColumn()
&& board.getValue(row+ 1, column+1).equals(Player)&& board.getValue(row-1, column-1).equals(Player)) {
if(row + 2 < board.getRow() && column + 2 < board.getColumn() && board.getValue(row+2, column+2).equals(" ")) {
return field = new Field(row+2, column + 2);
}
else if (row - 2 >=0 && column - 2 >=0 && board.getValue(row-2, column-2).equals(" ")) {
return field = new Field(row-2, column - 2);
}
}
else if(row + 2 < board.getRow() && column + 2 < board.getColumn()&& board.getValue(row+ 1, column+1).equals(Player)&& board.getValue(row+2, column+2).equals(Player)) {
if(row +3 < board.getRow() && column + 3 < board.getColumn() && board.getValue(row+3, column+3).equals(" ")) {
return field = new Field(row+3, column + 3);
}
else if (row - 1 >=0 && column - 1 >=0 && board.getValue(row-1, column-1).equals(" ")) {
return field = new Field(row-1, column - 1);
}
}
else if(row - 2 >= 0 && column -2 >=0 && board.getValue(row- 1, column-1).equals(Player)&& board.getValue(row-2, column-2).equals(Player)) {
if(row -3>= 0 && column - 3 >= 0 && board.getValue(row-3, column-3).equals(" ")) {
return field = new Field(row-3, column -3);
}
else if (row + 1 < board.getRow() && column +1 <board.getColumn() && board.getValue(row+1, column+1).equals(" ")) {
return field = new Field(row+1, column +1);
}
}
else if(row - 1 >= 0 && column - 1 >= 0 && row + 2 < board.getRow() && column + 2 < board.getColumn()
&& board.getValue(row- 1, column-1).equals(Player)&& board.getValue(row+2, column+2).equals(Player)) {
if (row + 1 < board.getRow() && column + 1 < board.getColumn() && board.getValue(row+1, column+1).equals(" ")) {
return field = new Field(row+1, column + 1);
}
}
else if(row + 1 < board.getRow() && column -2 >= 0 && row - 2 >= 0 && column + 1 < board.getColumn()
&& board.getValue(row- 2, column-2).equals(Player)&& board.getValue(row+1, column+1).equals(Player)) {
if (row - 1 >= 0 && column - 1 >= 0 && board.getValue(row-1, column-1).equals(" ")) {
return field = new Field(row-1, column - 1);
}
}
else if(row - 3 >=0 && column + 3 < board.getColumn() && board.getValue(row - 2, column+2).equals(Player) && board.getValue(row-3, column+3).equals(Player)) {
if( board.getValue(row-1, column+1).equals(" ")) {
return new Field(row-1, column +1);
}
}
else if(row - 3 >=0 && column + 3 < board.getColumn() && board.getValue(row-3, column+3).equals(Player) && board.getValue(row-1, column+1).equals(Player)) {
if(board.getValue(row-2, column+2).equals(" ")) {
return new Field (row -2, column + 2);
}
}
else if(row + 3 < board.getRow() && column - 3 >= 0 && board.getValue(row+3, column-3).equals(Player) && board.getValue(row+2, column-2).equals(Player)) {
if(board.getValue(row+1, column-1).equals(" ")) {
return new Field(row+1, column -1);
}
}
else if(row+3 < board.getRow() && column -3>= 0 && board.getValue(row+3, column-3).equals(Player) && board.getValue(row+1, column-1).equals(Player)) {
if(board.getValue(row+2, column-2).equals(" ")) {
return new Field (row+2, column - 2);
}
}
return field;
}
the methods are really high and there is a mistake as well.. but i can't find it. Could you give me some tips how I can implement these methods better? Thank you
edit 1:
perhebs you should only have look over the first method. I take the last move and check if tehre is any threat which includes the last move. so I chek if there are two more coins in the row of the same Player which create a threat. the big A is the last Move and I want to check if tehre are the small a so that they create a threat:
| |a|A |a| | | | for example I check if the field right of A is an a and the field left of A is an a, and if this is true I check if there is a empty field arround it so that you could get 4 in a row
| | |A |a|a| | |
|a|a|A | | | | |
| | |A |a| |a| |
| | |A | | |a|a|
and so on.. i check every possibility of a threat. And after the row I do it for the column and for the diagonal
Do you see any better solution?
edit 2:
private Field row(int row, int column, int Player) {
Field field = null;
int j = 0;
boolean check = false;
if(column + 3 < board.getColumn()) {
for(int i = column; i< column + 4; i++) {
if(board.getValue(row, i).equals(Player)){
j++;
}
else if(board.getValue(row, i).equals(" ") && check == false) {
j++;
check = true;
field = new Field(row,i);
}
}
if(j == 4) {
return field;
}
}
return null;
}
I will call the method from 4 different points. do you this it will work?