algorytm teorii gier

0

witam

jas i malgosia ciagna karty z talii n kart
moga wyciagnac tylko 1, 2 lub 4 karty w jednej turze
ciagna na zmiane
gra sie skonczy gdy zabraknie kart
oboje graja bezblednie. jas zawsze zaczyna
na wejsciu jest podawana ilosc kart
na wyjsciu jest podawany zwyciesca

nie wiem jak to zrobic
probowalem za pomoca algorytmu minmax ale nie wiem jak zrobic drzewa gdzie sa wiecej niz 2 galezie
mozna prosic o jakies wskazowki ?

znalazlem cos i sprobowalem za pomoca rekurencji ale dalej nie dziala jak powinno


    state[0] = 1;
    state[1] = 2;
    state[2] = 4;
typedef long long Handle;
vector<Handle> tab(n);
bool przegrana (vector<Handle> &tab) // jesli ten gracz nie ma ruchu to przegrywa
{
     Handle j = (Handle)tab.size();
     for(int i = 1; i <=j; i++)
              if (tab[i] > 1) return false;

    return true;     
}

Handle minimax(vector<Handle> &tab , int gracz)
{
     if ( przegrana (tab) ) return ( gracz == 1 ) ? 1 : -1; 
     int m , mmx,i;
     m = 0;
     Handle j = (Handle)tab.size();
     Handle maxvalue = tab[j];

     gracz = gracz ? 0: 1; // zmieniamy graczy aby analizowac ruch rzeciwnika
     
     mmx = gracz ? -maxvalue : maxvalue ;
     for (i = 0; i<3; i++)
     {
         if (tab[j] > 1)
         {
             
             tab[j]-=state[i];

             m = minimax (tab,gracz);
             
             tab[j]+=state[i];
             }
         if(((gracz == 0) && (m < mmx)) || ((gracz == 1) && (m > mmx))) mmx = m;
     }
     //cout<< m << " " << mmx << " " <<tab[j]<<" "<<gracz<<endl;
     return mmx;
}

int graj (vector<Handle> &tab, int &gracz)
{
     Handle ruch, i, m, mmx; 
     Handle j = (Handle)tab.size();
     Handle maxvalue = tab[j];
     
     bool p = false;
     int last_array=j;
     
     mmx = gracz ? -maxvalue : maxvalue ; // gracz pierwszy to MIN i minimalizuje
     for ( i = 0; i<3; i++) // dla 1 , 2, 4
     {
         j = (Handle)tab.size();

         tab[j]-=state[i];
         m = minimax (tab,gracz);
         tab[j]+=state[i];
         
         if(m > mmx)
         {
              mmx = m; ruch = i;
              /**/
         }
         }
         
          
     }
     tab[j]-=state[ruch];
     if ( stick < state[ruch] )
         if (whichs > j)
         {
         whichs = j;
         stick = state[ruch];
         }
     if(tab[j] <= 1 ) tab.pop_back();
     
     gracz = gracz ? 0 : 1; // zmieniamy graczy
     
}

Pozdrawiam

0

jeśli się nie mylę to o zwycięstwie decyduje wartości n%3 albo n%5 lub coś w tym stylu.
Pograj troszkę z kimś w tą grę i w ten sposób opracuj strategię.

1 użytkowników online, w tym zalogowanych: 0, gości: 1