Пример #1
0
  /**
   * 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);
  }
Пример #2
0
  /**
   * 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;
  }