non ho ottimizzato niente, ma questo sembra funzionare:
codice:
import java.io.*;
/**
*
* @author Andrea
*/
public class ForzaQuattro {
private int[][] scheme;
//metodo accessorio per la stampa dello schema
public String toString() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < scheme.length; i++) {
buf.append("[ ");
for (int j = 0; j < scheme[0].length; j++) {
buf.append(scheme[i][j]+" ");
}
buf.append("]\n");
}
return buf.toString();
}
// crea la matrice pivot 7x7, con al centro l'ultima posizione inserita.
// su questa matrice viene ricercata la posizione vincente.
//l'eccezione gestisce l'array out of bound exception, mettendo di default a 0 tali elementi.
private int[][] createPivotMatrix(int x, int y) {
int[][] temp = new int[7][7];
for (int i = x-3; i <=x+3; i++) {
for (int j = y-3; j <=y+3; j++) {
try {
temp[i-x+3][j-y+3] = scheme[i][j];
}
catch (Exception e) {
temp[i-x+3][j-y+3] = 0;
}
}
}
return temp;
}
public void searchWinPosition(int sign, int x, int y) {
int[][] temp = createPivotMatrix(x, y);
int pivot;
//diagonale principale (0,0)-->(6,6) (angolo in alto a sx - angolo in basso a dx
pivot = 0;
for (int i = 0; i < 7; i++) {
if (pivot == sign*4) {
System.out.println("Ha vinto il giocatore "+(sign == 1 ? "1" : "2")+" Sulla diagonale principale");
return;
}
pivot += temp[i][i];
}
// verticale (0,3)-->(6,3)
pivot = 0;
for (int i = 0; i < 7; i++) {
if (pivot == sign*4) {
System.out.println("Ha vinto il giocatore "+(sign == 1 ? "1" : "2")+" Sulla verticale");
return;
}
pivot += temp[i][3];
}
//diagonale secondaria (0,6)-->(6,0) angolo in basso a sx - angolo in alto a dx
pivot = 0;
for (int i = 6; i >= 0; i--) {
if (pivot == sign*4) {
System.out.println("Ha vinto il giocatore "+(sign == 1 ? "1" : "2")+" Sulla diagonale secondaria");
return;
}
pivot += temp[6-i][i];
}
//orizzontale (3,0)-->(3,6)
pivot = 0;
for (int i = 0; i < 7; i++) {
if (pivot == sign*4) {
System.out.println("Ha vinto il giocatore "+(sign == 1 ? "1" : "2")+" Sulla orizzontale");
return;
}
pivot += temp[3][i];
}
}
//costruttore totalmente inutile nel tuo caso, definito solo per caricare una posizione da file
public ForzaQuattro(String path) {
try {
BufferedReader br = new BufferedReader(new FileReader(path));
String line;
//Leggo dimensione
line = br.readLine();
int dim = Integer.parseInt(line);
scheme = new int[dim][dim];
String[] temp = new String[dim];
int i = 0;
while ((line = br.readLine()) != null) {
temp = line.split(" ");
for (int j = 0; j < dim; j++) {
scheme[i][j] = Integer.parseInt(temp[j]);
}
i++;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main (String[] args) {
ForzaQuattro fq = new ForzaQuattro("X:/Percorso/file/scheme.dat");
System.out.println(fq);
System.out.println("\n\n******************\n\n");
fq.searchWinPosition(1, 5, 3);
fq.searchWinPosition(-1, 11, 11);
fq.searchWinPosition(-1, 11, 10);
fq.searchWinPosition(-1, 11, 9);
}
}
in scheme.dat c'è lo schema (non avevo voglia di fare l'interfaccia grafica etc): è 12 x 12 e la prima riga del file individua la dimensione, ma solo per il parsing del file senza gestire troppo le eccezioni
codice:
12
0 -1 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 -1 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 -1 0 0 0 0 0 0
0 -1 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 -1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 -1 -1 -1
come vedi dalle ultime 3 chiamate a searchWinPosition (che riceve il simbolo ultimo inserito, e la sua posizione), non importa quale dei 4 sia stato inserito, la posizione (a dire il vero viene individuata la direzione vincente - l'effettiva ricerca della posizione attuale la lascio a te) viene comunque individuata.
PS: ovviamente ho raccolto nello stesso schema un paio di posizioni vincenti e per entrambi i giocatori, situazione che nel gioco non si verificherà mai (è invece possibile che i verifichino più posizioni vincenti per lo stesso giocatore e in contemporanea...)