Projet nsi

a2kss -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
     
    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.

    0
  2. a2kss
     
    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
    0
    1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
       
      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, ...
      0
  3. a2kss
     
    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.
    0
  4. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. a2kss
     
    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.
    0
    1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
       
      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
      0
      1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989 > jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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.
        0
  7. a2kss
     
    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.
    0
    1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
       
      moi je ne sais même pas ce que c'est que les docstrings
      0
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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__)
    0
    1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
       
      Bonjour et merci. A nouveau ces __xxx__, comme je l'ai écrit il faudra que je suive un cours.
      0
      1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169 > jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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 ...
        0
  9. a2kss
     
    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 ?
    0
    1. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989
       
      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 ?
      0
      1. a2kss > jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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.
        0
      2. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989 > a2kss
         
        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
        0
      3. a2kss > jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
        '''
        ?
        0
      4. jee pee Messages postés 31917 Date d'inscription   Statut Modérateur Dernière intervention   9 989 > a2kss
         
        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
        '''
        0
  10. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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)
    0