Guest User

Untitled

a guest
Aug 7th, 2019
244
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. title Morpion - Par Flammrock
  4.  
  5. rem On définit la taille de notre morpion (ici du 3x3)
  6. set Morpion.Size=3
  7.  
  8. rem On définit le nombre de croix ou de ronds à aligner pour gagner (de base c'est 3)
  9. set Morpion.AlignVictory=3
  10.  
  11. rem On appelle une "fonction" et on lui passe le nom de la variable qui contiendra toutes les données
  12. call :Morpion.Create mon_objet_morpion !Morpion.Size! !Morpion.AlignVictory!
  13.  
  14. rem On dessine notre morpion
  15. call :Morpion.Draw mon_objet_morpion
  16.  
  17. rem On définit le nombre de tour et on l'initialise à 0, on va l'augmenter de 1 à chaque fois qu'un joueur va jouer
  18. set Morpion.Round=0
  19.  
  20.  
  21.  
  22. rem On définit nos 2 joueurs (on pourrait par exemple utiliser un set /p ici ;) )
  23. rem (CODE)
  24. rem
  25. rem    set /p temp.name=Nom du Joueur 1:
  26. rem    set /p temp.symbol=Symbole du Joueur 1:
  27. rem    call :Morpion.Add_Player mon_objet_morpion "!temp.name!" "!temp.symbol!"
  28. rem
  29. rem    set /p temp.name=Nom du Joueur 2:
  30. rem    set /p temp.symbol=Symbole du Joueur 2:
  31. rem    call :Morpion.Add_Player mon_objet_morpion "!temp.name!" "!temp.symbol!"
  32. rem
  33. rem (/CODE)
  34.  
  35. rem comme c'est un "exemple", je met directe des noms de joueurs lol (pas le temps de niaiser)
  36. call :Morpion.Add_Player mon_objet_morpion "Vimper" "X"
  37. call :Morpion.Add_Player mon_objet_morpion "Flammrock" "O"
  38. rem petite remarque: on pourrait ajouter autant de joueur que l'on veut xDDD
  39.  
  40.  
  41.  
  42.  
  43.  
  44. rem On va loop à l'infini jusqu'à ce qu'un des joueurs gagne (ou pas, s'il y a match nul)
  45. :game
  46.  
  47.     rem On efface tout
  48.     cls
  49.    
  50.     rem On affiche le tour actuel
  51.     echo;Tour !Morpion.Round!
  52.  
  53.     rem On sélectionne le joueur qui doit jouer
  54.     call :Morpion.Get_Player mon_objet_morpion mon_joueur !Morpion.Round!
  55.    
  56.     rem On dit c'est à qui de joueur
  57.     echo;"!mon_joueur.name!" doit jouer (il a les "!mon_joueur.symbol!")
  58.    
  59.     rem On dessine la grille
  60.     call :Morpion.Draw mon_objet_morpion
  61.  
  62.     rem On fait jouer le joueur en lui demandant à quel case il veut mettre son symbole
  63.     call :Morpion.Play_Player mon_objet_morpion mon_joueur
  64.    
  65.     rem On capture l'erreur et on la traite suivant sa valeur
  66.     if "%errorlevel%"=="1" (
  67.         echo;[Erreur] Veuillez saisir un nombre positif valide de l'ID d'une case
  68.     ) else if "%errorlevel%"=="2" (
  69.         echo;[Erreur] Nombre trop grand
  70.     ) else if "%errorlevel%"=="3" (
  71.         echo;[Erreur] Case non vide
  72.     )
  73.     if not "%errorlevel%"=="0" (
  74.         set /p ".=Appuyer sur une touche pour continuer de jouer..."<nul
  75.         pause>nul
  76.         goto :game
  77.     )
  78.    
  79.     rem On vérifie l'état actuel du morpion,
  80.     rem on check si toutes les cases sont pleines ou pas
  81.     rem et on regarde s'il n'y a pas éventuellement un gagnant
  82.     call :Morpion.Check mon_objet_morpion
  83.    
  84.     rem On regarde s'il y a un gagnant ou s'il y a match nul
  85.     if "%errorlevel%"=="1" (
  86.         rem Si on arrive là, c'est qu'un des joueurs a gagné, gg à lui xD
  87.        
  88.         rem On efface tout
  89.         cls
  90.        
  91.         rem On affiche qui a gagné (on met pas le nom du joueur dans le cas où les joueurs jouent en équipent)
  92.         rem On aurait pu mettre que le joueur "Vimper" avait les "O" comme le joueur "Flammrock" et dans ce cas, il aurait été dans
  93.         rem la même équipe
  94.         echo;Les "!mon_objet_morpion.Victory!" sont les gagnants
  95.         echo;
  96.        
  97.        
  98.     ) else if "%errorlevel%"=="2" (
  99.         rem Par contre si on arrive là, c'est que c'est match nul
  100.        
  101.         rem On efface tout
  102.         cls
  103.        
  104.         rem On affiche qui a gagné (on met pas le nom du joueur dans le cas où les joueurs jouent en équipent)
  105.         rem On aurait pu mettre que le joueur "Vimper" avait les "O" comme le joueur "Flammrock" et dans ce cas, il aurait été dans
  106.         rem la même équipe
  107.         echo;MATCH NUL
  108.         echo;
  109.        
  110.     )
  111.     if not "%errorlevel%"=="0" (
  112.         rem On dessine la grille
  113.         call :Morpion.Draw mon_objet_morpion
  114.        
  115.         rem On demande si les joueurs veulent rejouer
  116.         set /p "continue=Souhaitez-vous continuer ? (y/n)"
  117.        
  118.         if /i "!continue!"=="y" (
  119.           rem Si on arrive là, les joueurs souhaitent rejouer
  120.           rem donc on réinitialise le jeu
  121.           call :Morpion.Reset mon_objet_morpion
  122.          
  123.           rem On n'oublie pas de reset les autres variables (bon y'en a qu'une ici mdr)
  124.           set Morpion.Round=0
  125.          
  126.           rem Et hop, on retourne au label :game
  127.           goto :game
  128.          
  129.         ) else (
  130.            rem Sinon, on quitte
  131.            exit
  132.         )
  133.        
  134.        
  135.     )
  136.    
  137.    
  138.    
  139.     rem On passe au tour suivant
  140.     set /a Morpion.Round+=1
  141.    
  142. goto :game
  143.  
  144.  
  145.  
  146.  
  147. rem On veut surtout pas arriver ici, si c'est le cas, on quitte directe pour ne pas faire planter le script
  148. pause>nul&exit
  149.  
  150.  
  151. :Morpion.Create <output:object> <input:size> <input:alignvictory>
  152.  
  153.     rem On définit la taille de notre morpion
  154.     set %~1.Size=%~2
  155.    
  156.     rem On définit le nombre de croix à aligner pour gagner
  157.     set %~1.AlignVictory=%~3
  158.  
  159.     rem On définit la longueur (les indices commencent généralement à 0, donc il faut prendre l'habitude dès maintenat ;) )
  160.     set /a %~1.Length=%~2-1
  161.  
  162.     rem On défnit le nombre de joueur qu'il y aura, pour l'instant on met 0 car là il a pas de joueurs
  163.     set %~1.Players.Length=0
  164.  
  165.     rem On remplie chaque case notre grille d'un espace
  166.     call :Morpion.Reset "%~1"
  167.  
  168.     rem la fonction c'est terminé, on quitte la fonction
  169.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  170. exit /b 0
  171.  
  172.  
  173. :Morpion.Reset <output:object>
  174.    
  175.     rem On créé notre grille avec les coordonnées x et y
  176.     for /l %%y in (0,1,!%~1.Length!) do (
  177.         for /l %%x in (0,1,!%~1.Length!) do (
  178.    
  179.             rem On initialise chaque case avec un espace (les ronds et les croix c'est pour plus tard)
  180.             set "%~1.Grid[%%y][%%x]= "
  181.      
  182.         )
  183.     )
  184.    
  185.    
  186.     rem la fonction c'est terminé, on quitte la fonction
  187.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  188. exit /b 0
  189.  
  190.  
  191.  
  192. :Morpion.Draw <input:object>
  193.  
  194.     rem voici ce qu'on cherche à dessiner:
  195.    rem ,-------,
  196.    rem |       |
  197.    rem |   X   |   . . .
  198.    rem |       |
  199.    rem '-------'
  200.    rem    .
  201.    rem    .
  202.    rem    .
  203.  
  204.     rem L'indice de la case que l'on traite
  205.     set index=1
  206.  
  207.     for /l %%y in (0,1,!%~1.Length!) do (
  208.  
  209.         rem On stocke d'abord tout dans cette variable
  210.         rem (on dessine tout ça ligne par ligne, ici c'est case par case mais l'idée est la même)
  211.         set line1=
  212.         set line2=
  213.         set line3=
  214.         set line4=
  215.         set line5=
  216.  
  217.         for /l %%x in (0,1,!%~1.Length!) do (
  218.        
  219.             rem Je pense que juste ça suffit (parce qu'un morpion à 1000 cases LOL)
  220.             set "space=      "
  221.             if !index! gtr 9 set "space=     "
  222.             if !index! gtr 99 set "space=    "
  223.             if !index! gtr 999 set "space=   "
  224.  
  225.             rem Rien que là, on arrive un voir la case et à voir un peu près à quoi ça va ressembler
  226.             set "line1=!line1!,-------"
  227.             set "line2=!line2!|!space!!index!"
  228.             set "line3=!line3!|   !%~1.Grid[%%y][%%x]!   "
  229.             set "line4=!line4!|       "
  230.             set "line5=!line5!'-------"
  231.      
  232.             set /a index+=1
  233.      
  234.         )
  235.    
  236.         set "line1=!line1!,"
  237.         set "line2=!line2!|"
  238.         set "line3=!line3!|"
  239.         set "line4=!line4!|"
  240.         set "line5=!line5!'"
  241.    
  242.         rem On affiche la case
  243.         echo;!line1!
  244.         echo;!line2!
  245.         echo;!line3!
  246.         echo;!line4!
  247.    
  248.    
  249.     )
  250.  
  251.     rem On affiche la ligne 5 ici car la ligne 1 fait déjà office du bas (par répétition)
  252.     echo;!line5!
  253.  
  254.  
  255.     rem la fonction c'est terminé, on quitte la fonction
  256.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  257. exit /b 0
  258.  
  259.  
  260.  
  261. :Morpion.Add_Player <output:object> <input:name> <input:symbol>
  262.    
  263.     rem On ajoute notre joueur
  264.     set "%~1.Players[!%~1.Players.Length!].name=%~2"
  265.     set "%~1.Players[!%~1.Players.Length!].symbol=%~3"
  266.    
  267.     rem On incrémente de 1 le nombre de joueurs
  268.     set /a %~1.Players.Length+=1
  269.    
  270.     rem la fonction c'est terminé, on quitte la fonction
  271.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  272. exit /b 0
  273.  
  274.  
  275. :Morpion.Get_Player <output:object> <output:object_player> <input:round>
  276.    
  277.     rem C'est juste un peu de math, c'est de l'arithmétique modulaire
  278.     rem (un truc que l'on utilise tout les jours sans qu'on s'en rende compte)
  279.     set /a temp.ID=%~3 %% !%~1.Players.Length!
  280.    
  281.     rem On transforme la variable temp.ID en %%i (petite astuce c'est cadeau)
  282.     for %%i in ("!temp.ID!") do (
  283.    
  284.         rem On copie l'objet et on le met dans l'objet
  285.         rem que l'on doit renvoyer (je sais pas si t'es à l'aise avec ce genre de voca)
  286.         set %~2.name=!%~1.Players[%%~i].name!
  287.         set %~2.symbol=!%~1.Players[%%~i].symbol!
  288.        
  289.     )
  290.    
  291.  
  292.  
  293.     rem la fonction c'est terminé, on quitte la fonction
  294.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  295. exit /b 0
  296.  
  297.  
  298. :Morpion.Play_Player <output:object> <output:object_player>
  299.  
  300.     rem On demande au joueur de rentrer l'ID d'une case
  301.     set /p temp.input=ID Case:
  302.    
  303.     rem On vérifie s'il s'agit d'un nombre positif
  304.     set /a temp.input=!temp.input!-1
  305.    
  306.     rem Si c'est pas un nombre positif, on retourne une erreur qui sera "capturer" dans la "boucle infinie" du jeu xDD
  307.     if "!temp.input!"=="-1" exit /b 1
  308.    
  309.     rem On vérifie que ce nombre rentré est inférieur au nombre de case
  310.     set /a temp.size=!%~1.Size!*!%~1.Size!
  311.     if !temp.input! geq !temp.size! exit /b 2
  312.    
  313.     rem On convertit l'indice de la case en coordonnées x et y
  314.     set /a temp.X=!temp.input! %% !%~1.Size!
  315.     set /a temp.Y=!temp.input! / !%~1.Size!
  316.    
  317.    
  318.     for %%x in ("!temp.X!") do for %%y in ("!temp.Y!") do (
  319.        
  320.         rem Si la case n'est pas vide, on retourne une erreur
  321.         if not "!%~1.Grid[%%~y][%%~x]!"==" " exit /b 3
  322.        
  323.         rem Si on arrive là, on peut supposer que tout est correct
  324.         rem et donc on met dans la case le symbole du joueur qui est entrain de jouer
  325.         set "%~1.Grid[%%~y][%%~x]=!%~2.symbol!"
  326.        
  327.     )
  328.    
  329.    
  330.     rem la fonction c'est terminé, on quitte la fonction
  331.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  332. exit /b 0
  333.  
  334.  
  335.  
  336. :Morpion.Check <output:object>
  337.  
  338.     rem On vérifie tout d'abord si toutes les cases du morpion sont déjà pleines, dans ce cas c'est match nul
  339.     rem et on renvoie 2
  340.     set index=0
  341.     for /l %%y in (0,1,!%~1.Length!) do (
  342.    
  343.         for /l %%x in (0,1,!%~1.Length!) do (
  344.        
  345.             rem On compte chaque case vide
  346.             if "!%~1.Grid[%%y][%%x]!"==" " set /a index+=1
  347.        
  348.         )
  349.        
  350.     )
  351.    
  352.     rem Si la variable index est égale à 0, c'est qu'il n'y pas plus de cases vides,
  353.     rem donc aucun des joueurs peu jouer, donc la partie fini sur une nul
  354.     if "!index!"=="0" exit /b 2
  355.  
  356.     rem On vérifie d'abord sur les lignes
  357.     rem [X][X][X] . . . .
  358.     rem [O][O][O]
  359.     rem [V][V][V]
  360.     rem  .        .
  361.     rem  .          .
  362.     rem  .            .
  363.     rem  .              .
  364.     for /l %%y in (0,1,!%~1.Length!) do (
  365.    
  366.         set temp.victory.symbol=
  367.         set temp.victory.count=0
  368.        
  369.         for /l %%x in (0,1,!%~1.Length!) do (
  370.            
  371.             if "!%~1.Grid[%%y][%%x]!"==" " (
  372.                set temp.victory.symbol=
  373.                set temp.victory.count=0
  374.             ) else if "!%~1.Grid[%%y][%%x]!"=="!temp.victory.symbol!" (
  375.                 set /a temp.victory.count+=1
  376.             ) else (
  377.                 set temp.victory.count=1
  378.                 set "temp.victory.symbol=!%~1.Grid[%%y][%%x]!"
  379.             )
  380.            
  381.         )
  382.        
  383.         rem Si on a compté successivement un nombre de fois le même symbole supérieur ou égale à !%~1.AlignVictory!, alors
  384.         rem le ou les joueurs correspondant à ce symbole ont gagné
  385.         if !temp.victory.count! geq !%~1.AlignVictory! (
  386.             set "%~1.Victory=!temp.victory.symbol!"
  387.             exit /b 1
  388.         )
  389.        
  390.     )      
  391.    
  392.     rem Si on arrive là, c'est qu'il n'y pas encore de gagnants
  393.     rem Du coup on vérifie sur les colonnes
  394.     rem [X][o][v] . . . .
  395.     rem [x][O][v]
  396.     rem [x][o][V]
  397.     rem  .        .
  398.     rem  .          .
  399.     rem  .            .
  400.     rem  .              .
  401.     for /l %%x in (0,1,!%~1.Length!) do (
  402.    
  403.         set temp.victory.symbol=
  404.         set temp.victory.count=0
  405.        
  406.         for /l %%y in (0,1,!%~1.Length!) do (
  407.            
  408.             if "!%~1.Grid[%%y][%%x]!"==" " (
  409.                set temp.victory.symbol=
  410.                set temp.victory.count=0
  411.             ) else if "!%~1.Grid[%%y][%%x]!"=="!temp.victory.symbol!" (
  412.                 set /a temp.victory.count+=1
  413.             ) else (
  414.                 set temp.victory.count=1
  415.                 set "temp.victory.symbol=!%~1.Grid[%%y][%%x]!"
  416.             )
  417.            
  418.         )
  419.        
  420.         rem Si on a compté successivement un nombre de fois le même symbole supérieur ou égale à !%~1.AlignVictory!, alors
  421.         rem le ou les joueurs correspondant à ce symbole ont gagné
  422.         if !temp.victory.count! geq !%~1.AlignVictory! (
  423.             set "%~1.Victory=!temp.victory.symbol!"
  424.             exit /b 1
  425.         )
  426.        
  427.     )
  428.    
  429.     rem Et si on est toujours là (oui monsieur), ba on en profite pour vérifier les diagonals
  430.     for /l %%y in (0,1,!%~1.Length!) do (
  431.    
  432.         for /l %%x in (0,1,!%~1.Length!) do (
  433.        
  434.             set temp.victory.symbol=
  435.             set temp.victory.count=0
  436.            
  437.             set temp.X=%%x
  438.             set temp.Y=%%y
  439.  
  440.             rem On check les diagonales descendantes
  441.             rem [X][ ][ ] . . . .
  442.             rem [ ][X][ ]
  443.             rem [ ][ ][X]
  444.             rem  .        .
  445.             rem  .          .
  446.             rem  .            .
  447.             rem  .              .
  448.             for /l %%i in (1,1,!%~1.AlignVictory!) do (
  449.            
  450.            
  451.                 for %%w in ("!temp.Y!") do for %%v in ("!temp.X!") do (
  452.                
  453.                     if "!%~1.Grid[%%~w][%%~v]!"=="" (
  454.                         set temp.victory.symbol=
  455.                         set temp.victory.count=0
  456.                     ) else if "!%~1.Grid[%%~w][%%~v]!"==" " (
  457.                         set temp.victory.symbol=
  458.                         set temp.victory.count=0
  459.                     ) else if "!%~1.Grid[%%~w][%%~v]!"=="!temp.victory.symbol!" (
  460.                         set /a temp.victory.count+=1
  461.                     ) else (
  462.                         set temp.victory.count=1
  463.                         set "temp.victory.symbol=!%~1.Grid[%%~w][%%~v]!"
  464.                     )
  465.                
  466.                 )
  467.                 set /a temp.X+=1
  468.                 set /a temp.Y+=1
  469.            
  470.             )
  471.            
  472.             rem Si on a compté successivement un nombre de fois le même symbole supérieur ou égale à !%~1.AlignVictory!, alors
  473.             rem le ou les joueurs correspondant à ce symbole ont gagné
  474.             if !temp.victory.count! geq !%~1.AlignVictory! (
  475.                 set "%~1.Victory=!temp.victory.symbol!"
  476.                 exit /b 1
  477.             )
  478.            
  479.            
  480.             set temp.victory.symbol=
  481.             set temp.victory.count=0
  482.            
  483.             set temp.X=%%x
  484.             set temp.Y=%%y
  485.            
  486.             rem On check les diagonales ascendantes
  487.             rem . . . . [ ][ ][X]
  488.             rem         [ ][X][ ]
  489.             rem         [X][ ][ ]
  490.             rem        .       .
  491.             rem      .         .
  492.             rem    .           .
  493.             rem  .             .
  494.             for /l %%i in (1,1,!%~1.AlignVictory!) do (
  495.            
  496.                 for %%w in ("!temp.Y!") do for %%v in ("!temp.X!") do (
  497.                
  498.                     if "!%~1.Grid[%%~w][%%~v]!"=="" (
  499.                         set temp.victory.symbol=
  500.                         set temp.victory.count=0
  501.                     ) else if "!%~1.Grid[%%~w][%%~v]!"==" " (
  502.                         set temp.victory.symbol=
  503.                         set temp.victory.count=0
  504.                     ) else if "!%~1.Grid[%%~w][%%~v]!"=="!temp.victory.symbol!" (
  505.                         set /a temp.victory.count+=1
  506.                     ) else (
  507.                         set temp.victory.count=1
  508.                         set "temp.victory.symbol=!%~1.Grid[%%~w][%%~v]!"
  509.                     )
  510.                
  511.                 )
  512.              
  513.                 set /a temp.X-=1
  514.                 set /a temp.Y+=1
  515.                
  516.             )
  517.            
  518.             rem Si on a compté successivement un nombre de fois le même symbole supérieur ou égale à !%~1.AlignVictory!, alors
  519.             rem le ou les joueurs correspondant à ce symbole ont gagné
  520.             if !temp.victory.count! geq !%~1.AlignVictory! (
  521.                 set "%~1.Victory=!temp.victory.symbol!"
  522.                 exit /b 1
  523.             )
  524.        
  525.         )
  526.    
  527.     )
  528.  
  529.  
  530.     rem la fonction c'est terminé, on quitte la fonction
  531.     rem et on revient là où on en était avant d'appeler cette "fonction" avec le call
  532. exit /b 0
RAW Paste Data