Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

JEU DU MORPION INTELLIGENT: HUMAIN VERSUS PHP


Information sur la source

Catégorie :Jeux Classé sous : morpion, jeu, ia Niveau : Débutant Date de création : 30/10/2005 Date de mise à jour : 17/12/2005 14:38:08 Vu / téléchargé: 7 248 / 691

Note :
7,86 / 10 - par 7 personnes
7,86 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

Description

Jouez en ligne au jeu du morpion contre l'ordinateur.
Personnalisez le niveau.
Présence d'un mode invincible (corrigé 1 fois).
Gestion des points.

Mais surtout, amusez-vous bien !
 

Source

  • <?php
  • //======================================= http://altert.family.free.fr/ ========
  • $BackGroundColor = "#F8F8F8";
  • $ActiveCellColor = "yellow";
  • //------------------------------------------------------------------------------
  • function GetGet($Value,$DefaultValue) {
  • //INFO: l'utilisation de HTMLSPECIALCHARS évite les trous de sécurité du type
  • // http://localhost/morpion.php?game=100020010&level=2&serverpts=<script>alert("Salut");</script>&playerpts=0
  • if (isset($_GET[$Value])) {
  • if ($_GET[$Value]=='')
  • return $DefaultValue;
  • else
  • return htmlspecialchars($_GET[$Value]);
  • } else
  • return $DefaultValue;
  • }
  • function HasChar($Text,$Char) {
  • $HasC = false;
  • for ($i=0 ; $i<strlen($Text) ; $i++)
  • if ($Text[$i]==$Char) {
  • $HasC = true;
  • break;
  • }
  • return $HasC;
  • }
  • //------------------------------------------------------------------------------
  • $DisallowLinks = false;
  • $WinningPosition = -1;
  • $ServerPoints = GetGet('serverpts',0);
  • $PlayerPoints = GetGet('playerpts',0);
  • $Grid = GetGet('game','000000000');
  • $Level = GetGet('level','1'); //par défaut, le moteur est "Intermédiaire"
  • //------------------------------------------------------------------------------
  • function Full3($P1,$P2,$P3) {
  • //Indique si 3 cases spécifiées sont occupées par le même signe
  • global $Grid;
  • return ($Grid[$P1]!='0' && $Grid[$P1]==$Grid[$P2] && $Grid[$P2]==$Grid[$P3]);
  • }
  • function CheckWin() {
  • //0-1-2
  • //3-4-5
  • //6-7-8
  • global $Grid;
  • return ( Full3(0,3,6) || Full3(1,4,7) || Full3(2,5,8) || //Verticales
  • Full3(0,1,2) || Full3(3,4,5) || Full3(6,7,8) || //Horizontales
  • Full3(0,4,8) || Full3(2,4,6) ); //Diagonales
  • }
  • function EchoTab($Index) {
  • global $Grid, $DisallowLinks, $Level, $ServerPoints, $PlayerPoints;
  • if (!HasChar($Grid,'0')) {
  • echo '<a class=link href="morpion.php?level='.$Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'">';
  • if ($Grid[$Index]=='1')
  • echo '<img src="croix.gif" alt="Cliquez pour recommencer">';
  • else
  • echo '<img src="cercle.gif" alt="Cliquez pour recommencer">';
  • echo '</a>';
  • } else {
  • switch ($Grid[$Index]) {
  • case '0':
  • $CurGrid = $Grid;
  • $CurGrid[$Index] = '1';
  • if ($DisallowLinks)
  • echo '<img src="blank.gif" border="0">';
  • else
  • echo '<a href="morpion.php?game='.$CurGrid.'&level='.$Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'"><img src="blank.gif" border="0"></a>';
  • break;
  • case '1':
  • echo '<img src="croix.gif">';
  • break;
  • case '2':
  • echo '<img src="cercle.gif">';
  • break;
  • }
  • }
  • }
  • function GetCellColor($Cell,$EchoSth) {
  • //0-1-2
  • //3-4-5
  • //6-7-8
  • global $BackGroundColor, $ActiveCellColor, $WinningPosition;
  • //Recherche de la condition de coloration
  • switch ($Cell) {
  • case 0: $CellBG = Full3(0,1,2) || Full3(0,3,6) || Full3(0,4,8); break;
  • case 1: $CellBG = Full3(0,1,2) || Full3(1,4,7); break;
  • case 2: $CellBG = Full3(0,1,2) || Full3(2,5,8) || Full3(2,4,6); break;
  • case 3: $CellBG = Full3(3,4,5) || Full3(0,3,6); break;
  • case 4: $CellBG = Full3(3,4,5) || Full3(1,4,7) || Full3(0,4,8) || Full3(2,4,6); break;
  • case 5: $CellBG = Full3(3,4,5) || Full3(2,5,8); break;
  • case 6: $CellBG = Full3(6,7,8) || Full3(0,3,6) || Full3(2,4,6); break;
  • case 7: $CellBG = Full3(6,7,8) || Full3(1,4,7); break;
  • case 8: $CellBG = Full3(6,7,8) || Full3(2,5,8) || Full3(0,4,8); break;
  • }
  • //Application de la couleur
  • if ($CellBG) {
  • $WinningPosition = $Cell;
  • if ($EchoSth)
  • echo $ActiveCellColor;
  • } else
  • if ($EchoSth)
  • echo $BackGroundColor;
  • }
  • //------------------------------------------------------------------------------
  • /*
  • INFORMATIONS GENERALES
  • Joueur '0' = personne
  • Joueur '1' = internaute
  • Joueur '2' = serveur
  • */
  • function Computing() {
  • global $Grid, $Level;
  • $Buffer = $Grid;
  • $Choix = -1;
  • $Symetrical = (($Level>=2) && ($Grid=='100010002' || $Grid=='200010001' || $Grid=='001010200' || $Grid=='002010100'));
  • //Recherche d'une position immédiatement gagnante
  • for ($i=0 ; $i<9 ; $i++) {
  • $Grid = $Buffer;
  • if ($Grid[$i]=='0') {
  • $Grid[$i] = '2';
  • if (CheckWin()) {
  • $Choix = $i;
  • break;
  • }
  • }
  • }
  • //Recherche d'une position qui contre l'adversaire
  • if ($Choix==-1)
  • for ($i=0 ; $i<9 ; $i++) {
  • $Grid = $Buffer;
  • if ($Grid[$i]=='0') {
  • $Grid[$i] = '1';
  • if (CheckWin()) {
  • $Choix = $i;
  • break;
  • }
  • }
  • }
  • //Recherche d'une position qui dispense 2 positions gagnantes
  • if ($Choix==-1 && $Level>=1)
  • for ($i=0 ; $i<9 ; $i++) {
  • $Grid = $Buffer;
  • if ($Grid[$i]=='0') {
  • $Grid[$i] = '2';
  • $Buffer2 = $Grid;
  • $WinCount = 0;
  • for ($j=0 ; $j<9 ; $j++) {
  • $Grid = $Buffer2;
  • if ($Grid[$j]=='0') {
  • $Grid[$j] = '2';
  • if (CheckWin())
  • $WinCount++;
  • }
  • }
  • if ($WinCount>=2) {
  • $Choix = $i;
  • break;
  • }
  • }
  • }
  • $Grid = $Buffer;
  • //Recherche d'une position adverse qui force 2 positions gagnantes
  • if ($Choix==-1 && $Grid!='100020001' && $Grid!='001020100' && !$Symetrical && $Level>=1)
  • for ($i=0 ; $i<9 ; $i++) {
  • $Grid = $Buffer;
  • if ($Grid[$i]=='0') {
  • $Grid[$i] = '1';
  • $Buffer2 = $Grid;
  • $WinCount = 0;
  • for ($j=0 ; $j<9 ; $j++) {
  • $Grid = $Buffer2;
  • if ($Grid[$j]=='0') {
  • $Grid[$j] = '1';
  • if (CheckWin())
  • $WinCount++;
  • }
  • }
  • if ($WinCount>=2) {
  • $Choix = $i;
  • break;
  • }
  • }
  • }
  • $Grid = $Buffer;
  • //Petit remède d'invincibilité complémentaire
  • if ($Level>=1)
  • $NoCorner = ($Grid=='100020001' || $Grid=='001020100');
  • else
  • $NoCorner = false;
  • //Choix de la case centrale si disponible
  • if ($Choix==-1 && $Grid[4]=='0')
  • if ($Level>=1 || ($Level==0 && rand(0,5)!=4))
  • $Choix = 4;
  • //En mode de jeu le plus grand, il est interdit pour l'ordinateur de jouer sur les points cardinaux au second tour (sinon il perd à coup sûr)
  • //D'après une situation particulière de symétrie, on exploite cette même interdiction mais pour des raisons différentes
  • if (($Choix==-1 && $Level>=2 && $Grid=='000010000') || $Symetrical) {
  • $_choice = -1;
  • while ($_choice==-1)
  • switch(rand(1,4)) {
  • case 1: if ($Grid[6]=='0') $_choice=6; break;
  • case 2: if ($Grid[8]=='0') $_choice=8; break;
  • case 3: if ($Grid[0]=='0') $_choice=0; break;
  • case 4: if ($Grid[2]=='0') $_choice=2; break;
  • }
  • $Choix = $_choice;
  • }
  • //Choix d'une case au pif...
  • if ($Choix==-1) {
  • $Case = rand(0,8);
  • while ($Grid[$Case]!='0') {
  • $Case++;
  • if ($Case>8)
  • $Case = 0;
  • }
  • //...on ne doit pas jouer pas au pif dans les coins quand c'est stratégiquement suicidaire
  • if ($NoCorner) {
  • if ($Case==0 || $Case==2 || $Case==6 || $Case==8)
  • $Case++;
  • if ($Case>8)
  • $Case = 1;
  • }
  • $Choix = $Case;
  • }
  • //Restauration des données
  • $Grid = $Buffer;
  • return $Choix;
  • }
  • if (($Grid!='000000000' || isset($_GET['serverbegins'])) && !CheckWin() && HasChar($Grid,'0')) {
  • $Index = Computing();
  • if ($Index!= -1)
  • $Grid[$Index]='2';
  • else {
  • echo '<b>Une erreur fatale est survenue.';
  • echo '<br/><br/>Cliquez <a href="morpion.php">ici</a> pour faire une nouvelle partie.';
  • return 0;
  • }
  • }
  • //Traitement des points: pour pouvoir transmettre efficacement les scores, il est nécessaire
  • //d'appeler 9 fois dans le vide la fonction GetCellColor. Cela permet d'initialiser correctement
  • //la variable $WinningPosition et donc de rendre les scores transmissibles via la fonction
  • //EchoTbl qui est chargée d'afficher les nouveaux scores.
  • for ($i=0 ; $i<9 ; $i++)
  • GetCellColor($i,false);
  • if ($WinningPosition>=0 && $WinningPosition<9)
  • switch ($Grid[$WinningPosition]) {
  • case '1': $PlayerPoints++; break;
  • case '2': $ServerPoints++; break;
  • }
  • ?>
  • <html>
  • <head>
  • <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  • <title>Le jeu du morpion</title>
  • <style>
  • A.link { color: #8080FF; text-decoration: none }
  • A.link:hover { color: blue; text-decoration: underline overline }
  • TD.gameboard { border: 2px solid maroon }
  • IMG { border: 0 }
  • </style>
  • </head>
  • <body bgcolor="<?php echo $BackGroundColor; ?>">
  • <table width="35%" cellspacing="0" border="0" align="center">
  • <tr>
  • <td colspan="2" height="50px" align="center" style="border: 1px solid #996600">
  • <?php
  • if ($DisallowLinks=CheckWin())
  • echo '<b><font face="Verdana" color="#996600">La partie est terminée !</font></b>';
  • else
  • if (!HasChar($Grid,'0')) {
  • echo '<b><font face="Verdana" color="#996600">Match nul !</font></b>';
  • $DisallowLinks=true;
  • } else
  • echo '&nbsp;';
  • ?>
  • </td>
  • </tr>
  • <tr>
  • <td valign="center" width="35%" style="border-right: 1px solid navy">
  • <font size="4" color="green"><b>Actions :</b></font>
  • <br/>&nbsp;
  • <?php
  • if ($Grid=='000000000')
  • echo '<br/><a class=link href="morpion.php?game='.$Grid.'&serverbegins&level='.$Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'">Laisser la main</a>';
  • else
  • echo '<br/>&nbsp;';
  • ?>
  • <?php
  • if ($ServerPoints!=0 || $PlayerPoints!=0)
  • echo '<br/><a class=link href="morpion.php?game=000000000&level='.$Level.'">RAZ</a>';
  • else
  • echo '<br/>&nbsp;';
  • ?>
  • <br/><a class=link href="morpion.php?level=<?php echo $Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints; ?>">Recommencer</a>
  • </td>
  • <td rowspan="2">
  • <br/>&nbsp;
  • <table width="156" border="3" cellspacing="3" align="center" style="border: none">
  • <tr>
  • <td bgcolor="<?php GetCellColor(0,true); ?>" class=gameboard style="border-top:none; border-left:none"><?php EchoTab(0); ?></td>
  • <td bgcolor="<?php GetCellColor(1,true); ?>" class=gameboard style="border-top:none"><?php EchoTab(1); ?></td>
  • <td bgcolor="<?php GetCellColor(2,true); ?>" class=gameboard style="border-top:none; border-right:none"><?php EchoTab(2); ?></td>
  • </tr>
  • <tr>
  • <td bgcolor="<?php GetCellColor(3,true); ?>" class=gameboard style="border-left:none"><?php EchoTab(3); ?></td>
  • <td bgcolor="<?php GetCellColor(4,true); ?>" class=gameboard><?php EchoTab(4); ?></td>
  • <td bgcolor="<?php GetCellColor(5,true); ?>" class=gameboard style="border-right:none"><?php EchoTab(5); ?></td>
  • </tr>
  • <tr>
  • <td bgcolor="<?php GetCellColor(6,true); ?>" class=gameboard style="border-bottom:none; border-left:none"><?php EchoTab(6); ?></td>
  • <td bgcolor="<?php GetCellColor(7,true); ?>" class=gameboard style="border-bottom:none"><?php EchoTab(7); ?></td>
  • <td bgcolor="<?php GetCellColor(8,true); ?>" class=gameboard style="border-bottom:none; border-right:none"><?php EchoTab(8); ?></td>
  • </tr>
  • </table>
  • <br/>&nbsp;
  • </td>
  • </tr>
  • <tr>
  • <td valign="center" width="35%" style="border-right: 1px solid navy; border-top: 1px solid navy">
  • <font size="4" color="green"><b>Options:</b></font>
  • <br/>&nbsp;
  • <?php
  • function EchoLevelList($Lvl,$Caption) {
  • global $Grid, $Level, $ServerPoints, $PlayerPoints;
  • echo '<br/>';
  • if ($Level==$Lvl)
  • echo '<img src="tic.gif" align="absmiddle">&nbsp;';
  • if ($Grid=='000000000')
  • echo '<a class=link href="morpion.php?game='.$Grid.'&level='.$Lvl.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'">'.$Caption.'</a>';
  • else
  • echo $Caption;
  • }
  • EchoLevelList(0,'Faible');
  • EchoLevelList(1,'Intermédiaire');
  • EchoLevelList(2,'Invincible');
  • ?>
  • </td>
  • </tr>
  • <tr>
  • <td colspan="2" align="center">
  • <font size="2" color="navy">Serveur : <?php echo $ServerPoints; ?>&nbsp;&nbsp;&nbsp;<b>..::..</b>&nbsp;&nbsp;&nbsp;Joueur : <?php echo $PlayerPoints; ?></font>
  • </td>
  • </tr>
  • <tr>
  • <td colspan="2" align="center" style="border: 2px solid #996600">
  • <font size="2" color="maroon">Jeu du morpion <b>©</b> septembre 2005</font>
  • </td>
  • </tr>
  • </table>
  • </body>
  • </html>
<?php

//======================================= http://altert.family.free.fr/ ========

  $BackGroundColor = "#F8F8F8";
  $ActiveCellColor = "yellow";

//------------------------------------------------------------------------------

  function GetGet($Value,$DefaultValue) {
  //INFO: l'utilisation de HTMLSPECIALCHARS évite les trous de sécurité du type
  //      http://localhost/morpion.php?game=100020010&level=2&serverpts=<script>alert("Salut");</script>&playerpts=0
    if (isset($_GET[$Value])) {
      if ($_GET[$Value]=='')
        return $DefaultValue;
      else
        return htmlspecialchars($_GET[$Value]);
    } else
      return $DefaultValue;
  }

  function HasChar($Text,$Char) {
    $HasC = false;
    for ($i=0 ; $i<strlen($Text) ; $i++)
      if ($Text[$i]==$Char) {
        $HasC = true;
        break;
      }
    return $HasC;
  }

//------------------------------------------------------------------------------

  $DisallowLinks = false;
  $WinningPosition = -1;
  $ServerPoints = GetGet('serverpts',0);
  $PlayerPoints = GetGet('playerpts',0);
  $Grid = GetGet('game','000000000');
  $Level = GetGet('level','1');              //par défaut, le moteur est "Intermédiaire"

//------------------------------------------------------------------------------

  function Full3($P1,$P2,$P3) {
  //Indique si 3 cases spécifiées sont occupées par le même signe
    global $Grid;
    return ($Grid[$P1]!='0' && $Grid[$P1]==$Grid[$P2] && $Grid[$P2]==$Grid[$P3]);
  }

  function CheckWin() {
  //0-1-2
  //3-4-5
  //6-7-8
    global $Grid;
    return ( Full3(0,3,6) || Full3(1,4,7) || Full3(2,5,8) ||     //Verticales
             Full3(0,1,2) || Full3(3,4,5) || Full3(6,7,8) ||     //Horizontales
             Full3(0,4,8) || Full3(2,4,6)      );                //Diagonales
  }

  function EchoTab($Index) {
    global $Grid, $DisallowLinks, $Level, $ServerPoints, $PlayerPoints;
    if (!HasChar($Grid,'0')) {
      echo '<a class=link href="morpion.php?level='.$Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'">';
      if ($Grid[$Index]=='1')
        echo '<img src="croix.gif" alt="Cliquez pour recommencer">';
      else
        echo '<img src="cercle.gif" alt="Cliquez pour recommencer">';
      echo '</a>';
    } else {
      switch ($Grid[$Index]) {
        case '0':
            $CurGrid = $Grid;
            $CurGrid[$Index] = '1';
            if ($DisallowLinks)
              echo '<img src="blank.gif" border="0">';
            else
              echo '<a href="morpion.php?game='.$CurGrid.'&level='.$Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'"><img src="blank.gif" border="0"></a>';
          break;
        case '1':
            echo '<img src="croix.gif">';
          break;
        case '2':
            echo '<img src="cercle.gif">';
          break;
      }
    }
  }

  function GetCellColor($Cell,$EchoSth) {
  //0-1-2
  //3-4-5
  //6-7-8
    global $BackGroundColor, $ActiveCellColor, $WinningPosition;

  //Recherche de la condition de coloration
    switch ($Cell) {
      case 0: $CellBG = Full3(0,1,2) || Full3(0,3,6) || Full3(0,4,8);                  break;
      case 1: $CellBG = Full3(0,1,2) || Full3(1,4,7);                                  break;
      case 2: $CellBG = Full3(0,1,2) || Full3(2,5,8) || Full3(2,4,6);                  break;
      case 3: $CellBG = Full3(3,4,5) || Full3(0,3,6);                                  break;
      case 4: $CellBG = Full3(3,4,5) || Full3(1,4,7) || Full3(0,4,8) || Full3(2,4,6);  break;
      case 5: $CellBG = Full3(3,4,5) || Full3(2,5,8);                                  break;
      case 6: $CellBG = Full3(6,7,8) || Full3(0,3,6) || Full3(2,4,6);                  break;
      case 7: $CellBG = Full3(6,7,8) || Full3(1,4,7);                                  break;
      case 8: $CellBG = Full3(6,7,8) || Full3(2,5,8) || Full3(0,4,8);                  break;
    }

  //Application de la couleur
    if ($CellBG) {
      $WinningPosition = $Cell;
      if ($EchoSth)
        echo $ActiveCellColor;
    } else
      if ($EchoSth)
        echo $BackGroundColor;
  }

//------------------------------------------------------------------------------

/*
  INFORMATIONS GENERALES
     Joueur '0' = personne
     Joueur '1' = internaute
     Joueur '2' = serveur
*/

  function Computing() {
    global $Grid, $Level;
    $Buffer = $Grid;
    $Choix = -1;
    $Symetrical = (($Level>=2) && ($Grid=='100010002' || $Grid=='200010001' || $Grid=='001010200' || $Grid=='002010100'));

    //Recherche d'une position immédiatement gagnante
      for ($i=0 ; $i<9 ; $i++) {
        $Grid = $Buffer;
        if ($Grid[$i]=='0') {
          $Grid[$i] = '2';
          if (CheckWin()) {
            $Choix = $i;
            break;
          }
        }
      }

    //Recherche d'une position qui contre l'adversaire
      if ($Choix==-1)
        for ($i=0 ; $i<9 ; $i++) {
          $Grid = $Buffer;
          if ($Grid[$i]=='0') {
            $Grid[$i] = '1';
            if (CheckWin()) {
              $Choix = $i;
              break;
            }
          }
        }

    //Recherche d'une position qui dispense 2 positions gagnantes
      if ($Choix==-1 && $Level>=1)
        for ($i=0 ; $i<9 ; $i++) {
          $Grid = $Buffer;
          if ($Grid[$i]=='0') {
            $Grid[$i] = '2';
            $Buffer2 = $Grid;
            $WinCount = 0;
            for ($j=0 ; $j<9 ; $j++) {
              $Grid = $Buffer2;
              if ($Grid[$j]=='0') {
                $Grid[$j] = '2';
                if (CheckWin())
                  $WinCount++;
              }
            }
            if ($WinCount>=2) {
              $Choix = $i;
              break;
            }
          }
        }
      $Grid = $Buffer;

    //Recherche d'une position adverse qui force 2 positions gagnantes
      if ($Choix==-1 && $Grid!='100020001' && $Grid!='001020100' && !$Symetrical && $Level>=1)
        for ($i=0 ; $i<9 ; $i++) {
          $Grid = $Buffer;
          if ($Grid[$i]=='0') {
            $Grid[$i] = '1';
            $Buffer2 = $Grid;
            $WinCount = 0;
            for ($j=0 ; $j<9 ; $j++) {
              $Grid = $Buffer2;
              if ($Grid[$j]=='0') {
                $Grid[$j] = '1';
                if (CheckWin())
                  $WinCount++;
              }
            }
            if ($WinCount>=2) {
              $Choix = $i;
              break;
            }
          }
        }
      $Grid = $Buffer;

    //Petit remède d'invincibilité complémentaire
      if ($Level>=1)
        $NoCorner = ($Grid=='100020001' || $Grid=='001020100');
      else
        $NoCorner = false;


    //Choix de la case centrale si disponible
      if ($Choix==-1 && $Grid[4]=='0')
        if ($Level>=1 || ($Level==0 && rand(0,5)!=4))
          $Choix = 4;

    //En mode de jeu le plus grand, il est interdit pour l'ordinateur de jouer sur les points cardinaux au second tour (sinon il perd à coup sûr)
    //D'après une situation particulière de symétrie, on exploite cette même interdiction mais pour des raisons différentes
      if (($Choix==-1 && $Level>=2 && $Grid=='000010000') || $Symetrical) {
        $_choice = -1;
        while ($_choice==-1)
          switch(rand(1,4)) {
            case 1: if ($Grid[6]=='0') $_choice=6; break;
            case 2: if ($Grid[8]=='0') $_choice=8; break;
            case 3: if ($Grid[0]=='0') $_choice=0; break;
            case 4: if ($Grid[2]=='0') $_choice=2; break;
          }
        $Choix = $_choice;
      }

    //Choix d'une case au pif...
      if ($Choix==-1) {
        $Case = rand(0,8);
        while ($Grid[$Case]!='0') {
          $Case++;
          if ($Case>8)
            $Case = 0;
        }
      //...on ne doit pas jouer pas au pif dans les coins quand c'est stratégiquement suicidaire
        if ($NoCorner) {
          if ($Case==0 || $Case==2 || $Case==6 || $Case==8)
            $Case++;
          if ($Case>8)
            $Case = 1;
        }
        $Choix = $Case;
      }

    //Restauration des données
      $Grid = $Buffer;
      return $Choix;
  }

  if (($Grid!='000000000' || isset($_GET['serverbegins'])) && !CheckWin() && HasChar($Grid,'0')) {
    $Index = Computing();
    if ($Index!= -1)
      $Grid[$Index]='2';
    else {
      echo '<b>Une erreur fatale est survenue.';
      echo '<br/><br/>Cliquez <a href="morpion.php">ici</a> pour faire une nouvelle partie.';
      return 0;
    }
  }

//Traitement des points: pour pouvoir transmettre efficacement les scores, il est nécessaire
//d'appeler 9 fois dans le vide la fonction GetCellColor. Cela permet d'initialiser correctement
//la variable $WinningPosition et donc de rendre les scores transmissibles via la fonction
//EchoTbl qui est chargée d'afficher les nouveaux scores.
  for ($i=0 ; $i<9 ; $i++)
    GetCellColor($i,false);
  if ($WinningPosition>=0 && $WinningPosition<9)
    switch ($Grid[$WinningPosition]) {
      case '1': $PlayerPoints++; break;
      case '2': $ServerPoints++; break;
    }
?>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <title>Le jeu du morpion</title>
  <style>
    A.link		{ color: #8080FF; text-decoration: none }
    A.link:hover	{ color: blue; text-decoration: underline overline }
    TD.gameboard	{ border: 2px solid maroon }
    IMG			{ border: 0 }
  </style>
</head>
<body bgcolor="<?php echo $BackGroundColor; ?>">
  <table width="35%" cellspacing="0" border="0" align="center">
    <tr> 
      <td colspan="2" height="50px" align="center" style="border: 1px solid #996600">
        <?php
          if ($DisallowLinks=CheckWin())
            echo '<b><font face="Verdana" color="#996600">La partie est terminée !</font></b>';
          else
            if (!HasChar($Grid,'0')) {
              echo '<b><font face="Verdana" color="#996600">Match nul !</font></b>';
              $DisallowLinks=true;
            } else
              echo '&nbsp;';
        ?>
      </td>
    </tr>

    <tr> 
      <td valign="center" width="35%" style="border-right: 1px solid navy">
        <font size="4" color="green"><b>Actions :</b></font>
        <br/>&nbsp;
        <?php
          if ($Grid=='000000000')
            echo '<br/><a class=link href="morpion.php?game='.$Grid.'&serverbegins&level='.$Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'">Laisser la main</a>';
          else
            echo '<br/>&nbsp;';
        ?>
        <?php
          if ($ServerPoints!=0 || $PlayerPoints!=0)
            echo '<br/><a class=link href="morpion.php?game=000000000&level='.$Level.'">RAZ</a>';
          else
            echo '<br/>&nbsp;';
        ?>
        <br/><a class=link href="morpion.php?level=<?php echo $Level.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints; ?>">Recommencer</a>
      </td>

      <td rowspan="2">
        <br/>&nbsp;
        <table width="156" border="3" cellspacing="3" align="center" style="border: none">
          <tr>
            <td bgcolor="<?php GetCellColor(0,true); ?>" class=gameboard style="border-top:none; border-left:none"><?php EchoTab(0); ?></td>
            <td bgcolor="<?php GetCellColor(1,true); ?>" class=gameboard style="border-top:none"><?php EchoTab(1); ?></td>
            <td bgcolor="<?php GetCellColor(2,true); ?>" class=gameboard style="border-top:none; border-right:none"><?php EchoTab(2); ?></td>
          </tr>
          <tr>
            <td bgcolor="<?php GetCellColor(3,true); ?>" class=gameboard style="border-left:none"><?php EchoTab(3); ?></td>
            <td bgcolor="<?php GetCellColor(4,true); ?>" class=gameboard><?php EchoTab(4); ?></td>
            <td bgcolor="<?php GetCellColor(5,true); ?>" class=gameboard style="border-right:none"><?php EchoTab(5); ?></td>
          </tr>
          <tr>
            <td bgcolor="<?php GetCellColor(6,true); ?>" class=gameboard style="border-bottom:none; border-left:none"><?php EchoTab(6); ?></td>
            <td bgcolor="<?php GetCellColor(7,true); ?>" class=gameboard style="border-bottom:none"><?php EchoTab(7); ?></td>
            <td bgcolor="<?php GetCellColor(8,true); ?>" class=gameboard style="border-bottom:none; border-right:none"><?php EchoTab(8); ?></td>
          </tr>
        </table>
        <br/>&nbsp;
      </td>
    </tr>

    <tr> 
      <td valign="center" width="35%" style="border-right: 1px solid navy; border-top: 1px solid navy">
        <font size="4" color="green"><b>Options:</b></font>
        <br/>&nbsp;
        <?php
          function EchoLevelList($Lvl,$Caption) {
            global $Grid, $Level, $ServerPoints, $PlayerPoints;
            echo '<br/>';
            if ($Level==$Lvl)
              echo '<img src="tic.gif" align="absmiddle">&nbsp;';
            if ($Grid=='000000000')
              echo '<a class=link href="morpion.php?game='.$Grid.'&level='.$Lvl.'&serverpts='.$ServerPoints.'&playerpts='.$PlayerPoints.'">'.$Caption.'</a>';
            else
              echo $Caption;
          }
          EchoLevelList(0,'Faible');
          EchoLevelList(1,'Intermédiaire');
          EchoLevelList(2,'Invincible');
        ?>
      </td>
    </tr>

    <tr> 
      <td colspan="2" align="center">
        <font size="2" color="navy">Serveur : <?php echo $ServerPoints; ?>&nbsp;&nbsp;&nbsp;<b>..::..</b>&nbsp;&nbsp;&nbsp;Joueur : <?php echo $PlayerPoints; ?></font>
      </td>
    </tr>

    <tr> 
      <td colspan="2" align="center" style="border: 2px solid #996600">
        <font size="2" color="maroon">Jeu du morpion <b>©</b> septembre 2005</font>
      </td>
    </tr>
  </table>
</body>
</html>

Conclusion

Vous pouvez toujours aller visiter http://altert.family.free.fr/
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

17 décembre 2005 14:38:09 :
- correction mineure du mode invincible - gestion des points - coloration des victoires - modification de quelques balises <abc> en <abc/> - des trucs parci parlà (forcément)

Commentaires et avis

signaler à un administrateur
Commentaire de monoceros01 le 30/10/2005 11:13:40

8/10 parce que ton code html n'est pas valide >:p Sinon c'est sympatique :)

signaler à un administrateur
Commentaire de Anthomicro le 30/10/2005 14:22:31

Salut,

nickel j'ai pas réussi à le battre en mode invincible (match nul tout le temps). Bien joué ;-)

Bon je ne note pas le code x?html ni le code PHP, juste le jeu :-)

et je mettrais 8 aussi (soyons fous)

a +

signaler à un administrateur
Commentaire de FhX le 30/10/2005 18:32:06

Fonction GetGet() qui sert un peu à rien.
Car tu peux l'utiliser directement depuis ton code

# if ( !isset($_GET['game']) ) {
#     $Grid = '000000000';
  }

Ca évite l'appel d'une fonction qui sert un peu trop pas à grand chose ;)

signaler à un administrateur
Commentaire de coucou747 le 30/10/2005 19:20:56

salut
le script en lui même est interessant, mais le code html n'est vraiment pas terrible...

au niveau du code php :
tu traites $grid comme si c'était un tableau, ça marche, mais c'est pas super super, tu devrais faire :
$grid{0} pour accèder au premier caractère...
Le php, c'est pas du C !

signaler à un administrateur
Commentaire de coockiesch le 30/10/2005 20:46:39

Salut!
De toute façon, si tu as deux personnes qui savent très bien jouer au morpion, tu auras tjs match nul (parole d'étudiant! :D )

@++

R@f

signaler à un administrateur
Commentaire de Anthomicro le 30/10/2005 21:04:07

ouep ^^

signaler à un administrateur
Commentaire de Martin_j le 05/11/2005 11:55:02

Salut,

moi j'ai réussi à battre le mode invincible...
Sinon, est-ce qu'il existe ce morpion mais pas en 3x3 mais en 5x5 (où il faut aligner 4 croix)

++

signaler à un administrateur
Commentaire de BadNews le 19/11/2005 07:49:20

lol, tu l'as réussis, je sais pas si il est bien coddé, mais si oui, c'est impossible de le battre, IMPOSSIBLE.

Donc, comme j'ai mentionné plus haut, si il es bien coddé, tu es menteur ... hahaha.

Parcqu'il es possible d'en codder un qui est vraiment IMPOSSIBLE.

Je l'ai pas essayer, j'ai pas regarder le code, mais sois il n'est pas bien coddé ou sois tu est vraiment menteur Martin_j .

signaler à un administrateur
Commentaire de Martin_j le 19/11/2005 10:44:50

Salut,

tu ne me crois pas ? Je viens de refaire le jeu et de regagner :

http://img518.imageshack.us/img518/1851/championinmorpion6qg.png

@+

signaler à un administrateur
Commentaire de coockiesch le 19/11/2005 10:45:41

Le programme peut être le meilleur du monde... Si tu connais bien le morpion, il y aura match nul...

@++

R@f

signaler à un administrateur
Commentaire de Martin_j le 19/11/2005 10:46:48

Salut,

..ou même le lien direct ou cas tu me dirais "tu as utilisé Paint shop pro" : http://www.trains-idf.net/Morpion/morpion.php?game=122110102&level=2

++

signaler à un administrateur
Commentaire de Anthomicro le 19/11/2005 10:51:15

mouais, j'y crois pas une seconde...

signaler à un administrateur
Commentaire de coucou747 le 19/11/2005 10:51:52

lol
ça veut rien dire ça :

http://www.trains-idf.net/Morpion/morpion.php?game=222220202&level=2

lol

signaler à un administrateur
Commentaire de Anthomicro le 19/11/2005 10:58:41

mdr, encore un mytho donc... Il compense quoi en faisant ça ? (j'ai  ma petite idée mais bon)

signaler à un administrateur
Commentaire de Martin_j le 19/11/2005 11:39:41

Salut,

c'est vrai que lien ya eu un prob.
Mais je suis pas un mytho lol !!
J'ai battu l'invincible !

++

signaler à un administrateur
Commentaire de coucou747 le 19/11/2005 11:43:47

explique nous comment !

ou t'as cliqué à chaque fois...

signaler à un administrateur
Commentaire de Anthomicro le 19/11/2005 12:32:50

ouais ;-) qu'on voit si tu dis vrai ;-)

signaler à un administrateur
Commentaire de Martin_j le 19/11/2005 12:43:31

Salut,

1) Je clique au milieu
2) L'invincible met son rond sur la en bas à doite
3) Je clique en haut à gauche
4) Lui en haut, milieu
5) Moi en bas, à gauche
6) Lui en haut à droite
7) Moi au mileu à gauche

GAGNE !!!!!!!!!!!!

@+

signaler à un administrateur
Commentaire de coucou747 le 19/11/2005 12:53:32

ouais, c'est vrai... mais t'aurais du donner ton astuce dès le départ...

Bon, à part ça, on peut dire que ton IA joue parfois au hazard... la mienne sur javascriptfr était totalement déterminée, je n'avais pas mis trois niveaux, mais j'avais fait deux modes : lui en premier, ou moi en premier...

signaler à un administrateur
Commentaire de Anthomicro le 19/11/2005 13:10:56

Martin > ah ouais pas mal, perso j'ai du m'y prendre deux fois pour qu'il la mette en bas à droite ;-)

signaler à un administrateur
Commentaire de BadNews le 28/11/2005 05:02:43

lol Martin_j, j'ai dis que si le code est bien programmé, il est IMPOSSIBLE de le battre. Faut croire que le code n'est pas parfait, c'est tout. lmao.

signaler à un administrateur
Commentaire de grandvizir le 17/12/2005 14:42:43

martin_j a eu raison de se manisfester et il faut prendre les diverses réactions dans le bon sens. Eu qui crût prendre !

L'algorithme est simplement tombé sur un cas particulier qui est la symétrie du plateau de jeu dans le cadre de la réflexion N°4 de la fonction Computing(). L'algo n'avait rien de mauvais, il lui manquait juste une petite partie de sa réflexion. J'ai donc effectué les modifications de manière à ce que l'astuce de martin_j ne soit plus possible.

J'en ai profité pour :
- colorer les cases lorsqu'une ligne/colonne/diagonale est réalisée
- gérer un système de points
- incorporer un facilateur de clics

Pour ce qui est du morpion d'ordre 4, mieux vaut préférer un arbre de jeu plutôt que mon algo de réflexion (lui, qui permet de gérer facilement des niveaux de jeu). Vous voyez déjà aisément la taille relativement importante requise pour la gestion de l'ordre 3...

coucou747> Encore heureux que le serveur ne joue jamais les mêmes coups ! Ceci est preuve de constructivité de la part de l'auteur du jeu :)) De plus l'algo ne joue "au pif" que si sa réflexion ne lui a apporté aucune solution pouvant jouer en sa faveur.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

demande code source jeu de morpion [ par oubaha ] bonsoir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je suis nouveau adherent j'esp&#233;re que vous m'admettriez.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb Tableau pour vue d'un jeu rpg [ par bob_07 ] Bonjour, je suis actuellement en train de construir un jeu rpg en php. Pour la vue du joueur, je voulais cr&#233;er un tableau qui affiche selon les c jeu php [ par choosedeath ] bonjour, je suis un jeune lyc&#233;en et j'ai un projet de jeu en php/msql de conquete spatiale (strat&#233;gie et commerce). le hic, c'est que je ne Je cherche un code pour pouvoir changer de nick de jeu sur un trivia version tcl [ par PetiteLibellule ] Jusqu'a maintenant sur une&nbsp;version mirc pour changer de nick de jeu en utilisant un trivia il suffisait de taper !nick et le nick de jeu desir&#2 probleme t_string [ par smith62 ] Bonjour tlm,Voila g un probleme Parse error: parse error, unexpected T_STRING in /secu/teamfr/teamdigitalk/digitalk/a-news/war/match_enregistrer.php o Codeur php [ par Vanadium ] Bonjour!!Je souhaiterais savoir si quelqu'un pourrait gracieusement m'aid&#233; a la cr&#233;ation d'un jeu online, mais je cherche quelqu'un voulant Jeu de bourse [ par cnormand ] Bonjour je suis webmaster de plusieurs sites et souhaiterai cr&#233;er un site de&nbsp; bourse online fictif. Yaurait-il quelqu'un , ou qui veut s'ass jeu de gestion de tennis [ par probordelais ] Bonjour,Je fais un jeu de gestion d'un club de tennis en php. Le plus difficile est la gestion des matchs en temps r&#233;el. En fait, il me faudrai u Problème de jeu de cadre [ par jeancharles26 ] Bonjour,Voici mon souci :J'ai une page d'accueil avec un jeu de cadres. Le&nbsp;menu est dans le cadre vertical gauche et les pages apparaissent dans Création d'un jeu de cartes en réseau [ par skmancuso ] Bonjour,Je souhaiterais d&#233;velopper un jeu de carte en r&#233;seau du genre "dame de pique" sur mon site web.Malheureusement je ne suis pas tr&#23


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,624 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.