SotilasRivitEval.java
package datastructureproject.luokat.evaluointi.osat;
import chess.model.Side;
import datastructureproject.luokat.Pelilauta;
import datastructureproject.luokat.nappulat.Nappula;
import datastructureproject.luokat.nappulat.Sotilas;
import datastructureproject.luokat.tietorakenteet.Lista;
public class SotilasRivitEval implements OsaEvaluaattori {
private static final double PAINOARVO = 0.5d;
private Side puoli;
private Lista<Sotilas> oSotilaat;
private Lista<Sotilas> vSotilaat;
private int[] oSotilasRivit;
private int[] vSotilasRivit;
public SotilasRivitEval(Side puoli) {
oSotilaat = new Lista<>();
vSotilaat = new Lista<>();
oSotilasRivit = new int[Pelilauta.ALKUTILANNE.length];
vSotilasRivit = new int[Pelilauta.ALKUTILANNE.length];
this.puoli = puoli;
}
public void prosessoiNappula(Nappula n) {
if (n instanceof Sotilas) {
if (n.getPuoli() == puoli) {
oSotilasRivit[n.getX()]++;
oSotilaat.add((Sotilas) n);
} else {
vSotilasRivit[n.getX()]++;
vSotilaat.add((Sotilas) n);
}
}
}
private double getArvo(int[] rivit, Lista<Sotilas> sotilaat) {
double d = 0d;
for (int x = 0; x < rivit.length; x++) {
//Tuplattu sotilas - Katsotaan onko samalla rivillä useampi saman puolen sotilas
if (rivit[x] >= 2) {
d -= rivit[x] / 2d * PAINOARVO; // tuplattu: -0.5, triplattu: -0.75, quadruplattu: -1
}
}
for (int i = 0; i < sotilaat.size(); i++) {
Sotilas sotilas = sotilaat.get(i);
int x = sotilas.getX();
//Yksinäinen sotilas - Katsotaan onko viereisillä riveillä sotilaalle kavereita
int kaveriAste = 0;
if (x > 0 && rivit[x - 1] > 0) {
kaveriAste++;
}
if (x < oSotilasRivit.length - 1 && rivit[x + 1] > 0) {
kaveriAste++;
}
//Jos sotilaalla ei ole kavereita, pienennetään arvoa kertoimen verran
if (kaveriAste == 0) {
d -= PAINOARVO;
}
}
return d;
}
public double getArvo() {
return getArvo(oSotilasRivit, oSotilaat) - getArvo(vSotilasRivit, vSotilaat);
}
}