/*
 * Datei:            FitnessCollAvoid.java
 * Autor(en):        Lukas K�nig
 * Java-Version:     1.4
 * Erstellt (vor): 24.09.2008
 *
 * (c) Lukas K�nig, die Datei unterliegt der LGPL
 * -> http://www.gnu.de/lgpl-ger.html
 */
package fmg.fmg8.endlAutomat.fitness;
import fmg.fmg8.umgebung2D.GlobaleVariablen;
import fmg.fmg8.umgebung2D.Roboter;
import fmg.fmg8.umgebung2D.Umgebung;
import fmg.fmg8.umgebung2D.Vektor2D;
/**
 * Fitnessberechnung anhand von der Anzahl an Wechseln zwischen den H�lften
 * des Spielfeldes.
 * 
 * @author Lukas K�nig
 */
public class FitnessOnlyGate implements FitnessVerfahren {
    /**
     * �berschreibung des Default-Konstruktors.
     */
    public FitnessOnlyGate() {
        throw new RuntimeException("Fitness nicht ausgew�hlt.");
    }
    
    /**
     * Berechnet, in welcher H�lfte des Feldes (links / rechts) sich ein
     * Punkt befindet.
     * 
     * @param feld  Das Feld.
     * @param pkt   Die Position des Punktes.
     * @return  Ob sich der Punkt in der linken H�lfte befindet.
     */
    private boolean haelfte(final Umgebung feld,
                            final Vektor2D pkt) {
        return pkt.x < ((double) feld.getFeld().length) / 2.0;
    }
    
    /**
     * Berechnet den Fitnesssnapshot.
     * 
     * @param rob  Der Roboter, dessen Fitness berechnet werden soll.
     * 
     * @return  die Fitness.
     */
    public int fitness(final Roboter rob) {
        // Swap:
        int fitSwap;
        long aktivSeitLetzt = rob.getAktivZyklen(rob.getAktAutNum());
        int faktor = (int) aktivSeitLetzt / 10;
        rob.resetAktivZyk(rob.getAktAutNum());
        
        if (rob.getLetztKoord() == null) {
            rob.setLetztKoord(new Vektor2D(rob.getPosition()));
        }
        
        if (this.haelfte(rob.getUmg(), rob.getLetztKoord())
            != this.haelfte(rob.getUmg(), rob.getPosition())) {
            fitSwap = 10;
            GlobaleVariablen.setGateCount(GlobaleVariablen.getGateCount() + 1);
        } else {
            fitSwap = -1;
        }
        
        rob.setLetztKoord(new Vektor2D(rob.getPosition()));
        
        return fitSwap * faktor;
    }
    /**
     * Die toString-Methode.
     * 
     * @return Die Ausgabe.
     */
    public String toString() {
        return "FitnessSwapHalfs";
    }
}