Projet nsi

Signaler
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021
-
Messages postés
1011
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
10 avril 2021
-
Bonjour, j'ai créer un environnement de jeu (la bataille navale) et une petite intelligence artificielle avec de l'aide. Je ne l'ai pas forcément compris. J'aimerais beaucoup que quelqu'un me l'explique ligne par ligne. Merci

def init_grille (n) :
l = []
for i in range(n):
l.append(["0"] * n)
return l


def coordonnees () :
x = random.randint(1,9)
y = random.randint(1,9)
return (x,y)


def PlacementBateaux(grille):
a,b = coordonnees ()
grille[a][b]="1"
return grille


def jouer_un_coup(grille):
print("jouer")
x_tir = int(input("Abscisse :"))
y_tir = int(input("Ordonnée :"))
if grille [x_tir][y_tir]=="1" :
print("Touché-coulé")
# elif:
# print("A l'eau, mais pas loin. En vue")
else :
print("A l'eau")

def jouer ():
grille = init_grille(10)
grille = PlacementBateaux(grille)
nbre_tour = int(input("entrez le nombre de tour"))
for i in range (nbre_tour):
jouer_un_coup(grille)
return


jouer ()

9 réponses

Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
Bonjour,

Il faudrait au moins que tu précises le langage, ainsi ta question pourra aller dans le forum adéquate.

Et pour publier des sources, il faut utiliser la mise en forme, au dessus de la zone d'édition de tes messages, il y a des icônes pour l'enrichissement du texte. Celle qui a cet aspect
<> ▼
permet d'appliquer au code, suivant une liste de valeurs, le format correspondant à sa nature.
Un petit tuto là : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
mot = 'Hello'
for c in mot:
    print(c)


Pour ton jeu, franchement on n'essaye pas d'y jouer plus d'une fois. Car on aimerait au final au moins voir contre quoi on tirait. Et même toi, pour comprendre le jeu, tu devrais rajouter une fonction qui en sortie affiche la grille cible.

Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

Bonjour,

je code en python, mon projet ne consiste pas a crée un jeu visuel mais seulement a programmer l'environnement du jeu ainsi qu'une légère intelligence artificielle. De plus l'algorithme est déjà crée je veux seulement pouvoir le comprendre.

Merci
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
je ne parle pas d'un jeu visuel, mais juste un affichage texte pour comprendre justement, comme
    0 1 2 3 4 5 6 7 8 9
---------------------
0 | 0 0 0 0 0 0 0 0 0 0
1 | 0 0 0 0 0 0 0 0 0 0
2 | 0 0 0 1 0 0 0 0 0 0
3 | 0 0 0 0 0 0 0 0 0 0
4 | 0 0 0 0 0 0 0 0 0 0
5 | 0 0 0 0 0 0 0 0 0 0
6 | 0 0 0 0 0 0 0 0 0 0
7 | 0 0 0 0 0 0 0 0 0 0
8 | 0 0 0 0 0 0 0 0 0 0
9 | 0 0 0 0 0 0 0 0 0 0


Bataille navale, un grand mot, on tire sur un hors-bord, une chance sur 100. Ton programme comporte au moins un bug, tu affiches la grille (avant de jouer) et tu joues en sachant où tirer, tu verras.

Après l'IA c'est quand c'est l'ordinateur qui joue, là il ne joue pas, il ne fait que répondre oui, non.

On peut t'expliquer ce que tu ne comprends pas bien dans le code, mais il faut au moins nous indiquer les lignes, le bloc, ...
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

D'accords je prends en compte ce que vous me dites.
Je vous dis ce que je comprends :

creation d’une liste vide
création d’une boucle for :
on ajoute un 0 à la grille n fois
return la grille


def coordonnees () :
x = nombre tiré aléatoirement de 1 a 9
y = nombre tiré aléatoirement de 1 a 9
return les coordonnées x,y

def PlacementBateaux(grille):
a,b = coordonnées vide
placement du 1 à l’emplacement du bateau
return la grille avec le 1

et ensuite je ne comprends plus.
(d’ailleurs reprenez moi si j’ai fais une erreur jusqu’à maintenant).

Merci.
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
def init_grille (n) :
   l = []
   for i in range(n):
      l.append(["0"] * n)
   return l

"creation d’une liste vide
création d’une boucle for :
on ajoute un 0 à la grille n fois
return la grille"

initialisation d'un tableau vide
itération, boucle for (n fois suivant paramètre passé) pour créer les lignes
pour chaque ligne on ajoute au tableau une liste de n zéro
on obtient donc un tableau 2D [ ['0','0','0','0','0','0','0','0','0','0'] , ['0','0','0','0','0','0','0','0','0','0'], ... ] ] qui est renvoyé par la fonction

def coordonnees () :
   x = random.randint(1,9)
   y = random.randint(1,9)
   return (x,y)

"x = nombre tiré aléatoirement de 1 a 9
y = nombre tiré aléatoirement de 1 a 9
return les coordonnées x,y"

OK, sauf que moi je mettrais 0 à 9, sinon le bateau ne sera jamais positionné en ligne 0 ou en colonne 0 (pour mémoire la première position d'un tableau ou d'une liste c'est zéro, un tableau de 10 lignes, 10 colonnes c'est 0 à 9 pour les 2 coordonnées)

def PlacementBateaux(grille):
   a,b = coordonnees ()
   grille[a][b]="1"
   return grille

"a,b = coordonnées vide
placement du 1 à l’emplacement du bateau
return la grille avec le 1"

a,b = coordonnées vide ? non !, j'appelle la fonction coordonnees() sans lui passer de paramètre, mais elle en s’exécutant, elle me renvoie les x,y vus plus haut qui sont utilisées pour initialiser les variables a et b
Quand une fonction renvoie une variable que l'on veut récupérer on initialise une variable en exécutant la fonction var_retour = fonction() ou en lui passant un paramètre var_retour = fonction(var_envoi)

def jouer_un_coup(grille):
   print("jouer")
   x_tir = int(input("Abscisse :"))
   y_tir = int(input("Ordonnée :"))
   if grille [x_tir][y_tir]=="1" :
      print("Touché-coulé")
   # elif:
   # print("A l'eau, mais pas loin. En vue")
   else :
      print("A l'eau")

la fonction reçoit la grille en paramètre
elle affiche "jouer" et demande au joueur de donner une coordonnée de tir abcisse/ordonnée récupérée dans les variables x_tir et y_tir
si à la position indiquée par le joueur dans le tableau 2D grille[x_tir][y_tir] il y a 1 (le bateau) affiche un message Coulé
sinon A l'eau

def jouer ():
   grille = init_grille(10)
   grille = PlacementBateaux(grille)
   nbre_tour = int(input("entrez le nombre de tour"))
   for i in range (nbre_tour):
      jouer_un_coup(grille)
   return

Fonction principale du jeu qui articule et lance les autres fonctions du jeu
initialise le tableau de 0 renvoyé par la fonction à laquelle on passe un paramètre sur la taille attendue
passe à la fonction en paramètre la grille avec les 0 et reçoit en retour la même grille cette fois complétée par le 1 du bateau
demande au joueur combien de tentatives il veut faire et stocke la réponse dans nbre_tour
iteration, boucle for suivant le nombre de tours voulus
lance la fonction jouer_un_coup en lui passant la grille contenant la position du bateau

jouer()

c'est la première instruction du programme qui s’exécute, elle lance la fonction jouer() qui va déclencher toutes les autres
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

Merci pour votre correction détaillée, ça m'aide beaucoup j'ai tout compris, seulement il me semble que vous ne m'avez pas dis ce que la fonction PlacementBateaux fait.

Merci.
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
grille[a][b]="1" le tableau 2D est fait au départ de 0, si coordonnes() à initialisé a et b avec 5,4
ont va mettre 1 dans le tableau à l'adresse indiquée grille[5][4] ="1"

donc notre tableau ressemble à cela

    0 1 2 3 4 5 6 7 8 9
---------------------
0 | 0 0 0 0 0 0 0 0 0 0
1 | 0 0 0 0 0 0 0 0 0 0
2 | 0 0 0 0 0 0 0 0 0 0
3 | 0 0 0 0 0 0 0 0 0 0
4 | 0 0 0 0 0 0 0 0 0 0
5 | 0 0 0 0 1 0 0 0 0 0
6 | 0 0 0 0 0 0 0 0 0 0
7 | 0 0 0 0 0 0 0 0 0 0
8 | 0 0 0 0 0 0 0 0 0 0
9 | 0 0 0 0 0 0 0 0 0 0


c'est pour visualiser le contexte du jeu qu'au départ je t'ai dit que tu devrais afficher le plateau du jeu, cela te permettrais de mieux imaginer ce qui se déroule dans le programme
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544 >
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021

dans la fonction, derrière grille[a][b]="1" tu devrais rajouter un print(a,b) pour connaitre la réponse
et jouer en donnant nombre de tour=3 et en donnant la bonne réponse au tour 1, tu verras le bug que je t'ai signalé plus haut.
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

Merci encore !

Je voulais savoir, si bien sur vous avez encore du temps a consacrer a mon projet. Si vous pourriez m'aider a faire des "docstrings" de qualité pour chaque fonctions. (je n'en ai jamais fait)

Merci.
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
moi je ne sais même pas ce que c'est que les docstrings
Messages postés
1011
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
10 avril 2021
112
Bonjour jee_pee,

une docstring c'est la documentation d'une fonction qui s'écrit comme ceci:

def my_func():
    ''' ceci est l'explication de ce que fait
       ma fonction
    '''
    ..........


on peut y accéder de l'extérieur de la fonction comme ceci:

print(my_func.__doc__)
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
Bonjour et merci. A nouveau ces __xxx__, comme je l'ai écrit il faudra que je suive un cours.
Messages postés
1011
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
10 avril 2021
112 >
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021

Bonjour jee pee,

Tiens pour te donner un exemple d'utilisation de la docstring comme une astuce avec accès a l'extérieur:

J'ai vu un code d'un logiciel pro avec une expression régulière en docstring d'une fonction
le code teste si une certaine chaine de caractère "matche" la docstring de la fonction
si oui il exécute la fonction en passant la chaine en argument pour la traiter ...
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

Bonjour Phil_1857, je voulais en savoir plus sur les docstrings svp : ils sont seulement conçu comme un commentaire ou bien il y a une différence ? Mon programme et juste au dessus, je dois faire des docstrings pour chacune de mes fonctions. Pourriez-vous m'aider ?
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544
Avec les explications plus haut tu devrais être capable d'indiquer que fait chaque fonction. Je ne pense pas que ce doive être une explication ligne à ligne, un programmeur un peu expérimenté saura les décrypter. Ce devrait être la substantifique de la fonction.

C'est quoi exactement cet exercice ? tous les élèves écrivent le programme et tu dois commenter celui de ton voisin qui bien évidemment n'a pas utilisée la même solution que toi ?
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021
>
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021

Alors il y avait plusieurs projets (bataille navale, démineurs, jeu de Nîmes..), ou des projets un peu plus complexes (la propagation du feu). Nous étions en groupes et nous devions choisir l'un d'entre eux, pour ensuite le programmé. Mais nous devions aussi créer un site web permettant de décrire l'avancée du projet séance par séance. Pour ensuite avoir une note orale coefficient 4. L'oral est passé, ils nous ont reproché le manque de docstrips et m'ont laissé un délai jusque ce soir pour leur envoyer a nouveau le programme complet avec du coup les docstrips.
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544 >
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

C'était comment votre travail en groupe, un qui écrit le code, un qui passe l'oral et toi qui fait la doc ? ;-)

Je que je ferais, c'est à quoi sert la fonction, qu'a t-elle en entrée, que donne t-elle en sortie.

Exemple :
def init_grille (n) :
    ''' Initialisation grille du jeu
        entrée : la taille de la grille
        sortie : la grille initialisée avec des zéros
    '''
    l = [] 
    for i in range(n):
        l.append(["0"] * n) 
    return l
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021
>
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021

Okk, ça marche. Merci, en continuant j'ai eu un doute ;

Pour la fonction jouer_un_coup :
''' Jouer une seule partie
entrée : grille
sortie : touché-coulé si le tir correspond a l'emplacement du 1 (du bateau) ou A l'eau si le tir ne correpond pas a l'emplacemnt du 1 (du bateau)
'''

Pour la fonction jouer :
''' Jouer autant de parties que le client le souhaite
entrée :
sortie : la grille initialisée avec des zéros
'''
?
Messages postés
31514
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
10 avril 2021
7 544 >
Messages postés
8
Date d'inscription
mardi 23 mars 2021
Statut
Membre
Dernière intervention
24 mars 2021

Pour la fonction jouer_un_coup :
''' Tirer une fois avec les coordonnées saisies par le joueur
entrée : grille du jeu
sortie : message touché-coulé si le tir correspond a l'emplacement du bateau, ou A l'eau si le tir ne correspond pas a l’emplacement du bateau
'''

Pour la fonction jouer :
''' Corps principal du jeu
initialisation grille avec position du bateau
enchainement des tirs suivant le nombre de tentatives désirées par le joueur
'''
Messages postés
1011
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
10 avril 2021
112
Bonjour,

comme tu le vois dans ma réponse précédente, c'est un commentaire mais que l'on peut accéder de l'extérieur de la fonction, ou avec help:

help(my_func)