<style type="text/css">
<!--
    table.bar {
        font-family: courier new;
        font-weight: bold;
    }
    
    table.bar A {
        text-decoration: none;
        color: black;
        border: 1px black solid;
        padding: 3px;
        background: #ddffdd;
    }
    
    table.zeduel {
    }
    
    table.zeduel td {
        width: 17px;
        height: 20px;
        text-align: center;
        border-right: 1px black solid;
        border-bottom: 1px black solid;
        font-size: 9px;
    }
    
    table.zeduel tr.h td {
        background: #f4f4f4;
    }
    
    table.zeduel tr.b td {
        background: #f4f4f4;
        border-bottom: 0;
    }
    
    table.zeduel td.g {
        background: #f4f4f4;
    }
    
    table.zeduel td.d {
        background: #f4f4f4;
        border-right: 0;
    }
    
    table.zeduel tr.h td.g, table.zeduel tr.h td.d, table.zeduel tr.b td.g, table.zeduel tr.b td.d {
        background: none;
    }

    table.zeduel A {
        color: blue;
        text-decoration: none;
    }
-->
</style>

<?
    define
('COTE'15);
    
define('PUISSANCE'5);
    
    
    
/* teste si coup passé en paramètre, et retourne :
     * 0 si le coup est invalide
     * 1 si le coup est valide
     */
    
function valide($grille$rangee$direction)
    {
        
/* si la rangee n'est pas dans le tableau c'est perdu */
        
if ($rangee || $rangee constant('COTE')) return 0;
        switch (
$direction)
        {
            case 
'H':
            case 
'B':
                
$x $rangee 1;
                for (
$y 0$y constant('COTE'); $y++)
                    
/* s'il y a une case libre sur la ligne le coup est jouable */
                    
if ($grille[$x][$y] == 0) return 1;
                break;
            
            case 
'G':
            case 
'D':
                
$y $rangee 1;
                for (
$x 0$x constant('COTE'); $x++)
                    
/* s'il y une case libre sur la colonne le coup est jouable */
                    
if ($grille[$x][$y] == 0) return 1;
                break;
        }
        
/* si on arrive ici, la rangée est pleine ou la direction est fausse */
        
return 0;
    }
    
    
    
/* joue le coup passé en paramètre, et retourne :
     * 0 si le coup est invalide
     * 1 si le coup est valide
     */
    
function joue($grille$rangee$direction$joueur)
    {
        
/* on teste si le coup est jouable */
        
if (!valide($grille$rangee$direction)) return 0;
        
/* et on le traite */
        
switch ($direction)
        {
            case 
'H':
                
$x $rangee 1;
                
$y 0;
                
$pre $grille[$x][$y];
                
$grille[$x][$y] = $joueur;
                
/* tant que la case n'est pas vide on décale */
                
while ($pre && $y constant('COTE') - 1)
                {
                    
$y++;
                    
$cur $grille[$x][$y];
                    
$grille[$x][$y] = $pre;
                    
$pre $cur;
                }
                break;
            case 
'B':
                
$x $rangee 1;
                
$y constant('COTE') - 1;
                
$pre $grille[$x][$y];
                
$grille[$x][$y] = $joueur;
                
/* tant que la case n'est pas vide on décale */
                
while ($pre && $y 0)
                {
                    
$y--;
                    
$cur $grille[$x][$y];
                    
$grille[$x][$y] = $pre;
                    
$pre $cur;
                }
                break;
            case 
'G':
                
$x 0;
                
$y $rangee 1;
                
$pre $grille[$x][$y];
                
$grille[$x][$y] = $joueur;
                
/* tant que la case n'est pas vide on décale */
                
while ($pre && $x constant('COTE') - 1)
                {
                    
$x++;
                    
$cur $grille[$x][$y];
                    
$grille[$x][$y] = $pre;
                    
$pre $cur;
                }
                break;
            case 
'D':
                
$x constant('COTE') - 1;
                
$y $rangee 1;
                
$pre $grille[$x][$y];
                
$grille[$x][$y] = $joueur;
                
/* tant que la case n'est pas vide on décale */
                
while ($pre && $x 0)
                {
                    
$x--;
                    
$cur $grille[$x][$y];
                    
$grille[$x][$y] = $pre;
                    
$pre $cur;
                }
                break;
        }
        return 
$grille;
    }
    
    
    function 
autre($joueur)
    {
        if (
$joueur == 1) return(2); else return(1);
    }
    
    
    function 
lien($jouable$rangee$direction)
    {
        
$rangee++;
        if (
$jouable)
            return 
'<a href="#" onclick="grille_click(' $rangee ', \'' $direction '\'); return false;">' $rangee $direction '</a>';
        else
            return 
$rangee $direction;
    }
    
    function 
affiche($grille$jouable)
    {
        print 
'<table class="zeduel" cellspacing="0"><tr class="h"><td class="g">&nbsp;</td>';
        for (
$x 0$x constant('COTE'); $x++)
            print 
'<td>'.lien($jouable$x'H').'</td>';
        print 
'<td class="d">&nbsp;</td></tr>';
        for (
$y 0$y constant('COTE'); $y++)
        {
            print 
'<tr><td class="g">'.lien($jouable$y'G').'</td>';
            for (
$x 0$x constant('COTE'); $x++)
                print 
'<td><img src="images/zeduel'.$grille[$x][$y].'.gif" /></td>';
            print 
'<td class="d">'.lien($jouable$y'D').'</td></tr>';
        }
        print 
'<tr class="b"><td class="g">&nbsp;</td>';
        for (
$x 0$x constant('COTE'); $x++)
            print 
'<td>'.lien($jouable$x'B').'</td>';
        print 
'<td class="d">&nbsp;</td></tr></table>';
    }
    
    
    function 
gagnant($grille)
    {
        
$vainqueur 0;
        
        
/* teste les alignements en ligne */
        
for ($j=0;$j<constant('COTE');$j++)
        {
            
$cur=-1;
            for (
$i=0;$i<constant('COTE');$i++) if ($grille[$i][$j]==$cur) { if (($cur!=0)&&(++$nb==constant('PUISSANCE'))) $vainqueur|=$cur; } else { $cur=$grille[$i][$j]; $nb=1; }
        }
        
/* teste les alignements en colonne */
        
for ($i=0;$i<constant('COTE');$i++)
        {
            
$cur=-1;
            for (
$j=0;$j<constant('COTE');$j++) if ($grille[$i][$j]==$cur) { if (($cur!=0)&&(++$nb==constant('PUISSANCE'))) $vainqueur|=$cur; } else { $cur=$grille[$i][$j]; $nb=1; }
        }
        
/* teste les alignements en diagonale */
        
for ($k=constant('PUISSANCE')-constant('COTE');$k<constant('COTE')-constant('PUISSANCE')+1;$k++)
        {
            
$cur=-1;
            for (
$i=0;$i<constant('COTE');$i++)
            {
                
$j=$k+$i;
                if ((
$j>=0)&&($j<constant('COTE'))) if ($grille[$i][$j]==$cur) { if (($cur!=0)&&(++$nb==constant('PUISSANCE'))) $vainqueur|=$cur; } else { $cur=$grille[$i][$j]; $nb=1; }
            }
        }
        
/* teste les alignements en diagonale */
        
for ($k=constant('PUISSANCE')-1;$k<constant('COTE')*2-constant('PUISSANCE');$k++)
        {
            
$cur=-1;
            for (
$i=0;$i<constant('COTE');$i++)
            {
                
$j=$k-$i;
                if ((
$j>=0)&&($j<constant('COTE'))) if ($grille[$i][$j]==$cur) { if (($cur!=0)&&(++$nb==constant('PUISSANCE'))) $vainqueur|=$cur; } else { $cur=$grille[$i][$j]; $nb=1; }
            }
        }
        
        
/* on retourne le ou les gagnants */
        
return $vainqueur;
    }
?>