/* kayles.js 
  Game of Kayles

  Copyright © 2002-2005 Jean-Paul Davalan <jpdvl@wanadoo.fr>
  
  visit :
  http://perso.wanadoo.fr/jean-paul.davalan/

*/


var nombres = new Array("aucun", "un", "deux","trois", "quatre","cinq",
"six","sept","huit","neuf","dix","onze","douze","treize","quatorze",
"quinze","seize","dix-sept","dix-huit","dix-neuf","vingt","21","vingt-deux","vingt-trois","vingt-quatre"); //plus qu'il n'en faut

function tolettres(n) {
  if(n<nombres.length) return nombres[n];
  else return n;
}

var ord = new Array(" ","premier","deuxième","troisième","quatrième","cinquième","sixième","septième","huitième","neuvième","dixième","onzième","douzième","treizième","quatorzième","quinzième","seizième","dix-septième");


lang="fr";


var hist=new Array();
var current;
var etatjeu="fini";

var Im=new Array();
Im[0]=new Image();Im[0].src="vert.png";
Im[1]=new Image();Im[1].src="or0.png";
Im[2]=new Image();Im[2].src="or1.png";
Im[3]=new Image();Im[3].src="nvelle0.png";
Im[4]=new Image();Im[4].src="nvelle1.png";
Im[5]=new Image();Im[5].src="nvelle2.png";
Im[6]=new Image();Im[6].src="chge0.png";
Im[7]=new Image();Im[7].src="chge1.png";
Im[8]=new Image();Im[8].src="chge2.png";

var prec, tb0 = new Array(), tb1 = new Array(), ordijoue=0;
var grp = new Array();
var grppos = new Array();
var ngrp;
var nparties=0, ngagne=0;
var nbcases=15

function wtable() {
  var s='<table style="{border:1 solid #dd0000;margin:5 10 5 0;background: #ffffff url="stries.png" repeat}" cellspacing=0 cellpadding=0><tr>'
  for(i=0;i<nbcases;i++)
  s += '<td><img name="k'+i+'" onmouseover="pselect('+i+');" onclick="joue()" style="{cursor:pointer;}" border=0 width="37" height="37" alt=""></td>'
  s += '</tr></table>'
  document.getElementById("Gme").innerHTML=s;
  for(i=0;i<nbcases;i++) document.images["k"+i].src=Im[0].src;
}

function affparties() {

  var s;
  var lett = tolettres(nparties);
  if(nparties==0) {
    s = "Aucune partie n'a encore été jouée";
  } else {
    if(ngagne==0) {
      if(nparties==1)
        s = "Vous avez perdu l'unique partie jouée";
      else {
        s = "Vous n'avez gagné aucune des "+lett+" parties jouées";
      }
    } else if (ngagne==nparties) {
        if(nparties==1) {
          s= "Vous avez gagné l'unique partie jouée";
         } else {
           s = "Vous avez gagné la totalité des "+lett+" parties jouées";
         }
    } else {
      if(ngagne==1) 
      s = "Vous avez gagné une partie parmi les "+lett+" jouées";
      else
      s = "Vous avez gagné "+tolettres(ngagne)+" parties parmi les "+lett+" jouées";
    }
  }
  document.getElementById("Parties").innerHTML = s;

}

/* 
on peut dire tout de suite que la valeur de la fonction de Grundy
pour un seul amas de p jetons est p
et donc Grun[p] =  grundy(p) = p;

var Grun = new Array(); 
Grun[0] = 0; Grun[1] = 1;
for(i=2;i<=100;i++) Grun[i] = -1;
*/

function commence() { 
  etatjeu="initialisé"
  current=0;
  wtable();
  var i,j=0, total=0, max=0.35*nbcases;
  var u = 0;
  for(i=0; i<nbcases && total < nbcases; i += u) {
    u = 2+Math.floor(max*Math.random());
    if(total+u > nbcases) 
      u = nbcases-total+1;
    for(j=i; j<i+u-1; j++) {
      tb0[j] = tb1[j]=1;
      document.images["k"+j].src=Im[1].src;
    }
    j = i+u-1;
    if(j < nbcases) {
      tb0[j] = tb1[j]=0;
      document.images["k"+j].src=Im[0].src;
    }
  }
      
  prec=-1;
  tb0[nbcases]=0; /* pratique pour marquer la fin de la bande de jetons
                voir la fonction : valeurjeu() */
}

dimstate="attente"
function setDim() {
  var n=parseInt(document.frm.dim.value);
  if(n==nbcases) {
    addhist("Le nombre de cases du jeu reste inchangé, il était déjà de "+nbcases+" cases");
  } else if(n<=25 && n>=5) {
    nbcases=n;
    addhist("Le nombre de cases du jeu est maintenant de "+nbcases+" cases");
    commence();
  } else {
    addhist("Le nombre de cases doit &ecirc;tre compris entre 6 et 25");
  }
  dimstate="attente"
}

function addhist(s) {
  var st="";
  hist[current] = s;
  current++;
  for(var i=0;i<current;i++) {
   st += hist[i]+"<br />"
  }
  st +="<br />";
  document.getElementById("MesgArea").innerHTML=st;
}

function dimWrite() {
  if(dimstate=="attente") {
    dimstate="ecriture"
    document.frm.dim.value="";
  }
}
function pselect(x) {
  var i = x, j, k;
  if(tb1[i]==2){ 
    tb1[i]=1;
    if (0<=prec && prec<nbcases && (prec==i-1 || prec==i+1))
      i = prec;
  } else if(tb1[i]==1)
    tb1[i]=2;
 
    for(j=i-1;j>=0 && tb1[j] ==2; j--);
    for(k=j;k>=0;k--) 
      if (tb1[k]==2) tb1[k]=1
    for(j=i+1;j<nbcases && tb1[j] ==2; j++);
    for(k=j;k<nbcases;k++)
      if (tb1[k]==2) tb1[k]=1
  
  for(i=0;i<nbcases;i++) {
    if(tb1[i]==2)
      document.images["k"+i].src=Im[2].src;
    else if (tb1[i]==1)
      document.images["k"+i].src=Im[1].src;
  }
  prec = x;
}

function calculetas() {
  var s="", ntas=0, etat=0, i, j, k, ng=0, g, tot=0;
  for(i=0;i<nbcases;) {
     if(etat==0) {
       while(i<nbcases && tb1[i]!=1) i++
       if(i<nbcases) {
         ng++;
         etat=1;
         g=0;
         while(i<nbcases && tb1[i]==1) {
           i++;
           g++;
         }
         if(s!="") s += ","
         s +=" "+g
         tot += g;
         etat = 0;
       }
    }
  }
  if(ng!=0)
    addhist("Il y a "+nombres[ng]+" tas de "+s+" pion"+((tot<2)?"":"s"));
  
}

function joue() {
  if(etatjeu=="fini") {
    addhistory("Commencez une partie");
    return;
  }
  var i, j, t, test=1;
  ordijoue = 0;
  var z=0;
  for(i=0;i<nbcases;i++) {
    if(tb1[i]==2) {
      ordijoue=1;
      z++;
      tb0[i]=0;
    }
  }
  if(z==0) {
    var s="<span style='{color:#990000;}'>Vous devez retirer au moins un pion</span>";
    addhist(s);
    return;
  }
  var s="<span style='{color:#008800;}'>Vous avez retiré "+nombres[z]+" pion"+((z<2)?"":"s")+"</span>";
  addhist(s);
  calculetas();
  if(ordijoue==1) {
    for(i=0;i<nbcases;i++) {
       tb1[i] = tb0[i];
       if(tb0[i]==0) document.images["k"+i].src=Im[0].src;
       else document.images["k"+i].src=Im[1].src;
    }
    t = valeurjeu();
    if(ngrp==0) {
      addhist("<span style='{color:#000088;font-style: bolder;font-size:16px;}'>Félicitations, vous avez gagné</span>");
      nparties++;
      ngagne++;
      affparties();
      return ;
    }
    for(i=0;t!=0 && test==1 && i<ngrp;i++) {
      var k = sdig(grp[i],t)
      if(k<= grp[i]) {
        test = 0;
        
        t = grp[i]-k;
        for(j=grppos[i];j<grppos[i]+t;j++) {
          tb0[j]=0;
          document.images["k"+j].src=Im[0].src;
        }

        var u=((t<2)?"":"s");
        var u1 = ((k<2)?"":"s");
        var s = "L'ordinateur retire "+nombres[t]+" pion"+u+" du "+ord[(i+1)]+" tas";
        if(k==0)
          s += " qui est totalement vidé";
        else {
          if(k==1)
          s += " qui ne contient plus qu'un pion";
          else
          s += " qui ne contient plus que "+nombres[(k)]+" pion"+u1; 
        }
        addhist(s);
      }
    }  
    if(t==0 || test==1) {
      j = grppos[0];
      tb0[j] = 0;
      document.images["k"+j].src=Im[0].src;
      addhist("L'ordinateur retire un pion du premier tas");
      //calculetas();
    }
    for(j=0;j<nbcases;j++) {
      tb1[j] = tb0[j];
    }
    t = valeurjeu();
    if(ngrp==0) {
      addhist("<span style='{color:#0000aa;font-style: bolder;font-size:15px;}'>Vous avez perdu</span>");
      nparties++;
      affparties();
      etatjeu="fini";
    }
  }

}
/* somme digitale
    13 = 1 1 0 1  en base 2
     6 =   1 1 0   "
   --------------
    11 = 1 0 1 1  somme digitale

  c'est le XOR noté ^ en javascript
*/


function sdig(a,b) { 
	return a ^b;
}

/* Cans le jeu de nim-Kayes, omme pour le nim simple la valeur de Grundy 
   d'un tas est sa taille */

function grundy(x) {
  return x;
}

/* il suffit de faire un XOR avec les tailles de tous les tas
 */
function valeurjeu() {
  var i, v = 0, s = 0;
  ngrp = 0;
  tb0[nbcases]=0;
  for(i=0;i<=nbcases;i++) {
    if(tb0[i]==1) v++;
    else if(v!=0) { // car inutile si des 0 successifs
      grp[ngrp] = v;
      grppos[ngrp] = i-v;
      ngrp += 1;
      
      if(s != 0) s = sdig(s,v); // sdig( grundy(s), grundy(v));
      else s = v; // grundy(v);
      v = 0; //remise à 0 pour le groupement suivant
    }
  }
  return s;
}	

function valeurjeu1() {
  var i, v, etat=0, s = 0;
  ngrp = 0;
  //tb0[nbcases]=0; // pour pouvoir terminer
  for(i=0;i<=nbcases;i++) {  // d'où le <= nbcases
    if(etat==0 && tb0[i]==1) { // nouveau groupe
       v = 1;
       ngrp++;
       grppos[ngrp] = i;
       etat = 1;
    } else if (etat==1 && tb0[i]==1) {
       v++;
    } else if(etat==1 && tb0[i]==0) { // fin du tas
       grp[ngrp] = v;
       ngrp++;
       s = sdig(s,v);
       etat = 0;
    } else { ; } // rien à faire
  }
  return s;
}

