École Internationale PACA Manosque

Bataille Navale (par Isabel et Nelly)

Notre Projet
Nous avons décidé de faire une bataille navale à l’aide du langage de programmation
python, afin de faire notre second projet de l’année de première en spécialité NSI. Notre
problématique est: Comment créer un jeu conçu pour être joué sur papier sur python?

Pourquoi avons-nous choisi la bataille navale ?
Nous avons choisi ce jeu car nous le trouvons ludique et relaxant. Vu notre intérêt en jouant, nous avons décidé de créer notre propre version.
La bataille navale est un des plus grands jeux de notre enfance, c’est un jeu familial, etc

Malheureusement il est temps pour nous  de grandir, et d’être des étudiants responsables, c’est pour cela que ce jeu peut permettre à des étudiant isolés de pouvoir malgré tout jouer au jeu qui a bercé
son enfance.

La programmation

Les tableaux
Tout d’abord notre programme commence par la création d’un tableau, permettant de placer les bateaux par la suite.
Premièrement, on a créé le tableau de jeu  du joueur principal, remplis de zéro de taille 8 x 8.
Le tableau de l’adversaire et celui où l’on devine les bateaux sont créés de la même manière, mais celui de l’adversaire ne sera pas affiché pendant la partie pour ne pas révéler ses bateaux. Puis nous avons défini la fonction affiche() qui permet l’affichage formaté des tableaux sur l’interpréteur avec des des lettres en tant que colonnes, et des chiffres en tant qu’indicateur de lignes. La fonction va commencer par afficher les  lettres des colonnes, puis elle va huit fois (la taille du tableau) afficher le chiffre de 1 +1 (car il commence par 0) et la ligne du tableau associée. Nous avons de plus créé un dictionnaire qui associe une lettre à
un chiffre.

Cette grille est la grille de base, qui nous permettra d’afficher les bateaux à l’aide de leurs position indiquée par le joueur, ou bien pour attaquer l’adversaire.

Le plaçage des bateaux
L’utilisateur peut donc commencer à placer ses bateaux. Pour cela la fonction choix() lui demande les coordonnées de chaque bateau qu’il veut placer, il en existe 4 différents: un torpilleur de 2 cases, un contre torpilleur de 3 cases, un croiseur de 4 cases, un porte avion de 5 cases.
Il commence donc par indiquer le chiffre de la ligne, puis la lettre indiquant la colonne et enfin si le bateau est orienté  verticalement ou horizontalement. La fonction vérifie simultanément si la case est vide (0) ou occupée(1) et redemande de nouvelles coordonnées dans le deuxième cas.

Ici, nous avons conçu le système de placement en prenant en compte la volonté de l’utilisateur, demandée ci-dessus.
Grâce à la fonction placage_des_bateaux(), le programme place les bateaux aux coordonnés choisis au préalable par le joueur dans le tableau tableau_joueur.
Une boucle de 2 à 6, permet de répéter tout cela 5 fois, et crée donc cinq bateaux de deux à cinq cases. Les deux conditions après avoir appelles la fonction choix() vérifient que le bateau ne sortira pas des limites du tableau. Si cela est vérifié, alors la fonction parcourt le tableau_joueur place la première case du bateau en échangeant un 0 par un 1. Il continue dans la direction choisie (horizontale ou verticale) le nombre des cases indiqué par la boucle de départ.
En plaçant les lignes et les colonnes , nous faisons -1 car les tableaux commencent de zéro, donc sans le -1, il y aurait un décalage avec la demande du joueur.

Cette fonction permet de placer les bateaux du joueur adverse de façon aléatoire, nous avons donc utilisé random pour cela. Ce module est appelé au début du programme par un import.
Le placage des bateaux adversaires est constitué de trois fonctions.
Premièrement la fonction direction() qui renvoie un chiffre au hasard entre 0 et 1. Puis la fonction case() qui prendra en paramètres la taille et la direction du bateau. Elle renvoie une liste avec une lettre et un numéro choisi au hasard et la direction. La
fonction soustrait de plus la taille du bateau au choix de la lettre et du numéro; pour éviter un dépassement du tableau lors du placage. Enfin, nous avons créé la fonction poser() qui prend en paramètres les données de la fonction case, un tableau et la taille du tableau. Cette fonction vérifie si la direction est horizontale (0) ou verticale (1) puis vérifie sur la place du bateau qu’il n’y a pas de bateaux déjà placés à cet endroit. Si oui, la fonction renvoie False la boucle while not est_pose, continue jusqu’à ce que est_pose == True. La boucle while not tourne à l’infini jusqu’à ce que sa condition soit remplie.
Une boucle de 2 à 6 permet à nouveau de définir la taille des bateaux, nous avons donc également quatres bateaux de deux à cinq cases sur le tableau de l’adversaire. Nous associons donc les résultats de la fonction case() a la variable case_ que nous mettons
en paramètres de poser() en l’appelant.
Nous avons choisis de faire plusieurs fonctions pour aérer le programme et le rendre plus agréable à lire.

Attaquer et jouer
Le joueur va pouvoir enfin attaquer
l’adversaire et inversement! Pour cela,
nous avons créé deux fonctions:
attaque_joueur() et attaque_adv(). La
première fonction utilise la fonction
choix() pour définir les variables ligne et
colonne avec lesquelles elle va vérifier si
on a déjà choisi cet endroit et si un
bateau adverse se trouve en cette
position (renvoie “Touché!” et remplace
le 0 par un 3 dans le tableau_devine) ou
non (renvoie « Raté » et remplace le 0 par
un 7 dans le tableau_devine). La
deuxième fonction fonctionne de la
même manière mais utilise des positions
choisis au hasard et renvoie si le joueur
a été touché ou non

Qu’avons-nous appris au cours du projet?
Au cours de ce projet nous avons appris et nous avons pu nous améliorer sur la création de tableaux, sur la cohésion de groupe et la répartition du travail. Nous avons de plus pu nous familiariser avec les listes, et des conditions.


Qu’est-ce qu’on aurait pu ajouter ou améliorer?
Une interface graphique aurait amélioré notre projet mais nous avons essayé de privilégier la finition de celui-ci.
Ajouter des asserts pour limiter les erreurs dans l’interpréteur et éviter de devoir recommencer le programme à chaque fois.