package nl.sogyo.mancala.domein; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Random; //import Sequenic.T2.T2annotation.ArgGenerator; import Sequenic.T2.T2annotation.exclude; import Sequenic.T2.T2annotation.option; @option("--customtracedir") public class Mancala implements IMancala { private Speler speler1; private Speler speler2; /** * Lege public constructor, het spel aanmaken gaat via de 'initialiseerSpel' * methode. Dit is nodig om goed met de interface te kunnen werken. */ public Mancala() { } /* (non-Javadoc) * @see nl.sogyo.mancala.domein.IMancala#initialiseerSpel(java.lang.String, java.lang.String, int, int) */ public void initialiseerSpel(String naamSpeler1, String naamSpeler2, int aantalKommen, int aantalStenenPerKom) { aux_inited = true; aux_aantalKommen = aantalKommen; this.validateParameters(naamSpeler1, naamSpeler2, aantalKommen, aantalStenenPerKom); this.speler1 = new Speler(naamSpeler1, true, aantalKommen, aantalStenenPerKom); this.speler2 = new Speler(naamSpeler2, false, aantalKommen, aantalStenenPerKom); this.speler1.setTegenstander(this.speler2); this.speler2.setTegenstander(this.speler1); this.speler1.getKalaha().setVolgendeKom(this.speler2.getKom(1)); this.speler2.getKalaha().setVolgendeKom(this.speler1.getKom(1)); } /** * Valideer de meegegeven parameters en gooi een exceptie * als er een fout wordt geconstateerd. * * @param naamSpeler1 * @param naamSpeler2 * @param aantalKommen * @param aantalStenenPerKom */ private void validateParameters(String naamSpeler1, String naamSpeler2, int aantalKommen, int aantalStenenPerKom) { if (naamSpeler1 == null || naamSpeler1.equals("") || naamSpeler2 == null || naamSpeler2.equals("")) { throw new IllegalArgumentException("De naam van een speler mag niet 'null' of leeg zijn"); } if (naamSpeler1.equals(naamSpeler2)) { throw new IllegalArgumentException("De naam van speler 1 mag niet gelijk zijn aan de naam van speler 2"); } if (aantalKommen < 1) { throw new IllegalArgumentException("Aantal kommen moet groter of gelijk zijn aan 1"); } if (aantalStenenPerKom < 1) { throw new IllegalArgumentException("Aantal stenen per kom moet groter of gelijk zijn aan 1"); } } /* (non-Javadoc) * @see nl.sogyo.mancala.domein.IMancala#getNaamSpelerAanDeBeurt() */ public String getNaamSpelerAanDeBeurt() { return this.getSpelerAanDeBeurt().getNaam(); } /** * @return de speler die aan de beurt is */ private Speler getSpelerAanDeBeurt() { if (this.speler1.isAanDeBeurt()) { return this.speler1; } else { return this.speler2; } } /* (non-Javadoc) * @see nl.sogyo.mancala.domein.IMancala#getStand() */ public String[] getStand() { return new String[] {this.speler1.getStand(), this.speler2.getStand()}; } /* (non-Javadoc) * @see nl.sogyo.mancala.domein.IMancala#doeZet(int) */ public void doeZet(int komNummer) { this.getSpelerAanDeBeurt().doeZet(komNummer); } /* (non-Javadoc) * @see nl.sogyo.mancala.domein.IMancala#isAfgelopen() */ public boolean isAfgelopen() { return !this.getSpelerAanDeBeurt().kanZetten(); } /* (non-Javadoc) * @see nl.sogyo.mancala.domein.IMancala#bepaalWinnaar() */ public String bepaalWinnaar() { if (!this.isAfgelopen()) { throw new IllegalStateException("Nog geen winnaar bekend."); } else { String naamWinaar = null; int aantalStenenSpeler1 = this.speler1.getAantalStenen(); int aantalStenenSpeler2 = this.speler2.getAantalStenen(); if (aantalStenenSpeler1 > aantalStenenSpeler2) { naamWinaar = this.speler1.getNaam(); } else if (aantalStenenSpeler2 > aantalStenenSpeler1) { naamWinaar = this.speler2.getNaam(); } return naamWinaar; } } ////////////////// T2 ////////////////// private boolean aux_inited = false; private int aux_aantalKommen; public List customTraceDirector() { List result = new ArrayList(); if(!aux_inited) { try { result.add(getClass().getDeclaredMethod("initialiseerSpel", String.class, String.class, int.class, int.class)); } catch (Exception e) { e.printStackTrace(); } } else { for(Method m : getClass().getDeclaredMethods()) { if((m.getName().equals("bepaalWinnaar") && isAfgelopen()) || !m.getName().equals("bepaalWinnaar") && !m.getName().equals("initialiseerSpel") && !m.getName().equals("validateParameters") && !m.getName().equals("customTraceDirector") && !m.getName().endsWith("_ga") ) { result.add(m); } } } return result; } public void initialiseerSpel_spec(String naamSpeler1, String naamSpeler2, int aantalKommen, int aantalStenenPerKom) { initialiseerSpel("Speler 1", "Speler 2", 6, 4); } public void doeZet_spec(int komNummer) { // Don't use random! /* Random rand = new Random(); int n = 1+rand.nextInt(aux_aantalKommen-1); for(int count=0; count 0) break; n++; if(n > aux_aantalKommen) n = 1; } doeZet(n); */ if(komNummer == Integer.MIN_VALUE) komNummer = 0; komNummer = 1+Math.abs(komNummer)%aux_aantalKommen; for(int count=0; count 0) break; komNummer++; if(komNummer > aux_aantalKommen) komNummer = 1; } //System.out.println("DEBUG komNummer: "+komNummer); doeZet(komNummer); } public String bepaalWinnaar_spec() { String winnaar = null; try { winnaar = bepaalWinnaar(); } catch(IllegalStateException e) { if(isAfgelopen()) throw new Error(); } return winnaar; } private double bepaalWinnaar_ga() { try { return 2*6*4 - speler1.getKalaha().getAantalStenen() - speler2.getKalaha().getAantalStenen(); } catch(Exception e) { // Cause of the mutations of the GA the CUT can be in an invalid // state so sometimes it's impossible to get a fitness value. // These invalid traces get filtered out cause we will then just // return a big value. //System.out.println("DEBUG failed to get fitness: "+e.getMessage()); } return 1000; } }