// $Header: /var/lib/cvs/ufoot/superdebile/ouaibe/js/superdebile.js,v 1.4 2004/01/30 15:24:41 ufoot Exp $

// Gestion d'un log applciatif basique

// Chaine globale contenant le log

var SUPERDEBILE_LOG=""

// Logge une ligne

function superdebile_log(msg) {
  SUPERDEBILE_LOG+=String(msg)+"\n";
}

// Affiche le log

function superdebile_log_display() {
  alert(SUPERDEBILE_LOG);
  SUPERDEBILE_LOG="";
}

// Gestion du formulaire Google

// Ajoute super debile a une chaine de caractere
function superdebile_google_add_params(params_orig) {
  params=params_orig+" super debile";

  return params;
}

// Met a jour le parametre q du formulaire google
function superdebile_google_on_submit() {
  document.forms['google']['q'].value=superdebile_google_add_params(document.forms['google']['q_orig'].value);
}

// Jeu de morpion debile

// Variables globales
var SUPERDEBILE_MORPION_VOID=' ';
var SUPERDEBILE_MORPION_X='X';
var SUPERDEBILE_MORPION_O='O';
var SUPERDEBILE_MORPION_SIZE=3;
var SUPERDEBILE_MORPION_EXISTS_VOID=0x01
var SUPERDEBILE_MORPION_EXISTS_X=0x02
var SUPERDEBILE_MORPION_EXISTS_O=0x04

// Renvoie la cellule ij

function superdebile_morpion_get_cell(i,j) {
  i=String(i+1);
  j=String(j+1);

  label='morpion_'+i+j;
  return document.forms['morpion'][label];
}

// Initialisation du jeu

function superdebile_morpion_init() {
  for (i=0;i<SUPERDEBILE_MORPION_SIZE;++i)
    {
      for (j=0;j<SUPERDEBILE_MORPION_SIZE;++j)
	{
	  superdebile_morpion_get_cell(i,j).value=SUPERDEBILE_MORPION_VOID;
	}
    }
}

// Renvoie vrai si le coup est legal

function superdebile_morpion_possible_play(i,j) {
  return superdebile_morpion_get_cell(i,j).value==SUPERDEBILE_MORPION_VOID;
}

// Renvoie des flags pour les evaluations de pseudo-probabilite

function superdebile_morpion_ai_test_flags(i,j) {
  var flags=0x00;

  switch (superdebile_morpion_get_cell(i,j).value)
    {
    case SUPERDEBILE_MORPION_VOID:
      flags=SUPERDEBILE_MORPION_EXISTS_VOID;
      break;
    case SUPERDEBILE_MORPION_X:
      flags=SUPERDEBILE_MORPION_EXISTS_X;
      break;
    case SUPERDEBILE_MORPION_O:
      flags=SUPERDEBILE_MORPION_EXISTS_O;
      break;
    }

  return flags;
}

// Renvoie un score pour les evaluations de pseudo-probabilite

function superdebile_morpion_ai_test_points(flags) {
  points=0;

  if (flags)
    {
      if (flags & SUPERDEBILE_MORPION_EXISTS_X)
	{
	  if (flags & SUPERDEBILE_MORPION_EXISTS_O)
	    {
	      // il y a a la fois des X et des O, c'est un bon coup debile a jouer.
	      points=3;
	    }
	  else
	    {
	      if (flags & SUPERDEBILE_MORPION_EXISTS_VOID)
		{
		  // il y a des X mais pas de O, il ne faut pas jouer ce coup sinon 
		  // on n'empecherait l'autre de gagner.
		  points=-1;
		}	  
	      else
		{
		  // il y a des X, pas de O et aucun blanc, donc l'autre peut
		  // gagner en un coup, surtout ne pas le bloquer.
		  points=-5;
		}	  	    
	    }
	}
      else
	{
	  if (flags & SUPERDEBILE_MORPION_EXISTS_VOID)
	    {
	      // il n'y a aucun X, il reste des blancs, c'est un bon coup a jouer
	      points=1;
	    }	  
	  else
	    {
	      // il n'y a aucun X, et aucun blanc, donc si on joue on gagne,
	      // il faut donc eviter ce coup a tout prix
	      points=-10;
	    }	  	    
	}
    }

  return points
}

// Renvoie des infos sur la verticale

function superdebile_morpion_ai_test_vert(i,j) {
  var flags=0x00;

  for (k=0;k<SUPERDEBILE_MORPION_SIZE;++k)
    {
      if (k!=i)
	{
	  flags|=superdebile_morpion_ai_test_flags(k,j);
	}
    }


  return superdebile_morpion_ai_test_points(flags);
}

// Renvoie des infos sur l'horizontale

function superdebile_morpion_ai_test_hori(i,j) {
  var flags=0x00;

  for (k=0;k<SUPERDEBILE_MORPION_SIZE;++k)
    {
      if (k!=j)
	{
	  flags|=superdebile_morpion_ai_test_flags(i,k);
	}
    }

  return superdebile_morpion_ai_test_points(flags);
}

// Renvoie des infos sur la 1ere diagonale

function superdebile_morpion_ai_test_diag1(i,j) {
  var flags=0x00;

  if (i==j)
    {
      for (k=0;k<SUPERDEBILE_MORPION_SIZE;++k)
	{
	  if (k!=i)
	    {
	      flags|=superdebile_morpion_ai_test_flags(k,k);
	    }
	}
    }

  return superdebile_morpion_ai_test_points(flags);
}

// Renvoie des infos sur la 2eme diagonale

function superdebile_morpion_ai_test_diag2(i,j) {
  var flags=0x00;

  if (i==SUPERDEBILE_MORPION_SIZE-j-1)
    {
      for (k=0;k<SUPERDEBILE_MORPION_SIZE;++k)
	{
	  if (k!=i)
	    {
	      flags|=superdebile_morpion_ai_test_flags(k,SUPERDEBILE_MORPION_SIZE-k-1);
	    }
	}
    }

  return superdebile_morpion_ai_test_points(flags);
}

// Evalue un coup, point de vue AI, suppose que la case est vide

function superdebile_morpion_ai_evaluate_play(i,j) {
  var points=0;

  points+=superdebile_morpion_ai_test_vert(i,j);
  points+=superdebile_morpion_ai_test_hori(i,j);
  points+=superdebile_morpion_ai_test_diag1(i,j);
  points+=superdebile_morpion_ai_test_diag2(i,j);

  return points;
}

// Coup joue par le joueur
function superdebile_morpion_ai_play() {
  var best_i=0;
  var best_j=0;
  var best_points=-1000;

  for (i=0;i<SUPERDEBILE_MORPION_SIZE;++i)
    {
      for (j=0;j<SUPERDEBILE_MORPION_SIZE;++j)
	{
	  if (superdebile_morpion_possible_play(i,j)) 
	    {
	      var points=superdebile_morpion_ai_evaluate_play(i,j);
	      if (points>best_points)
		{
		  best_points=points;
		  best_i=i;
		  best_j=j;
		}
	    }
	}
    }

  if (superdebile_morpion_possible_play(best_i,best_j)) 
    {
      superdebile_morpion_get_cell(best_i,best_j).value=SUPERDEBILE_MORPION_O;
    }
}

// Verifie si un des joueurs a gagne

function superdebile_morpion_check_win(team) {
  var won=false;

  var check_diag1=true;
  var check_diag2=true;

  for (i=0;i<SUPERDEBILE_MORPION_SIZE;++i)
    {
      var check_vert=true;
      var check_hori=true;

      for (j=0;j<SUPERDEBILE_MORPION_SIZE;++j)
	{
	  if (superdebile_morpion_get_cell(i,j).value!=team)
	    {
	      check_vert=false;
	    }
	  if (superdebile_morpion_get_cell(j,i).value!=team)
	    {
	      check_hori=false;
	    }
	}

      if (check_vert || check_hori)
	{
	  won=true;
	}

      if (superdebile_morpion_get_cell(i,i).value!=team)
	{
	  check_diag1=false;
	}
      if (superdebile_morpion_get_cell(i,SUPERDEBILE_MORPION_SIZE-i-1).value!=team)
	{
	  check_diag2=false;
	}
    }

  if (check_diag1 || check_diag2)
    {
      won=true;
    }

  return won;
}

// Verifie si le jeu est fini

function superdebile_morpion_check_end() {
  var end=true;

  for (i=0;i<SUPERDEBILE_MORPION_SIZE;++i)
    {
      for (j=0;j<SUPERDEBILE_MORPION_SIZE;++j)
	{
	  if (superdebile_morpion_possible_play(i,j))
	    {
	      end=false;
	    }
	}
    }

  if (superdebile_morpion_check_win(SUPERDEBILE_MORPION_X))
    {
      alert("T'as gagné, c'est normal Supe Débile perd toujours!");
      end=true;
      superdebile_morpion_init();
    }

  if (superdebile_morpion_check_win(SUPERDEBILE_MORPION_O))
    {
      alert("T'as perdu, c'est IN-CRO-YA-BLE!!! Comment as-tu donc fait? T'es vraiment débile ou quoi?");
      end=true;
      superdebile_morpion_init();
    }

  return end;
}

// Coup joue par le joueur

function superdebile_morpion_visitor_play(i,j) {
  if (superdebile_morpion_possible_play(i,j)) 
    {
      superdebile_morpion_get_cell(i,j).value=SUPERDEBILE_MORPION_X;

      if (!superdebile_morpion_check_end())
	{
	  superdebile_morpion_ai_play();
	  superdebile_morpion_check_end();
	}
    }
}

function course_start(distance) {
  alert("C'est parti, en route pour "+distance+" mètres!");
  for (i=distance-1; i>0; --i) {
    alert("Courage, plus que "+i+" mètres...");
  }
  alert("Bravo, quel talent!");
}

