//---------------------------------------------------------------------------
//Copyleft 1998 ACME Inc 1998  (Lord Aerofago & Tugomira )
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// vari motori AI con capacita di gioco (si spera) crescenti
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Gioca semplicemente le carte possedute in ordine crescente
Risultato scopainordine(int prof,int giocatore, int squadra ,Stato pos)
{
 Risultato ris_succ;
 Carta poggio;
 AGiocata elencoprese;
 // DEB
  ris_succ.valore = 42;
  poggio = primacarta(pos.inmano);
  giocatePossibili( poggio, &elencoprese, &pos);
  ris_succ.mossa = elencoprese.arr[0];
 return ris_succ;
}

//---------------------------------------------------------------------------
// sceglie la giocata che gli fa prendere piu carte
Risultato scopaboccalone(int prof,int giocatore, int squadra ,Stato stato)
{
 Risultato ris_succ;
 Carta poggio;
 AGiocata tutteprese,questapresa;
 int i,ibest,ncarta;

 tutteprese.pos =0; // init

 //mette in tutteprese tutte le prese possibili con le carte inmano
 poggio = primacarta(stato.inmano);
 giocatePossibili( poggio, &questapresa, &stato);
 mettigiocate(&questapresa,&tutteprese);
 for (ncarta = 1; ncarta<stato.inmano->tot; ncarta++)
  if (proxcarta(stato.inmano,&poggio))
  {
   giocatePossibili(poggio, &questapresa, &stato);

   mettigiocate(&questapresa,&tutteprese);
   /*
   int s,d;
   for (s = 0,d=tutteprese.pos; s<questapresa.pos; d++,s++)
     tutteprese.arr[d] = questapresa.arr[s];
   tutteprese.pos += questapresa.pos;
   */
  }

 // sceglie la presa che porta a raccogliere piu carte
 ris_succ.valore = -1000;
 for(i = 0; i<tutteprese.pos; i++)
 {
  if (tutteprese.arr[i].prendi.tot > ris_succ.valore)
  {
    ibest = i;
    ris_succ.valore = tutteprese.arr[i].prendi.tot;
  }
 }

 ris_succ.mossa = tutteprese.arr[ibest];
 return ris_succ;
}

//---------------------------------------------------------------------------
// I prossimi si differenziaranno soltanto nell'euristica
// quindi scrivo solo quella dopo aver scritto l'algoritmo generale
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Sceglie la giocata ad euristica maggiore
Risultato scopapiatto(int prof,int chi, int squadra ,Stato stato)
{
 Risultato ris_succ;
 Carta poggio;
 Stato nuovostato;
 Gruppo inmano;

 AGiocata tutteprese,questapresa;
 int i,ibest,ncarta,valore;

 tutteprese.pos =0; // init

 //mette in tutteprese tutte le prese possibili con le carte inmano
 poggio = primacarta(stato.inmano);
 giocatePossibili( poggio, &questapresa, &stato);
 mettigiocate(&questapresa,&tutteprese);
 for (ncarta = 1; ncarta<stato.inmano->tot; ncarta++)
 {
  if (proxcarta(stato.inmano,&poggio))
  {
   giocatePossibili(poggio, &questapresa, &stato);
   mettigiocate(&questapresa,&tutteprese);
  }
 }
 // sceglie la presa con euristica migliore
 ris_succ.valore = -1000;
 for(i = 0; i<tutteprese.pos; i++)
 {
  nuovostato = stato;
  inmano = *stato.inmano ;
  cambiastato(chi,squadra,tutteprese.arr[i],&inmano,&nuovostato);
  contapunti(&nuovostato);
  if ((valore = euristica(squadra,&nuovostato)) > ris_succ.valore)
  {
    ibest = i;
    ris_succ.valore = valore;
  }
  visueuristica(valore,tutteprese.arr[i],nuovostato);
 }

 ris_succ.mossa = tutteprese.arr[ibest];
 return ris_succ;
}
//---------------------------------------------------------------------------
// bonta statica della giocata (versione cazzata 0)
int euristica(Stato *stato)
{
 int out = 0;
 return stato->prese[0].tot - stato->prese[1].tot;
}
//---------------------------------------------------------------------------
// c'era una versione 3/4 di cazzata che si e persa nella nebbia
//---------------------------------------------------------------------------
// bonta statica della giocata (versione mezza cazzata)
int euristica(int chi,Stato *stato)
{
 int out = 0;

 // carte
 out += stato->prese[chi].tot ;
 // punti gia fatti (primiera ad esempio)
 out += stato->punti[chi]*50;
 // scope
 out += stato->scope[chi]*100;
 // primiera
 out += contaprim(stato->stat[chi]);
 // ori
 out += stato->stat[chi].nori*20;

 return out;
 // DEB non credo che serva in questo caso: l'euristica e sempre positiva
 // normalizzazione segno
 //if (chi == 0) return out;
 //else return out * (-1);
}

