2016-04-29 9 views
0

Ich arbeite an einem Projekt, wo ich ein Stück Code für 4x4 Tic Tac Toe bekomme, aber meine eigene KI darin implementieren muss, die die vorinstallierte KI schlagen kann. Die 2 KI's sind einfach und zufällig. Random fügt zufällig nur Xs auf ein Quadrat ein und Simple Player startet vom obersten linken Quadrat und iteriert genau ein Quadrat. Um einen einfachen Spieler abzufangen, habe ich mein erstes O auf die erste Reihe gelegt und mache im Grunde eine vertikale Linie, bis es 4 in einer Reihe gibt. Zufälliger Spieler kann jedoch meine Linie abfangen, und danach setzt mein Computerspieler zufällig O's in leere Felder, um zu zeichnen. Dies funktioniert jedoch nicht richtig, da mein Player nicht mehr spielt, weil er nicht weiß, wohin er gehen soll. So würde ich schätzen, wenn jemand meine Konzepte korrigieren könnte.Ich mache meinen AI-Player in Tic Tac Toe

DIES IST NUR EIN TEIL MEINER CODE

package noughtsAndCrossesV3; 

import ncErrors.outOfRangeError; 
import java.util.ArrayList; 
import java.util.Random; 

public class MyCompPlayer extends GenericPlayer implements NCPlayer { 

    Random theGenerator; 

    public MyCompPlayer() 
    { 
     super();  // no further initialisation required 
     theGenerator = new Random(); 
    } 

    // NCGrid is the grid the class that displays the grid and rules to win 

    @Override 
    public GridCoordinate getNextMove(NCGridV3 currentGrid) { 
     int Row; 
     int Col; 
     GridCoordinate theSquare = null; 
     int randomSelection; 
     ArrayList<GridCoordinate> freeSquares = new ArrayList<GridCoordinate>(); // array finding free squares 

     //iterates through row and column 
     for (Row = 0; (theSquare == null) && (Row < currentGrid.getGridRowDimension()); Row++){ 
      for (Col = 0; (theSquare == null) && (Col < currentGrid.getGridColDimension()); Col++){ 


       try{ 

        //If last column is empty, then draw a row of O's downwards in a straight line. 

        if(currentGrid.getSquareStatus(Row,3)==NCGridV3.SquareStatus.EMPTY){ 
        theSquare = new GridCoordinate(Row,3); 
        return theSquare; 
       } 
       //If there is a nought then randomize movement. This doesnt work yet. 
       else if(currentGrid.getSquareStatus(Row,3)==NCGridV3.SquareStatus.NOUGHT) 
        freeSquares.add(new GridCoordinate(Row, Col)); 
       // adds free sqaures to array and plots coordinate there but doesnt work. 

       } 

       catch (outOfRangeError e) 
       { 

       } 

      } 

     } 

    randomSelection = theGenerator.nextInt(freeSquares.size()); 


    return freeSquares.get(randomSelection); 
} 

}

+0

Können Sie angeben, ob Sie nur diese beiden Arten von KI, die Sie beschreiben, schlagen möchten oder eine KI erstellen möchten, die (jede) Art von Spieler/KI schlagen kann? Du könntest das verwenden http://www.wikihow.com/Win-at-Tic-Tac-Toe –

+0

Was meinst du "Das funktioniert jedoch nicht richtig, da mein Spieler nicht mehr an der Reihe ist, weil er es nicht weiß wo hin." ? Es gibt eine outOfRangeError-Ausnahme, die nicht behandelt wird, wird sie ausgelöst? Also, ist das Hausaufgaben? (sollte es als solches markieren.) – phtrivier

Antwort

0

Am Ende des Tages gibt die Zufalls AI immer etwas könnte zum Glück auf den Tag verderben stolpern, wenn Sie eine einfache verwenden Zähler AI. Ich denke, die Idee ist, einen Algorithmus zu erstellen, der die Wahrscheinlichkeit minimiert, dass dies zu vernachlässigbarer Größe geschieht. Vielleicht gehen Sie nicht einfach in einer Kolumne, sondern gehen in eine andere Richtung und priorisieren immer die Richtung, die Sie zuletzt gewählt haben, es sei denn, es ist nicht möglich.

Am Ende des Tages ist das Spiel deterministisch und die Anzahl der Optionen ist nicht verrückt wie in Schach, man könnte einen Algorithmus schreiben, der die ganze Zeit gewinnt, wenn man genug Laufzeit hat. Ich schlage vor, Sie betrachten die minimax Ansatz, es ist die klassische Art, Ihre erste KI für ein Spiel wie Schach, Dame oder Tic Tac Toe zu schreiben.