Gå til innhold

Problemer med AI-kode til spillet Nim


Anbefalte innlegg

Hei

 

Sitter med en programmeringsoppgave som dreier seg om det urgamle spillet Nim (det ved at man har flere rader med ulikt antall pinner, og to spillere trekker etter tur fra kun en rekke per gang, og den som trekker den siste pinnen vinner).

 

Har laget det meste, men mangler litt på selve datamaskinspiller-koden. Har surfet rundt og lastet ned masser av kildekode, men har ikke klart å få dentil å virke i mitt spill. Det skal finnes en algoritme som gjør at, dersom maskinspilleren trekker først, vinner uansett. Og begynner man selv, kan man ikke gjøre en eneste feil uten at maskinen vinner igjen.

 

 

Vet at selve algoritmen benytter XOR (uten at jeg helt har forstått hvorfor..). Sånn som det er nå, virker det som om boolean-flagget fantLosning aldri blir sann, dvs d der XOR-biten ikke funker som det skal. Er det noen som er hva som er gale med denne koden?

 

Her er koden så langt (JAVA):

 

/**
    * nesteTrekk(rader[])
    *
    * Utfører neste trekket for denne spilleren. MaskinSpiller forsøker å
    * utføre et trekk så smart så mulig for å sikre seg seieren.
    *
    * @return Returerer denne spillerens trekk
    */    
   public Trekk nesteTrekk(int rader[])
   {   
       
       int radNr=0;
       int antPinner=0;
               
       boolean fantLosning=false;
       
       for (int rad=0; rad < rader.length; rad++)
       {
           int xorStart = 0;
           
           for (int i=0; i < rader.length; i++)
               xorStart ^= rader[i];
                       
           for (int pinner=1;
                pinner <= rader[rad] && !fantLosning;
                pinner++)               
           {
               int xor = xorStart ^ (rader[rad] - antPinner);
               if (xor == 0)
               {
                   fantLosning = true;
                   radNr = rad;
                   antPinner = pinner;
               }
           }            
       }
       

       
       // finner vi ikke en god løsning, trekk en pinne fra en rad med flest pinner
       if (!fantLosning)
       {
           int radMedFlestPinner=0;
           int maksPinner =0;
           for (int i=0; i < rader.length;i++)
           {
               if (rader[i] > maksPinner)
               {
                   maksPinner = rader[i];
                   radMedFlestPinner = i;                   
               }                                
           }           
           radNr = radMedFlestPinner;
           antPinner = 1;
       }        
                                       
       // Returner trekket
       return new Trekk(antPinner, radNr);                                         
   } 

 

 

Håper noen ser feilen (eller har en bedre ide)

 

BRSSEB

Lenke til kommentar
Videoannonse
Annonse

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...