Gå til innhold

hjelp med tre på rad


Anbefalte innlegg

Heisann, holder på med et simpelt spill i Java, nå som jeg er ferdig med alle obliger, for øke og støpe inn det jeg har lært på skolen (har lært mer enn det elementære her, men starter rolig). Det jeg sliter med atm er at, hvis alle plassene i arrayen min er fyllt opp så skal den stoppe opp, foreløpig har jeg en jalla løsning som ender spillet etter 9 runder, men når det gjelder AI'en jeg lager nå så jobber den random og da gjørn ferdig de 9 rundene ganske så ofte uten at noen vinner eller den fyller ut rutene.

 

import java.util.Random;
import easyIO.*;

class TicTacToe {

   public static void main(String[] args) {

       System.out.println("Tic Tac Toe\nv0.6");
       System.out.println(" ___ ___ ___");
       System.out.println("|_1_|_2_|_3_|");
       System.out.println("|_4_|_5_|_6_|");
       System.out.println("|_7_|_8_|_9_|");
       TicTacToeSpill ts = new TicTacToeSpill();
       ts.valg();
       System.out.println("Programmet avsluttes");
   }
}

class TicTacToeSpill {

   In tast = new In();
   Out skjerm = new Out();
   char[][] ttt = new char[3][3];
   boolean checkX = false;
   boolean checkO = false;
   int rute = 0;

   void computerPlayers() {
       int end = 0;
       while (end < 9) {
           ruteNett();
           int roll1 = 0;
           Random rute1 = new Random();
           roll1 = rute1.nextInt(9) + 1;
           rute = roll1;
           sirkel();
           checkWinner();
           if (checkO == true) {
               ruteNett();
               System.out.println("Sirkel har vunnet!");
               break;
           }
end++;


           if (end == 9) {
               ruteNett();
               System.out.println("Alle rutene er fyllt ut og ingen har vunnet!");
               break;
           }
           ruteNett();
           int roll2 = 0;
           Random rute2 = new Random();
           roll2 = rute2.nextInt(9) + 1;
           rute = roll2;
           kryss();
           checkWinner();
           if (checkX == true) {
               ruteNett();
               System.out.println("Kryss har vunnet!");
               break;
           }
end++;

       }
   }

   void ruteNett() {
       for (int i = 0; i < ttt.length; i++) {
           for (int j = 0; j < ttt[i].length; j++) {
               if (ttt[i][j] == 0) {
                   ttt[i][j] = ' ';
               }
           }
       }
       System.out.println(" ___ ___ ___");
       System.out.println("|_" + ttt[0][0] + "_|_" + ttt[0][1] + "_|_" + ttt[0][2] + "_|");
       System.out.println("|_" + ttt[1][0] + "_|_" + ttt[1][1] + "_|_" + ttt[1][2] + "_|");
       System.out.println("|_" + ttt[2][0] + "_|_" + ttt[2][1] + "_|_" + ttt[2][2] + "_|");
   }

   void checkWinner() {
       int i = 0;
       while (i < 3) {
           if (ttt[i][0] == 'X' && ttt[i][1] == 'X' && ttt[i][2] == 'X') {
               checkX = true;
           } else if (ttt[i][0] == 'O' && ttt[i][1] == 'O' && ttt[i][2] == 'O') {
               checkO = true;
           } else if (ttt[0][i] == 'X' && ttt[1][i] == 'X' && ttt[2][i] == 'X') {
               checkX = true;
           } else if (ttt[0][i] == 'O' && ttt[1][i] == 'O' && ttt[2][i] == 'O') {
               checkO = true;
           } else if (ttt[0][0] == 'X' && ttt[1][1] == 'X' && ttt[2][2] == 'X') {
               checkX = true;
           } else if (ttt[0][2] == 'X' && ttt[1][1] == 'X' && ttt[2][0] == 'X') {
               checkX = true;
           } else if (ttt[0][0] == 'O' && ttt[1][1] == 'O' && ttt[2][2] == 'O') {
               checkO = true;
           } else if (ttt[0][2] == 'O' && ttt[1][1] == 'O' && ttt[2][0] == 'O') {
               checkO = true;
           }

           i++;
       }
   }

   void valg() {
       skjerm.out("Vil du spille singleplayer eller multiplayer? (1P/2P)");
       String choice = tast.inLine();

       if (choice.equals("1P")) {
           enPlayer();
       } else if (choice.equals("2P")) {
           toPlayer();
       } else if (choice.equals("C")) {
           computerPlayers();
       }

   }

   void enPlayer() {
       int end = 0;
       while (end < 9) {
           ruteNett();
           System.out.print("1P, O, tast inn hvilken rute du vil fylle ut: ");
           rute = tast.inInt();
           sirkel();
           checkWinner();
           if (checkO == true) {
               ruteNett();
               System.out.println("Sirkel har vunnet!");
               break;
           }
           end++;

           if (end == 9) {
               ruteNett();
               System.out.println("Alle rutene er fyllt ut og ingen har vunnet!");
               break;
           }
           ruteNett();
           System.out.print("2P, X, tast inn hvilken rute du vil fylle ut: ");
           rute = tast.inInt();
           kryss();
           checkWinner();
           if (checkX == true) {
               ruteNett();
               System.out.println("Kryss har vunnet!");
               break;
           }
           end++;
       }
   }

   void toPlayer() {
       int end = 0;
       while (end < 9) {
           ruteNett();
           System.out.print("1P, O, tast inn hvilken rute du vil fylle ut: ");
           rute = tast.inInt();
           sirkel();
           checkWinner();
           if (checkO == true) {
               ruteNett();
               System.out.println("Sirkel har vunnet!");
               break;
           }
           end++;

           if (end == 9) {
               ruteNett();
               System.out.println("Alle rutene er fyllt ut og ingen har vunnet!");
               break;
           }
           ruteNett();
           System.out.print("2P, X, tast inn hvilken rute du vil fylle ut: ");
           rute = tast.inInt();
           kryss();
           checkWinner();
           if (checkX == true) {
               ruteNett();
               System.out.println("Kryss har vunnet!");
               break;
           }
           end++;
       }
   }

   void sirkel() {
       if (rute == 1 && ttt[0][0] == ' ') {
           ttt[0][0] = 'O';
       } else if (rute == 2 && ttt[0][1] == ' ') {
           ttt[0][1] = 'O';
       } else if (rute == 3 && ttt[0][2] == ' ') {
           ttt[0][2] = 'O';
       } else if (rute == 4 && ttt[1][0] == ' ') {
           ttt[1][0] = 'O';
       } else if (rute == 5 && ttt[1][1] == ' ') {
           ttt[1][1] = 'O';
       } else if (rute == 6 && ttt[1][2] == ' ') {
           ttt[1][2] = 'O';
       } else if (rute == 7 && ttt[2][0] == ' ') {
           ttt[2][0] = 'O';
       } else if (rute == 8 && ttt[2][1] == ' ') {
           ttt[2][1] = 'O';
       } else if (rute == 9 && ttt[2][2] == ' ') {
           ttt[2][2] = 'O';
       } else if (rute > 9) {
           System.out.println("Tallet du har tastet er for høyt");
       } else {
           System.out.println("Ruten er opptatt!");
       }
       return;
   }

   void kryss() {
       if (rute == 1 && ttt[0][0] == ' ') {
           ttt[0][0] = 'X';
       } else if (rute == 2 && ttt[0][1] == ' ') {
           ttt[0][1] = 'X';
       } else if (rute == 3 && ttt[0][2] == ' ') {
           ttt[0][2] = 'X';
       } else if (rute == 4 && ttt[1][0] == ' ') {
           ttt[1][0] = 'X';
       } else if (rute == 5 && ttt[1][1] == ' ') {
           ttt[1][1] = 'X';
       } else if (rute == 6 && ttt[1][2] == ' ') {
           ttt[1][2] = 'X';
       } else if (rute == 7 && ttt[2][0] == ' ') {
           ttt[2][0] = 'X';
       } else if (rute == 8 && ttt[2][1] == ' ') {
           ttt[2][1] = 'X';
       } else if (rute == 9 && ttt[2][2] == ' ') {
           ttt[2][2] = 'X';
       } else if (rute > 9) {
           System.out.println("Tallet du har tastet er for høyt");
       } else {
           System.out.println("Ruten er opptatt, prøv en annen!");
       }
       return;
   }
}

 

Her er koden min, utenom det problemet jeg nevnte så funker den smertefritt, ikke helt kræsjsikkert enda, men ikke akkurat prioritet akkurat nå. Jeg har prøvd å løse dette tidligere, men alt jeg har prøvd fungerer ikke. Har nærmest gitt opp på det, uten å løse dette kommer jeg ikke videre i mitt forsøk på å lage en AI til spillet.

 

Håper noen kunne være så hyggelig å hjelpe meg på vei her. Tusen takk på forhånd!

Lenke til kommentar
Videoannonse
Annonse

Du har jo 2 muligheter med AI:

- Hardkode inn hvordan du vil den skal oppføre seg. Noe som blir tungvindt.

- Gjøre spillet om til et game-tree, og søke gjennom grafen.

 

Antall ulike spill som finner er 9! = 362 880, som er en god del - men for en datamaskin går det fort å søke gjennom.

 

Du kan la AIen sjekke brettet og bygge opp et tre med stier som forklarer alle mulige måter spiller kan gå på. Bladene i enden av treet er der enten du eller motspilleren vinner. (marker hvem som vinner). Du kan nå søke gjennom grafen og finne ut hvilke stier som fører til at du vinner eller ikke taper. Gå den stien som da er best for deg.

  • Liker 1
Lenke til kommentar

Hardkode inn AI'en kan du gjøre ved å bruke en tabell, som f. eks bruker en random tall generator til å trekke en tilfeldig tall, mellom 1-9 som skal brukes, for å så sjekke at det er ledig, hvis ikke må den trekke nytt tall. Dette blir jo da en veldig dårlig metode egentlig, da det ikke blir så tilfeldig som 9! ... Men ja, bare et tips..

Endret av ZeroS
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...