Ceci est une ancienne révision du document !
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined variable $svg_width in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 239
Warning: Undefined variable $svg_width in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 244
Warning: Undefined variable $svg_height in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 245
Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264
Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282
Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301
Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Table des matières
Bataille navale
Présentation
Chaque joueur dispose d'une grille quadrillée horizontalement de 1 à 10 et verticalement de A à J. Les joueurs placent leur bateaux comme ils le souhaitent sur leur propre grille, en se cachant de leur adversaire.
Ensuite les joueurs font un tir chacun leur tour.
Quand vient son tour, un joueur annonce où il tire. Par exemple B7. L'adversaire réponde À l'eau si le tir n'a rien touché ou bien Touché quand le tir a touché un bateau et si toutes les cases du bateau ont été touchées, l'adversaire doit même annoncer Coulé.
Le premier à couler la flotte de son adversaire à gagné.
Les ingrédients nécessaires
La grille de jeu
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.
Ainsi la case F5 correspond au numéro 54.
Il faudra donc prévoir une fonction…
def adresse_to_index(adresse:str) -> int:
"""
adresse: chaine comme "F5"
renvoie le numéro de la case. Pour "F5" le numéro est 54
"""
On décide qu'une case vide contiendra 0. La grille entièrement vide sera donc :
grille_vide = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Stocker la position d'une flotte
À la bataille navale, chaque joueur dispose des navires suivants :
- 1 porte-avions : 5 cases,
- 1 croiseur : 4 cases,
- 2 contre-torpilleurs : 3 cases
- 1 torpilleur : 2 cases
Le nom des navires n'a pas d'importance. On décide d'allouer à chaque bateau un numéro pour les identifier. 1 pour le porte-avions, 2 pour le croiseur, 3 et 4 pour les contre-torpilleurs et 5 pour le torpilleur.
Voici une grille de jeu possible :
grille = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2, 2, 2, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 5, 5, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 4, 0, 0, 1, 0,
0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
0, 3, 3, 3, 0, 4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Par exemple ici, le croiseur est au indices 13 à 16, c'est à dire aux positions B4 à B7.
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.
Avec la grille précédente, il faut que lire(grille, "B4") 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.
Par exemple, si avec la grille précédente, on exécute ecrire(grille, "B5", 0), la grille devient :
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 3, 3, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Coulé
On a besoin d'une fonction coulé(grille:list, navire:int) → bool
grilleest la grille de jeunavireest le numéro de navire, par exemple1pour le porte-avions- la fonction renvoie
Truesi ce navire est coulé, c'est à dire si l'entier identifiant le navire n'est plus présent dans la grille.
Tir
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),
- 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, Falseindique que c'est « touché » mais pas « coulé ». - en cas de « touché », la flotte est modifiée en remplaçant la position par
0.
Par exemple, avec la grille précédente :
touché, coulé = tir(grille, "B6") # touché est True # coulé est False # la grille devient : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 3, 3, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
vide
On veut une fonction vide(grille:list) → bool qui renvoie True quand la grille est vide.
grille aléatoire
Dans le but de pouvoir jouer avec la machine on voudrait pouvoir remplir une grille aléatoirement.
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.
Tout mettre ensemble
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 :
- au démarrage du jeu, la machine initialise sa propre grille,
- 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é.
- Le joueur recommence jusqu'à avoir coulé la flotte de la machine.

