/** * Päättää mitä siirtoja tästä nodesta eteenpäin ylipäätään tullaan harkitsemaan. Tämänhetkinen * versio ottaa satunnaisesti 20 pistettä. */ public void expand(Pelilauta lauta) { boolean[] visited = new boolean[Pelilauta.getKoko() * Pelilauta.getKoko()]; int pisteita; Pino<Node> lapsiJono = new Pino<>(); for (int i = 0; i < visited.length; i++) { visited[i] = true; } int offset = r.nextInt(visited.length); int indeksi = 0; int uusiX, uusiY; pisteita = CriticalPointObserver.getCapturePoints(lauta, lapsiJono, visited); while ((indeksi < visited.length) && (pisteita < branchingFactor)) { uusiX = Pelilauta.toX((indeksi + offset) % visited.length); uusiY = Pelilauta.toY((indeksi + offset) % visited.length); if (visited[(indeksi + offset) % visited.length]) { visited[(indeksi + offset) % visited.length] = false; // Varmistetaan että samaa siirtoa ei lasketa moneen kertaan if (PlacementHandler.onkoLaillinenSiirto(lauta, uusiX, uusiY)) { lapsiJono.add(new Node(lauta, uusiX, uusiY)); pisteita++; indeksi = 0; offset = r.nextInt(visited.length); continue; } } indeksi++; } Node passaus = new Node(lauta, -1, -1); lapsiJono.add(passaus); pisteita++; Node[] pisteet = new Node[pisteita]; for (int i = 0; i < pisteita; i++) { pisteet[i] = lapsiJono.pop(); } this.children = new NodenLapset(pisteet); }
/** * 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; }