Projet nsi

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. Modérateur
    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.

    1. 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
      1. Modérateur
        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, ...
    2. 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.
      1. Modérateur
        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
        1. 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.
          1. Modérateur
            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
          2. Modérateur
            @jee peedans 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.
        2. 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.
          1. Modérateur
            moi je ne sais même pas ce que c'est que les docstrings
        3. 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__)
          1. Modérateur
            Bonjour et merci. A nouveau ces __xxx__, comme je l'ai écrit là il faudra que je suive un cours.
          2. @jee peeBonjour 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 ...
        4. 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 ?
          1. Modérateur
            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 ?
          2. @jee peeAlors 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.
          3. Modérateur
            @a2kssC'é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
          4. @jee peeOkk, ç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
            '''
            ?
          5. Modérateur
            @a2kssPour 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
            '''
        5. 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)