public static Pelilauta bayesSimulate(Pelilauta lauta, int[] amafTaulu) { double probability; double maxProbability; int maxSimple; while (lauta.getMoveNumber() < 700) { maxSimple = -1; maxProbability = -1; for (int i = 0; i < Pelilauta.getKoko() * Pelilauta.getKoko(); i++) { if (!PlacementHandler.onkoLaillinenSiirto(lauta, Pelilauta.toX(i), Pelilauta.toY(i)) || PlacementHandler.tuhoaakoSiirtoOmanSilman( lauta, Pelilauta.toX(i), Pelilauta.toY(i))) { continue; } probability = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { if (Pelilauta.onLaudalla(Pelilauta.toX(i) + k, Pelilauta.toY(i) + l)) { if (lauta.getTurn() == Pelilauta.MUSTA) { probability += Pattern.patternMovePredictions( Pattern.match(lauta, Pelilauta.toX(i) + k, Pelilauta.toY(i) + l), -k, -l); } else { probability += Pattern.patternMovePredictions( Pattern.swapColors( Pattern.match(lauta, Pelilauta.toX(i) + k, Pelilauta.toY(i) + l)), -k, -l); } } } } if (probability > maxProbability) { maxSimple = i; } } if (maxSimple == -1) { if (lauta.isPassedOnLastMove()) { break; } PlacementHandler.pass(lauta); continue; } PlacementHandler.pelaaSiirto(lauta, Pelilauta.toX(maxSimple), Pelilauta.toY(maxSimple)); if (amafTaulu[maxSimple] == 0) { amafTaulu[maxSimple] = lauta.getTurn(); } } // System.err.println("Siirtoja: " + lauta.getMoveNumber()); return lauta; }
/** * simuloi pelin. Pelaa sarjan siirtoja. * * @return Pelilauta, kun simulaatio on päättynyt. Laudalla ei pitäisi olla yhtäkään kuollutta * ryhmää, ja silmien tulisi olla yhden pisteen kokoisia. */ public static Pelilauta simulate(Pelilauta lauta, int[] amafTaulu) { int[] vapaatpisteet; int offset; int x, y; boolean noSensibleMovesLeft = false; boolean loytyiSiirto; while (!noSensibleMovesLeft && lauta.getMoveNumber() < 700) { vapaatpisteet = lauta.getMahdollisetPisteet(); loytyiSiirto = false; if (lauta.isPassedOnLastMove()) { noSensibleMovesLeft = true; } if (vapaatpisteet != null) { if (CriticalPointObserver.getSelfAtariMove() != -1) { x = Pelilauta.toX(CriticalPointObserver.getSelfAtariMove()); y = Pelilauta.toY(CriticalPointObserver.getSelfAtariMove()); if (!PlacementHandler.tuhoaakoSiirtoOmanSilman(lauta, x, y)) { if (amafTaulu[Pelilauta.toSimple(x, y)] == 0) { amafTaulu[Pelilauta.toSimple(x, y)] = lauta.getTurn(); } PlacementHandler.pelaaSiirto(lauta, x, y); noSensibleMovesLeft = false; loytyiSiirto = true; continue; } } offset = r.nextInt(vapaatpisteet.length); for (int i = 0; i < vapaatpisteet.length; i++) { x = Pelilauta.toX(vapaatpisteet[(i + offset) % vapaatpisteet.length]); y = Pelilauta.toY(vapaatpisteet[(i + offset) % vapaatpisteet.length]); if (!PlacementHandler.tuhoaakoSiirtoOmanSilman(lauta, x, y)) { if (amafTaulu[Pelilauta.toSimple(x, y)] == 0) { amafTaulu[Pelilauta.toSimple(x, y)] = lauta.getTurn(); } PlacementHandler.pelaaSiirto(lauta, x, y); noSensibleMovesLeft = false; loytyiSiirto = true; break; } } } if (!loytyiSiirto) { PlacementHandler.pass(lauta); } } // GoAI.piirraLauta(lauta); /*String debug = "\n"; for (int j = Pelilauta.getKoko() - 1; j >= 0; j--) { debug += " "; for (int i = 0; i < Pelilauta.getKoko(); i++) { if (lauta.getRisteys(i, j) == Pelilauta.MUSTA) { debug += " " + "X" + " "; } else if (lauta.getRisteys(i, j) == Pelilauta.VALKEA) { debug += " " + "O" + " "; } else { debug += " " + "." + " "; } } debug += "\n"; } GTP.logger.info(debug);*/ return lauta; }