<!-- 
//----------------------------------------------------------------------
// Auteur : Frédéric MAIRE (c) 1998 All right reserved
// Juin 1998 creation
// Sept 1998 reprogrammation, plus objet, meilleur IA
// Dec  1998 Ia tenant compte du coup en retour du joueur
//----------------------------------------------------------------------

nbImg = 1;
kCases = 6; // nb de cases dans chaque camp
maxGrain = 13; // grain16 + 1

var img;
var imgVic;
var game;

// - - - - - - - - - - - - - - - -

// Chargement des images du jeu
function ChargeImg() {
    img = new Array(maxGrain);
    for (i=0; i<maxGrain; i++) {
        img[i] = new Image(52,52);
        img[i].src = "grain" + eval(i) + ".gif";
    }
    imgVic = new Array(4);
    imgVic[0] = new Image(128,60);
    imgVic[0].src = "lab_defaite.gif";
    imgVic[1] = new Image(128,60);
    imgVic[1].src = "lab_victoire.gif";
    imgVic[2] = new Image(128,60);
    imgVic[2].src = "lab_equalite.gif";
    imgVic[3] = new Image(128,60);
    imgVic[3].src = "null.gif";
}

ChargeImg();

//--------------------
// objects
//--------------------

function show_props(obj, obj_name) { 
    var result = "" 
    for (var i in obj) 
        result += obj_name + "." + i + " = " + obj[i] + "\n" 
    return result; 
} 

// - - - - - - - - - - - - - - - -
//  PositionClass
// - - - - - - - - - - - - - - - -

function CalculatePosition( pos, jou, num) {
// calculate the future position in "this" for
// a play in (jou,case) on position "pos"
// (no valid move => fut=pos)
var icase, distrib, idxjou, ijou, inum;

    this.Copy( pos);

    distrib = this.plat[jou][num];
    this.plat[jou][num] = 0;
    idxjou = (jou==1)?1:-1; // player forward and computer backward
    ijou = jou; 
    inum = num;
    // distribue les graines 1 par case sauf sur celle de depart
    while (distrib > 0) {
        // avance en changeant eventuellement de camp
        if ((inum==kCases-1) && (ijou==1)) {
            idxjou = -1; ijou = 0;
        } else if ((inum==0) && (ijou==0)) {
            idxjou = 1; ijou = 1;
        } else {
            inum += idxjou;
        }
        // saute la case initiale
        if ((ijou!=jou)||(inum!=num)) {
            distrib--;
            this.plat[ijou][inum]++;
        }
    }
    // Si la case finale contient apres depot 2 ou 3 graines, 
    // et que la case finale est dans le camp adverse
    // elles sont capturees et mises dans la reserve,
    // on applique la regle en reculant
    idxjou = -idxjou; // on recule
    while (((this.plat[ijou][inum]==2) || (this.plat[ijou][inum]==3)) && (jou!=ijou)) {
        this.reserve[jou] += this.plat[ijou][inum];
        this.plat[ijou][inum] = 0;

        if ((inum==kCases-1) && (ijou==0)) {
            idxjou = -1; ijou = 1;
        } else if ((inum==0) && (ijou==1)) {
            idxjou = 1; ijou = 0;
        } else {
            inum += idxjou;
        }
    }
}
function EvaluatePosition( jou) {
var som;
var ajou;
    ajou = (jou==0)?1:0; // adversaire
    // random pour ne pas avoir toujours le meme jeux
    som = 10 + Math.round( Math.random()*10)/10;
    // bonus pour la capture de graines
    som += this.reserve[jou]*2 - this.reserve[ajou];
    // malus pour les cases 1-2 
    for (var i; i<kCases; i++) {
        som -= (this.plat[jou][i]==1)?1:0;
        som -= (this.plat[jou][i]==2)?1:0;
    }
    // bonus pour les cases 1-2 adverses
    for (var i; i<kCases; i++) {
        som += (this.plat[ajou][i]==1)?1:0;
        som += (this.plat[ajou][i]==2)?1:0;
    }
    // bonus pour le nombre de cases attaquees
    // malus pour affame l'adversaire
    if (this.IsFamine((jou==0)?1:0)) { som -= 50; }

    return som;
}
function IsFaminePosition( jou) {
    famine = true;
    for (var inum=0; inum<kCases; inum++) {
        famine = famine && (this.plat[jou][inum]==0);
    }
    return famine;
}
function IsValidMovePosition( jou, num) {
    return this.plat[jou][num] != 0;
}
function CopyPosition( pos) {
    for (var i=0; i<pos.reserve.length; i++) {
        this.reserve[i] = pos.reserve[i];
    }
    for (var i=0; i<kCases; i++) {
        this.plat[0][i] = pos.plat[0][i];
        this.plat[1][i] = pos.plat[1][i];
    }
}
// generate a start position
function SetStartPosition() {
    for (var i=0; i<this.reserve.length; i++) {
        this.reserve[i] = 0;
    }
    for (var i=0; i<kCases; i++) {
        this.plat[0][i] = this.plat[1][i] = 4;
    }
}
function PositionClass() {
    // attributes
    this.reserve = new Array(2);
    this.plat = new Array(2); 
    this.plat[0] = new Array(kCases); // computer
    this.plat[1] = new Array(kCases); // player
    // init attributes
    this.reserve[0] = this.reserve[1] = 0;
    for (var i=0; i<this.plat.length; i++) { 
        this.plat[0][i] = this.plat[1][i] = 0; 
    }
    // methods
    this.Copy = CopyPosition;
    this.Evaluate = EvaluatePosition;
    this.Calculate = CalculatePosition;
    this.IsValidMove = IsValidMovePosition;
    this.IsFamine = IsFaminePosition;
    this.SetStart = SetStartPosition;
}
//function PositionClass( position) {
//    this = new PositionClass();
//    this.Copy( position);  
//}


// - - - - - - - - - - - - - - - -
//  GameClass
// - - - - - - - - - - - - - - - -

function AffCaseVal( jou, num, val) {
    if (num==kCases) {
        icase = (jou==1)?0:kCases+1;
    } else {
        icase = jou*7 + num +1;
    }
    if (val >= maxGrain) {
        document.images[icase+nbImg].src = img[maxGrain-1].src;
    } else {
        document.images[icase+nbImg].src = img[val].src;
    }
}

function PlayAIGame( jou) {
// not IsFamine
var ajou = (jou==0)?1:0;
var best = -100000;
var bestnum, bestnumj;
var numj;
    bestnum = 0;
    for (var inum=0; inum<kCases; inum++) {
        this.evalPosIA[inum] = -100000;
	  if (this.actPos.plat[jou][inum] != 0) {
            this.futPos.Calculate( this.actPos, jou, inum);
            this.evalPosIA[inum] = this.futPos.Evaluate(jou);
            bestnumj = 0;
            // evalue en retour le coup de l'adversaire
            bestnumj = -100000;
            for (var ijnum=0; ijnum<kCases; ijnum++) {
                this.futPos2.Calculate( this.futPos, ajou, ijnum);
                numj = this.futPos2.Evaluate(ajou);
                if (numj > bestnumj) {
                    bestnumj = numj;
                }
            }
        }
        this.evalPosIA[inum] = this.evalPosIA[inum] - bestnumj;
        if (this.evalPosIA[inum] >= best) {
            bestnum = inum;
            best = this.evalPosIA[inum];
        }
    }
/*
alert ("IA : "+eval(bestnum)+"\n"+ 
 "0 : "+eval(this.evalPosIA[0])+"\n"+
 "1 : "+eval(this.evalPosIA[1])+"\n"+
 "2 : "+eval(this.evalPosIA[2])+"\n"+
 "3 : "+eval(this.evalPosIA[3])+"\n"+
 "4 : "+eval(this.evalPosIA[4])+"\n"+
 "5 : "+eval(this.evalPosIA[5]) );
*/
    this.Play( jou, bestnum);
}
function PlayGame( jou, num) {
    if (this.actPos.plat[jou][num] != 0) {
        this.futPos.Calculate( this.actPos, jou, num);
        this.actPos.Copy( this.futPos);
        this.Repaint();
    } else {
        // case invalide
        if (this.actPos.IsFamine(jou)) {
            // punition : toutes les graines a l'adversaire
            for (var inum=0; inum<kCases; inum++) {
                this.actPos.reserve[jou] += this.actPos.plat[(jou==0)?1:0][inum];
                this.actPos.plat[(jou==0)?1:0][inum] = 0;
            }   
            this.isEnd = true;
            this.Repaint();
        }
    }
}
function RepaintGame() {
    for (var ijou=0; ijou<2; ijou++) {
        // reserve
        document.score[6+ijou].value = this.actPos.reserve[ijou];
        AffCaseVal( ijou, kCases, this.actPos.reserve[ijou]);
        // les cases
        for(inum=0; inum<kCases; inum++) {
            AffCaseVal( ijou, inum, this.actPos.plat[ijou][inum]);
            document.score[inum+ijou*(kCases+2)].value = this.actPos.plat[ijou][inum];
        }
    }

}
function SetNewGame() {
    this.actPos.SetStart();
    this.isEnd = false;
}
function GameClass() {
    // attributes
    this.name = "AWELE";
    this.actPos = new PositionClass();
    this.futPos = new PositionClass();    
    this.futPos2 = new PositionClass();    
    this.evalPosIA = new Array(kCases);  
    this.isEnd = false;
    // methods
    this.SetNew = SetNewGame;
    this.Repaint = RepaintGame;
    this.PlayAI = PlayAIGame;
    this.Play = PlayGame;
}


// - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - -

function Init() {
    game = new GameClass();
//alert( show_props( game, "GameClass"));
//alert( show_props( game.actPos, "PositionClass"));
    game.SetNew();
    game.Repaint();
}

function PlayFirst() {
    game.PlayAI(0);
}
function ChoixGrain( jou, num) {
var valid;
    if (jou==1) {
        valid = game.actPos.IsValidMove(jou,num);
        game.Play(jou,num);  // pour detection fin
        if (valid) {
            if (!this.isEnd) //game.PlayAI(0);
				  setTimeout( 'PlayFirst();', 1000);
        }
    }
    if (game.isEnd) EndGame();
}
function NewGame() {
    document.images["Victoire"].src = imgVic[3].src;
    game.SetNew();
    game.Repaint();
}
function AskEndGame() {
}
function EndGame() {
    if (game.actPos.reserve[0] == game.actPos.reserve[1]) {
        // null
	  document.images["Victoire"].src = imgVic[2].src;
    } else 
    if (game.actPos.reserve[0] < game.actPos.reserve[1]) {
        // gagne
	  document.images["Victoire"].src = imgVic[1].src;
    } else {
        // perdu
	  document.images["Victoire"].src = imgVic[0].src;
    }
}

// - - - - - - - - - - - - - - - -

// -->

