Vous êtes sur la page 1sur 5

import java.io.

*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Random;

public class TrainingSet {

static int nPartite = 1;


static int N = 10;
static int m = 1;
public static int partenzaRowFormica, partenzaColFormica;
public static int[][] griglia = new int[N + 4][N + 4];
public static List<Integer> coordRowCibo = new ArrayList<>();
public static List coordColCibo = new ArrayList();
static boolean alive = true;
static int punteggio = 0;

public static void main(String[] args) {


int punti_totali = 0;
String trainingSet = "C:\\formicaTrain.arff";

griglia = inizializzoGriglia();
formica(trainingSet);
}

public static boolean checkLife(int [][]griglia, int rowFormica, int


colFormica){
boolean alive = false;

if(griglia[rowFormica][colFormica] == -10) alive = false;


else alive = true;

return alive;
}

public static int[][] move(int[][] griglia, int rowFormica, int colFormica){


alive = checkLife(griglia, rowFormica, colFormica);
if(!alive){
System.out.println("La formica uscita fuori dalla griglia e
muore!");
punteggio = punteggio - (N+2);
}
punteggio += griglia[rowFormica][colFormica];
griglia[rowFormica][colFormica] = griglia[rowFormica][colFormica]-1;

return griglia;
}

public static int[][] inizializzoGriglia(){


int [][] griglia = new int[N + 4][N + 4];
Random random = new Random();
int formicaRow = 0, formicaCol = 0, randomRow = 0, randomCol = 0;
boolean ok = false;

//inizializzo celle
for (int i = 0; i < N + 4; ++i) {
for (int j = 0; j < N + 4; ++j) {
if (i == 0 || i == 1 || j == 0 || j == 1 || i == N + 2 || j == N
+ 2 || i == N + 3 || j == N + 3) {
griglia[i][j] = -10;
} else {
griglia[i][j] = 0;
}
}
}

//inserisco in N celle del cibo


for (int i = 0; i < /*N + 1*/N; ++i) {
while (ok == false) {
randomRow = random.nextInt(N) + 1;
randomCol = random.nextInt(N) + 1;
if (griglia[randomRow][randomCol] == 0) {
griglia[randomRow][randomCol] = 1;
coordRowCibo.add(randomRow);
coordColCibo.add(randomCol);
ok = true;
}
}
ok = false;
}

//partenza della formica


while (ok == false) {
formicaRow = random.nextInt(N) + 1;
formicaCol = random.nextInt(N) + 1;
if (griglia[formicaRow][formicaCol] == 0) {
ok = true;
partenzaRowFormica = formicaRow;
partenzaColFormica = formicaCol;
}
}

StampaGriglia(griglia, partenzaRowFormica, partenzaColFormica);

return griglia;
}

public static void formica(String trainingSet) {

File test = new File(trainingSet);


BufferedWriter writerTest = null;
try {
int intorno = 0;
if (m == 1)
intorno = 8;
else if (m == 2)
intorno = 24;

writerTest = new BufferedWriter(new FileWriter(trainingSet));


writerTest.write("@relation formica\n\n");
for(int i = 0; i < intorno; ++i) {
writerTest.write("@attribute g" + i + " real\n");
}
writerTest.write("@attribute class {N, S, E, O}\n\n");
writerTest.write("@data\n");
} catch (IOException e) {
e.printStackTrace();
}

//INIZIO PARTITA ############################


for (int i = 0; i < nPartite; ++i) {
if(i > 0){
griglia = inizializzoGriglia();
}
punteggio = iniziaPartita(griglia, partenzaRowFormica,
partenzaColFormica, punteggio, writerTest/*, trainFile*/);
punteggio = 0;
}

try {
writerTest.close();
} catch (IOException e) {
e.printStackTrace();
}

public static int iniziaPartita(int[][] griglia, int formicaRow, int


formicaCol, int punteggio, BufferedWriter writer/*, String trainFile*/) {
int pastRow = 0, pastCol = 0;
int row = 0, col = 0, x = 0, y = 0;

visualeFormica(griglia, formicaRow, formicaCol, m, writer);

for (int k = 0; k < 2 * N; ++k) {


String mossa = "";
x = formicaRow;
y = formicaCol;

if (k == 0) {
pastRow = formicaRow;
pastCol = formicaCol;
}

mossa = SelezionaMossa();

try {
if (mossa.equals("w")) {
writer.write("N\n");
formicaRow = formicaRow - 1;
pastRow = formicaRow + 1;
pastCol = formicaCol;
} else if (mossa.equals("a")) {
writer.write("O\n");
formicaCol = formicaCol - 1;
pastRow = formicaRow;
pastCol = formicaCol + 1;
} else if (mossa.equals("s")) {
writer.write("S\n");
formicaRow = formicaRow + 1;
pastRow = formicaRow - 1;
pastCol = formicaCol;
} else if (mossa.equals("d")) {
writer.write("E\n");
formicaCol = formicaCol + 1;
pastRow = formicaRow;
pastCol = formicaCol - 1;
} else if (mossa.equals("r")) {
int x1 = formicaRow;
int y1 = formicaCol;
int gapX = 0, gapY = 0;
Random rand = new Random();

while ((x1 == pastRow && y1 == pastCol) || (x1 == x && y1 ==


y)) {
x1 = formicaRow;
y1 = formicaCol;
int r = rand.nextInt(4);
String direzione = "";
gapX = 0;
gapY = 0;
if (r == 0) {
direzione = "N";
x1 = formicaRow - 1;
gapX = formicaRow - x1;
} else if (r == 1) {
direzione = "O";
y1 = formicaCol - 1;
gapY = formicaCol - y1;
} else if (r == 2) {
direzione = "S";
x1 = formicaRow + 1;
gapX = formicaRow - x1;
} else if (r == 3) {
direzione = "E";
y1 = formicaCol + 1;
gapY = formicaCol - y1;
}

if ((x1 == pastRow && y1 == pastCol)) {


System.out.println("Mossa non valida!");
} else {
System.out.println("Mossa accettata!");
writer.write(direzione + "\n");
formicaRow = x1;
formicaCol = y1;
pastRow = formicaRow + gapX;
pastCol = formicaCol + gapY;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}

if (griglia[formicaRow][formicaCol] == -10) {
punteggio = punteggio - (N + 2);
System.out.println("La formica caduta fuori dalla griglia! Hai
perso! Fine del gioco.");
System.out.println("Punteggio " + punteggio);
break;
} else {
punteggio += griglia[formicaRow][formicaCol];
griglia[formicaRow][formicaCol]--;
}

StampaGriglia(griglia, formicaRow, formicaCol);


System.out.println(k + 2 + ") Nuova posizione della formica " +
(formicaRow) + " " + (formicaCol));
System.out.println("Punteggio " + punteggio);

if (k != (2 * N) - 1)
visualeFormica(griglia, formicaRow, formicaCol, m, writer);

}
return punteggio;
}

public static void StampaGriglia(int[][] griglia, int row, int col) {


for (int i = 0; i < N + 4; ++i) {
for (int j = 0; j < N + 4; ++j) {
if (i == row && j == col) System.out.print(griglia[i][j] +
"*\t\t");
else System.out.print(griglia[i][j] + "\t\t");
}
System.out.print("\n");
}
}

public static void visualeFormica(int[][] griglia, int row, int col, int m,
BufferedWriter writer) {
try {
for (int i = row - m; i <= (row + m); ++i) {
for (int j = col - m; j <= (col + m); ++j) {
if(i != row || j != col)
writer.write(griglia[i][j] + ",");
}
}
} catch (Exception e) {
}
}

public static String SelezionaMossa() {


InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
String letta = "";

System.out.println("Inserisci la direzione (w(su) / a(sx) / s(giu) /


d(dx) / r(random))");
try {
letta = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}

return letta;
}
}