Outils pour utilisateurs

Outils du site


nsi:tds:jeux:bataille_navale

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:tds:jeux:bataille_navale [2022/04/03 14:37] – ↷ Page déplacée de nsi:tds:bataille_navale à nsi:tds:jeux:bataille_navale goupillwikinsi:tds:jeux:bataille_navale [2024/12/29 17:56] (Version actuelle) – [Mémoire des coups tirés] goupillwiki
Ligne 1: Ligne 1:
 ====== Bataille navale ====== ====== Bataille navale ======
  
-{{ :nsi:tds:bataille_navale.png?direct&400|}}+{{ :nsi:tds:jeux:bataille_navale.png?direct&400|}}
  
 ===== Présentation ===== ===== Présentation =====
Ligne 14: Ligne 14:
  
 ===== Les ingrédients nécessaires ===== ===== Les ingrédients nécessaires =====
 +
 +Tout d'abord, il est toujours préférable de placer dans des constantes les grands paramètres de jeu. Par exemple, ici, la grille a une largeur de 10 cases. Plutôt que d'écrire ''10'' un peut partout dans le programme, il est préférable d'écrire quelque chose comme ''TAILLE = 10'' et d'écrire ''TAILLE'' un peut partout dans le programme.
  
 ==== La grille de jeu ==== ==== La grille de jeu ====
Ligne 19: Ligne 21:
 Bien que la grille soit une grille à 2 dimensions, on va procéder un peu différemment. On choisit de numéroter chaque case selon son ordre sa position dans l'ordre de lecture. Bien que la grille soit une grille à 2 dimensions, on va procéder un peu différemment. On choisit de numéroter chaque case selon son ordre sa position dans l'ordre de lecture.
  
-{{ :nsi:tds:grille_bataille_navale.svg |}}+{{ :nsi:tds:jeux:grille_bataille_navale.svg |}}
  
 Ainsi la case F5 correspond au numéro 54. Ainsi la case F5 correspond au numéro 54.
Ligne 26: Ligne 28:
  
 <code python> <code python>
-def adresse_to_index(adresse:str) -> int:+def adresse_to_coords(adresse:str) -> int,int:
     """     """
     adresse: chaine comme "F5"     adresse: chaine comme "F5"
-    renvoie le numéro de la case. Pour "F5" le numéro est 54+    renvoie la ligne et la colonne. 
 +    Pour "F5", renvoie 5, 4
     """     """
 </code> </code>
Ligne 77: Ligne 80:
 ==== Lire, écrire ==== ==== Lire, écrire ====
  
-On veut une fonction ''lire(grille:list, adresse:str) -> int'' qui pour une grille de jeu et une adresse -- par exemple ''%%"B4"%%'' -- renvoie le contenu de la case.+On veut une fonction ''%%lire(grille:list, line:int, col:int) -> int%%'' qui pour une grille de jeu et une position donnée par sa ligne et sa colonne, renvoie le contenu de la case.
  
-Avec la grille précédente, il faut que ''%%lire(grille, "B4")%%'' renvoie ''2''.+Avec la grille précédente, il faut que ''%%lire(grille, 1, 3)%%'' renvoie ''2''.
  
-On veut une fonction ''ecrire(grille:list, adresse:str, valeur:int)'' permettant d'écrire la valeur indiquée à la position demandée dans la grille.+On veut une fonction ''ecrire(grille:list, line:int, col:int, valeur:int)'' permettant d'écrire la valeur indiquée à la position demandée dans la grille.
  
-Par exemple, si avec la grille précédente, on exécute ''%%ecrire(grille, "B5", 0)%%'', la grille devient :+Par exemple, si avec la grille précédente, on exécute ''%%ecrire(grille, 1, 3, 0)%%'', la grille devient :
  
 <code python> <code python>
Ligne 100: Ligne 103:
 ==== Coulé ==== ==== Coulé ====
  
-On a besoin d'une fonction ''coulé(grille:list, navire:int) -> bool''+On a besoin d'une fonction ''%%coulé(grille:list, navire:int) -> bool%%''
   * ''grille'' est la grille de jeu   * ''grille'' est la grille de jeu
   * ''navire'' est le numéro de navire, par exemple ''1'' pour le porte-avions   * ''navire'' est le numéro de navire, par exemple ''1'' pour le porte-avions
Ligne 109: Ligne 112:
 Quand on tire sur une flotte, on veut savoir si on a touché et éventuellement si on a coulé. Quand on tire sur une flotte, on veut savoir si on a touché et éventuellement si on a coulé.
  
-Il faut donc une fonction ''tir(flotte:list, adresse:str) -> (bool,bool)'',+Il faut donc une fonction ''%%tir(flotte:list, line:int, col:int) -> (bool,bool)%%'',
   * on précise en entrée la flotte de l'adversaire et la case ciblée,   * on précise en entrée la flotte de l'adversaire et la case ciblée,
   * la fonction doit renvoyer deux booléens. Le premier indique si un navire est touché et le second indique si un navire est coulé. Par exemple, le retour ''True, False'' indique que c'est « touché » mais pas « coulé ».   * la fonction doit renvoyer deux booléens. Le premier indique si un navire est touché et le second indique si un navire est coulé. Par exemple, le retour ''True, False'' indique que c'est « touché » mais pas « coulé ».
Ligne 117: Ligne 120:
  
 <code python> <code python>
-touché, coulé = tir(grille, "B6")+touché, coulé = tir(grille, 1, 7)
 # touché est True # touché est True
 # coulé est False # coulé est False
Ligne 135: Ligne 138:
 ==== vide ==== ==== vide ====
  
-On veut une fonction ''vide(grille:list) -> bool'' qui renvoie ''True'' quand la grille est vide.+On veut une fonction ''%%vide(grille:list) -> bool%%'' qui renvoie ''True'' quand la grille est vide.
  
 ==== grille aléatoire ==== ==== grille aléatoire ====
Ligne 142: Ligne 145:
  
 C'est un problème difficile. Dans un premier temps vous pouvez vous contenter d'imposer une grille fixe à la machine. Dans un deuxième temps, vous pouvez fournir à la machine une quantité raisonnable de grille prédéfinies et lui faire choisir aléatoirement parmi ces grilles. Et puis si vous avez une bonne idée, vous pouvez lui faire placer aléatoirement ses navires. C'est un problème difficile. Dans un premier temps vous pouvez vous contenter d'imposer une grille fixe à la machine. Dans un deuxième temps, vous pouvez fournir à la machine une quantité raisonnable de grille prédéfinies et lui faire choisir aléatoirement parmi ces grilles. Et puis si vous avez une bonne idée, vous pouvez lui faire placer aléatoirement ses navires.
 +
 +==== Mémoire des coups tirés ====
 +
 +**Pas obligatoire dans la version la plus simple !**
 +
 +Il est plus confortable pour le joueur de garder la trace des tentatives qu'il a effectuées. On pourrait alors entretenir une grille de même format que la précédente mais qui contiendrait :
 +  * ''0'' pour une case dans laquelle on n'a pas encore tiré,
 +  * ''1'' pour un tir qui a touché,
 +  * ''2'' pour un coup à l'eau
 +
 +Il faudrait donc maintenir cette grille à jour au cours de la partie. De plus, pour qu'elle ait un intérêt, il faudrait prévoir une fonction d'affichage. Un affichage texte en console est tout à fait possible. Voici un exemple :
 +
 +<code>
 +def affichage_cible(cible):
 +    SYMBOLES = " XO"
 +    result =" "
 +    for i in range(TAILLE):
 +        result += f"{i+1:02d}"
 +    for i, item in enumerate(cible):
 +        if i%TAILLE == 0:
 +            line = i//TAILLE
 +            result += "\n\n"
 +            result += chr(line + 65)
 +        result += " " + SYMBOLES[item]
 +    return result
 +</code>
  
 ===== Tout mettre ensemble ===== ===== Tout mettre ensemble =====
Ligne 147: Ligne 176:
 Ces fonctions étant définies, vous avez les ingrédients pour lancer le jeu. À vous de les assembler ! Ces fonctions étant définies, vous avez les ingrédients pour lancer le jeu. À vous de les assembler !
  
-Vous pouvez créer une version de jeu simplifiée fonctionnant ainsi :+Vous pouvez créer une version de jeu simplifiée ou l'humain est le seul à tirer :
   * au démarrage du jeu, la machine initialise sa propre grille,   * au démarrage du jeu, la machine initialise sa propre grille,
-  * le joueur est invité à entrer une adresse de tir,+  * l'ordinateur ne tire pas, 
 +  * à chaque tour, le joueur est invité à entrer une adresse de tir,
   * la machine essaie cette adresse sur sa grille et répond au joueur : manqué, touché ou coulé.   * la machine essaie cette adresse sur sa grille et répond au joueur : manqué, touché ou coulé.
-  * Le joueur recommence jusqu'à avoir coulé la flotte de la machine.+  * Le joueur recommence jusqu'à avoir coulé la flotte de la machine ou bien on peut décider d'un nombre maximal de coups autorisés.
  
nsi/tds/jeux/bataille_navale.1648989437.txt.gz · Dernière modification : de goupillwiki