Session du 07 septembre 2024 à 20h30
Pratique & Live Coding
Veille & Discussions
Algorithmique & Performance
Live coding jeu de la vie
Je vous propose un live coding : comment coder le jeu de la vie en python !
00:00:00 :ąć ä åå åå åå åå åå åå åå åå åå åå åå åå åå åå åå ååok c'est bonnickelbah écoutez est-ce que vous connaissez déjà le jeu de la vie est-ce que ça est ou pasest-ce que vous avez déjà vu des trucs dessusnon pas du tout
00:00:28 :je vais peut-être vous faire une petite introduction sur ce que c'estdu coup c'est une simulation informatique qui se passe sur une grilleon va changer je vais vous montrerchanger l'écranoufdonc ça se passe sur une grille qui est visible si je faiscomment si je fais je zoom encore un peu
00:01:01 :bah voilà on va faire une grille avec des cellules allumées ou éteinteset donc chaque point peut être donc on dit vivant en générald'où le nom jeu de la vie ou mortechaque cellule on appelle ça pour chaque case de la grilleet en fait il y a des règles assez simples qui s'appliquent
00:01:22 :c'est à dire que si vous prenez par exemple une cellule en questiongenre celle làcelle qui est ici làet ben à chaque fois pour regarder ce qu'il va se passer à l'étape suivanteon va regarder les voisines qu'elle adonc là elle a deux voisineset quand je dis voisines c'est dans les quatre directions cardinales
00:01:42 :en haut en bas à gauche à droite et aussi dans les diagonalesil y a 8 cases qui sont directement à côtéet si par exemple ici elle a 3 voisines, là elle a 4 voisineset on peut changer, là elle a aussi 4 voisineset donc si on regarde celle du milieu
00:01:59 :à la prochaine étapeelle suit des règles assez simplesen fait si elle a 2 ou 3 voisines elle reste comme elle estsinon si elle n'a pas 2 ou 3 voisinesen gros dans tous les cas si elle a 3 voisines elle s'allumeet dans les autres cas elle va s'éteindre
00:02:20 :alors l'idée c'est en gros, on peut l'expliquer autrements'il est déjà en vieil lui faut soit 3ou soit 2 voisines2 ou 3 c'est très mal écrit mais c'est pas gravesi elle est morte, donc on va faire une cellule vide comme çail lui faut exactement 3 voisines pour naître
00:02:41 :donc c'est à dire qu'une cellule qui serait déjà alluméeelle a besoin pour rester en vied'avoir 2 ou 3 voisinessi elle a plus de 3 voisines ou moins de 2 voisinessoit surpopulation soit souspopulationdonc elle meurtet une cellule qui n'est pas allumée elle a besoin d'exactement 3 voisines
00:03:00 :pour qu'il y ait le bon nombre de voisines pour qu'elle naissedonc si je reprends le petit dessinon enlève ça, le petit dessin que j'ai fait icisi vous prenez par exemple la cellule qui est au bout icielle n'a qu'une seule voisine, donc à l'étape prochaine elle va mourir
00:03:15 :par contre la cellule qui est au centre, elle a 4 voisinescelle-là, ces deux-là et celle-làdonc la cellule qui est au centre, elle a trop de voisinesla prochaine elle va mourirsi on prend la cellule vide qui est icielle a exactement 3 voisines, donc elle va naître à l'étape suivante
00:03:33 :et on peut faire ça pour toutes les cellules de la grille infinieet on peut aller encore à l'étape suivantecette figure là par exemple, on voit que quand on applique juste ces règlesassez simples, le nombre de voisineselle se met à avancertoutes les 4 étapes, elle revient à sa position de départ
00:03:52 :mais si je fais 4 étapes comme çaelle est revenue à la position de départ1, 2, 3, 41, 2, 3, 4, voilà c'est çaet il y a plein de figures intéressantespar exemple si vous prenez juste 3 comme çales cellules du milieu comme elle a 2 voisines, elles restent comme elles sont
00:04:14 :les 2 cellules sur les côtésles 2 cellules comme ça, celles-là et celles-làsur les côtés, elles ont 3 voisines, donc elles vont naîtreet les 2 cellules sur les extrémités, elles n'ont qu'une seule voisine, donc elles vont mourirdonc à l'étape suivante, on a une barre horizontaleet la même chose se produit à l'étape suivante, on a une barre verticale
00:04:32 :et donc si on fait des grilles un peu au hasard comme çaon voit qu'il y a plein de trucs intéressants qui se produisentsi on lance la simulation, il y a plein de trucs intéressants qui se produisentpar exemple il y a des figures comme celle-là qui ne bouge pas
00:04:45 :ou celle-là, celle-là c'est évident qu'elle ne bouge pasparce que toutes les cellules ont exactement 3 voisinesdonc elles restent tout le temps comme elles sontil y a des trucs qui évoluent comme ça, on dirait un peu que c'est aléatoiremais ça s'appelle le fait de brûlerquand ça évolue comme ça un peu de manière aléatoire
00:05:03 :on a la figure que je vous avais montrée qui est ici, qui avance en diagonaleon a encore d'autres figures qui sont stables, qui ne bougent paset on a les figures que je vous avais montrées aussiles oscillateurs, les clignotants elles s'appellentqui du coup sont verticales, horizontales, etc.
00:05:18 :et on peut construire comme ça plein de figures intéressantespar exemple si on fait comme ça1, 2, 3, 4, 5...c'est 5 ?non c'est 67, 8, 9, c'est 10 je crois ?
00:05:39 :ah non c'est 8 je suis bêteah j'y arrivais2, 4, 6on est à 8 là ?si on fait une barre de 8 comme çatout autourje sais plus si c'est 6 ou 8je vais mettre trop de cellules mais c'est pas très graveon testera
00:06:07 :voilàah si je me suis planté c'était 6normalement ça fait un dessin assez logiquemais faut que je ne galère pas trop à le faireil se met pas bon dans la vidéo là3, 4, 5, 6et ici pareilcette figure là elle est périodique aussielle se répète toutes les 5 étapes
00:06:36 :elle revient à sa position de départdonc si j'avance de 5 étapeselle fait des formes en spiraletoutes les 5 étapes elles se répètentj'ai fait toute une vidéovous pouvez la regarder dans les live discord précédentson a passé 1h30, 2hà discuter de çadonc il y a vraiment
00:07:03 :je sais pas pourquoi il veut pasmais qu'est-ce qu'il y a de marrantpar exemple il y a desdes figures assez géantesc'est une espèce d'usine géantequi fabrique ces vaisseaux làdonc là vous avez une usine géantequi avance en diagonaleon a vraiment des structures géantes
00:07:30 :qui peuvent être crééesmais le but ça va être de le codercomment est-ce qu'on code une simulationqui fait çaje propose qu'on aille tout de suiteje vais pas passer plus de temps à expliquer comment ça fonctionneet on va passer sur le codechangewindowscomme on est sur un discord de Python
00:07:57 :je vais plutôt le faire en Pythonmon fichier s'appellegol.pyle jeu de la vie en anglaispetit commentaireetune des premières choses qu'il va falloir c'est biensavoir comment fonctionnent les règlesdoncje propose que la première chose qu'on fassec'est créer une fonction rulesqui va prendre du coup pour chaque cellule
00:08:33 :l'état de la celluleeton va dire soit la liste des voisins soit les voisinson pourrait prendre par exempleles neighborsqui va être une liste de bouléensune liste de bouléens ça veut direpour chaque voisin on va savoir si elle est allumée ou éteinteet ça va renvoyer du coup
00:09:01 :les règlesc'étaitsi on a une celluleen viesi on adeux ou troisvoisineselle reste en vieet si elle aelle meurtça veut dire queon va retourneret si elle meurt on retournej'ai représenté en vie par trueet morte par falseévidemment ma structure pour la grille
00:09:50 :ce seraune liste de listesde true, false, etccomme çaicion aura une espèce de grillequi sera une liste de listes de bouléensil faut juste que je fasse çavoilàça sera notre grillechaque voisinechaque celluleet la liste des voisinespour continuer les règles
00:10:32 :pour qu'elle reste en vie il faut deux ou trois voisineset si elle est mortealors si elle a trois voisineselle va remettreil n'y a plus rien iciet si elle an'importe quel autre voisineelle reste morteet donc ce sera un falseça on peut assez facilement coder
00:11:06 :le nombre de voisinsc'est pas la longueur de neighborsc'est la somme de neighborsest-ce que quelqu'un...j'ai des notificationsdonc parce que la sommede neighbors c'est ce qu'il nous fautsi on ouvre un interpréteur pythoncelui-làon va même le mettregenre làsi on regarde une liste boulet 1
00:11:55 :donc par exempleb égaletrue, false, true, falseà votre avis qu'est-ce que ça faitsi je fais somme de btrue ou falsealors ce qu'il faut comprendrec'est que quand on fait true, false, falseen fait il sait très bien que plusça ne peut pas être fait avec des boulets 1
00:12:29 :du coup il va nous donner un résultatqui est un entieret comment il faitil va faire int the trueplus int the falseint the true c'est 1et int the false c'est 00 ou 1 pour vrai ou fauxcomme souvent en informatiqueon représente faux par 0 et vrai par 1
00:12:59 :parce que notammentsi vous faites un andtrue and false c'est falsetrue and true c'est vraic'est comme ça qu'il fonctionnec'est exactement pareil que si vous faitesune multiplication0 x 1 c'est 01 x 0 c'est 0true and false c'est falseet si vous faites
00:13:32 :true and true c'est 1 x 1ça fait 11 c'est true et 0 c'est falsesinon true c'est quand il y a quelque chose de vrai0 c'est quand il n'y a rienvous voyez l'idée de mettre 0 ou 1et doncsi on revient à la liste B
00:13:56 :quand on fait la somme de Bça fait 3 parce queon a true, false, true, true, falsesi on faisait la liste 1, 0, 1, 1, 0et dans une somme, dans une additionles 0 ne servent à riendonc on a 1, 1, 1c'est à dire que la somme va être le nombre
00:14:20 :si on fait une liste où il y a1, 1, 1, 1, 0, 1si on fait la somme de cette listeet bien on a 5 parce qu'il y a fait 5 fois le chiffre 1et le 0 ne compte paset du coup pour une liste de bouléens comme B
00:14:42 :la somme de B ça vaut le nombre de fois qu'il y avaittrue dans la listeun autre code pourune liste de vivants ou mortsj'ai marqué iciça fait le nombre de voisins qui sont vivantsle nombre de voisins qui sont à trueen fait ça c'est pas nécessaire mais on reviendra
00:15:28 :après pour les optimisationslà vous êtes d'accordon a bien le if cell is true c'est si elle est en vieparce que cell c'est la cellule sur laquelle on se concentre actuellement pour la règlesi elle a 2 ou 3 voisinesc'est falseensuitesi elle est morte c'est false
00:16:08 :on retournetrueon retourne falseça c'est pour les règlesceux qui ont déjà fait pas mal de python savent déjà quequand on a une conditionavec if else et qu'on a un return dans le ifon n'a pas du toutbesoin du elsepourquoi ? parce que si on arrive dans la condition et qu'elle est vraie
00:16:46 :on arrive dans return true donc on sort de la fonctiondonc tout ce qui est après ça ne s'exécutera pas de toute façondonc on peut enlever le else et faire çaça fait bien que si on rentre dans la conditionon a le trueil se passera le else
00:17:09 :c'est à dire que ce return làretournera son résultatet le reste ne s'exécutera paset du coup on peut faire la même chose icion peut enlever ce else et faire çail ne va pas exécuter le return truemais il va exécuter le return falseet d'ailleurs on peut faire la même chose avec cette condition là
00:17:35 :puisque ici on voit dans tout ce pavé làde code dans cette partie làon va forcément retourner quelque choseet ici aussi, donc on peut faire exactement la même logiqueon enlève le else et tout ça, on le désindenteet là c'est plus standard en pythonc'est à dire que
00:17:56 :c'est la condition suivanteon retourne true, mais si la condition n'est pas vraiec'est qu'aucune des conditions n'était vraiedonc c'est comme le else finalmais on n'a pas besoin du else parce qu'il y a des returnson a quand même pas mal de lignespour ça on a une constatation
00:18:27 :c'est que si on a par exemplenb.neighbors égale 5on fait le testest-ce que c'est égal à 5en python le double égalil sert à tester si l'égalité est évidenteet si c'est fauxévidemment ça va nous renvoyer un bouletun true ou un falsejuste le fait que ça renvoie un true ou un false
00:18:57 :ça va beaucoup nous aiderparce que typiquement icion est en train de dires'il y a 3 voisinset qu'il n'y a pas de voisinset qu'il n'y a pas de voisinsil me met tout en vertparce qu'il sait qu'un returnne sera jamais exécutémais pourquoi est-ce que ce return
00:19:27 :est équivalent à ces 3 lignesparce que si le nombre de voisinsest égal à 3le test d'égalitéil vaut trueet à l'inversesi il n'y a pas 3 voisinsle test d'égalitéa une seule ligne iciou une autre égalitémais en fait tout ce qui est dans cette condition
00:20:13 :égal 2 ou égal 3ça va aussi renvoyer un boulet 1vrai ou fauxet enlever le 2 pointset c'est équivalent à çapuisque si le test d'égalité est vraivoilàah, il y a Pierre qui dit qu'il y a des coupures de sonest-ce qu'il y a d'autres gens d'entre vous qui ont des coupures de son ?
00:20:46 :non c'est bon ?vous me dites si vous avez des soucis de sondans le salon textuel du vocalmais donc si on revientet en fait on peut encore faire la même optimisationpuisqu'on a encore une fois la même structuresi quelque chose est vrai, on renvoie ça
00:21:25 :sinon on renvoie çaalors là, celle-là on n'est pas obligé de la faireparce qu'elle n'est pas forcément très joliemais ça donnerait quelque chose du style et returnune expression iciif self is trueelse une expression icion peut contracter toute la condition avec unif else en une seule ligne
00:21:57 :d'accord ?voilàet ce qui est dans les deux points de la finc'est toute l'expression icibon, c'est pas hyper jolidu coup il y a un autre moyen d'optimiser un petit peude rendre ça un peu plus courtc'est de se rendre compte qu'en faitsi la cellule est vivante et qu'il y a trois voisins, c'est bon
00:22:29 :mais si elle est morte et qu'il y a trois voisins, c'est bon aussidonc en fait on peut plutôt l'écrire en retournant les conditionset en disant si le nombre de voisinsest égal à 3qu'on retourne 2et sinonsi la cellulen'a pas de trois voisinesil va falloir retourner
00:22:56 :soitest-ce qu'elle est vivanteet qu'elle a deux voisinesou si elle n'est pas vivanteet qu'elle a deux voisines, elle est forcément mortepuisque si elle n'est pas vivante et qu'elle n'a ni deux ni trois voisinesdonc elle n'a pas non plus trois voisines icielle ne peut pas être vivante
00:23:20 :c'est un retournement qui est un peu bizarre, mais si je vous le redisvu qu'on a déjà testé si elle avait trois voisines ou passi elle a trois voisines, elle n'est forcément vivantesi on revient sur les règles iciqu'elle soit en vie avec trois voisines ou morte avec trois voisines
00:23:35 :elle finit toujours en viedonc trois voisines ça veut dire qu'elle est forcément vivanteet si elle n'a pas trois voisinessoit elle était déjà mortesoit elle était en viele seul moyen qu'elle reste en vie c'est qu'elle ait deux voisinesdonc si elle n'a pas trois voisines
00:23:56 :il faut forcément pour qu'elle reste en viequ'elle ait deux voisines et qu'elle soit en viec'est-à-direle nombre de voisines est égal à deuxet la cellule est en vieet cette façon de l'écrireon va mettre un commentaire sur celle-làc'est la façon la plus optimiséeon peut l'écrire en une seule ligne
00:24:23 :le nombre de voisines est égal à troisoule nombre de voisines est égal à deuxet la celluleest en vieil faut mettre des parenthèses ici pour être bien clairet j'ai écrit ou en français alors qu'il faut l'écrire en anglaismais voilà, ici on a bien
00:24:47 :la même chose puisque mettre un ouça revient pareil dans ce cas-làsoit cette condition-là était vraie et on retourne truesoit cette condition-là était vraieet comme on retourne sa valeur on retourne vraidonc ça c'est la meilleuremanière d'écrire la conditionsachant que c'est pas forcémentce qui est le plus visible
00:25:14 :et sachant que vous pouvez écrire celle que vous voulezen soit ça change pas énormément le codemais voilàon a fini avec les règles, c'était peut-être la partie la plus théoriqueet du coup on va pouvoir entamersur la gestion de la grillevu qu'on a fini les règles, il va nous falloir
00:25:36 :un moyen d'appliquer les règles sur chaque cellule de la grilledu coupon va faire par exemple une fonctionnextgrid qui va prendre une grillequi est du coupune liste de listes de booléensc'est-à-dire, liste de listes ça sert à faire un tableau de dimensionset booléens, chaque cellule
00:26:01 :est soit vivante ou morte et qui va renvoyerune liste de listes de booléensokalors comment on va faire ?une des méthodes les plus simples c'est de faire une nouvelle grillequi va êtreune copie mais vide de la grillealors comment on fait une copie vide de notre grille ?
00:26:25 :bah si, je vais reprendre en haut icinon en fait je vais pas la reprendre parce que ça sert à rienmais imaginons que dans notre codeje sais pas si vous connaissez cette syntaxeen gros c'est dans cette condition là que vous êtes censé mettrele code qui s'exécute
00:26:44 :c'est pas très important comme détailmais c'est le code qui s'exécute au début quand vous lancez le scriptmais si vous importez le script, ça ne s'exécutera pasdonc code qui ne s'exécute passi on importe le fichierc'est-à-dire que si vous prenez ce fichier làet que vous voulez juste utiliser les fonctions qui sont dedans
00:27:08 :vous n'avez pas forcément envie qu'il se mette à faire des printsou à faire des choses comme çaalors que vous l'avez juste importévous allez utiliser çapour préciseret dans cette condition là ça ne s'exécute que si on importe pas le fichierque si on l'exécute vraiment ce fichier là en ce moment
00:27:29 :c'est pas très grave mais c'est une habitude d'apprendremaintenant on va définir gridça va être par exempleune grid qui a une certaine hauteuret une certaine largeurdonc width, height ça va être nos deux variablespar exemple on peut dire que widthça va être une largeur de 20
00:27:54 :et height une largeur de 20 aussi par exempleet la grid du coup ça va êtrepour l'instant remplie de falsefor une variable qui sert à rienin range widthla largeurfor variable qui sert à rienin range heightpourquoi est-ce que je fais ça ?
00:28:21 :si vous visualisez ici on va avoir chaque ligneça c'est une lignedu coup les lignes on les répètefor quelque chose in range la hauteurc'est à dire qu'on fait autant de lignes que la hauteur de notre gridet chaque ligne c'est un boulet 1qui est répété pour autant de fois que la largeur
00:28:42 :c'est à dire que chaque ligne contient autant de boulets 1 que la largeurdonc ici si on fait int gridqu'on exécute ce codeici on voit qu'on a une grosse grille pleine de falsealors peut-être que si je fais une grille de 2 par 2on verra mieux ce qu'il se passe
00:29:01 :ici on a bien une ligne qui contient false falseet une deuxième ligne qui contient false falseet si on fait une hauteur de 5 par exempleon va juste avoir 5 fois des lignes qui contiennent 2 falsepuisqu'elle a une largeur de 2et une hauteur comme ça
00:29:19 :de 5et du coup principalement la fonction next gridelle consistera à faire une nouvelle grilleet une copie de la grillemais en fait on peut mettre ce qu'on veut ce qui est importantpardon ouivas-y quelle est la questionohoui pardonsi vous pouvez me le dire
00:29:50 :désoléça arrive de temps en tempsj'ai jamais trouvé pourquoimais si je faisçaça règle le soucison voit que ça bouge et toutdonc la nouvelle grillepour quelque chose in rangele nombre dela longueurde la première ligne de la grilleet ça pour quelque chose in range
00:30:30 :la longueur de la grillealors pourquoi est-ce qu'on fait çale nombre de lignes c'est juste la longueur de la grillemais le nombre de colonnesici il y a deux colonnesle nombre de colonnes c'est la longueurde la première lignedonc de grid 0donc si on prend ici la première ligne
00:30:58 :elle a deux élémentset donc ça c'est le moyen de faire une grille remplie de falsede la bonne tailleet ensuite faudra qu'on trouve un moyend'appliquer toutes les règlesles règlesàsur une grilleet ça ça vacomment ça va se passeron va parcourir les éléments de la grille
00:31:31 :et à chaque fois le résultat on le mettra dans la nouvelle grilleet ensuite ce qu'on pourra faire c'estpour l'instanton va mettre en pause cette fonctionparce qu'on va avoir besoin d'une fonction que je vais mettre tout en hautet qui va s'appelerpour afficher une grille
00:31:53 :et donc il prend une grille en paramètresune liste de bouliaset qui va du coup ne rien retournerdonc je le précise en faisant return Nonel'objet Python qui représente l'absence d'objet Pythonc'est l'objet qui représentequand il n'y a pas d'objet en faitdu coup si elle retourne None ça veut dire qu'elle ne retourne rien
00:32:17 :si on revient dans l'interpréteur et qu'onfait une fonction par exemple testune fonction test qui fait par exemplea égale 3, b égale 4c égale a plus b, enfin elle fait des trucset qu'on fait test, qu'on l'exécuteon voit qu'elle ne retourne rienmais si je fais test Is None
00:32:42 :il va me dire que c'est vraiparce que None c'est bien l'objet qui représente riendonc None c'est vraiment ce qui sert à direil n'y a rien, c'est quand votre interpréteur ne vous renvoie pas de valeurparce que ça n'a pas de valeurdonc ma fonction print qui affiche la grille
00:33:00 :elle ne renvoie rien puisqu'elle va l'affichercomment on va afficher une grille, il va falloir faire ligne par lignedonc for line in gridet là je vais utiliser une fonctionparticulière qui s'appelle joinalors qu'est-ce que je vais faire.join
00:33:21 :et ici il va falloir que j'utilise une autre fonction particulièrequi s'appelle mapstrpardonon va direcell symbolsur linealorscell symbol c'est une fonction très simplequi va prendre la valeur d'une celluleet qui va renvoyer la chaîne de caractère qui corresponddonc on a juste à dire
00:34:00 :if cell is trued'ailleurs je n'ai pas préciséparce que si elle est vraie, if true c'est bonet si elle est fausse, if false ce ne sera pas bondonc en fait direif cell is trueça revient juste à direc'est pareilparce que tester si quelque chose est égal à vrai
00:34:27 :c'est juste pareil que mettre ce quelque chose dans la conditionvu que la condition consiste déjà à diresi c'est vrai on le fait et si c'est pas vrai on le fait pasdonc ça sert à rien de retester si c'est égal à vraimais bref c'est des trucs encore théoriques
00:34:42 :mais c'est des choses qu'on fait pour éviter de mettretrop de code inutilec'est un petit peu plus légerquand on est habitué ça se lit plus vitemais tout comme dans cette fonction làsi la cellule est vivanteon va dire qu'elle retourne par exempleça ça va être notre symbole pour une cellule vivante
00:35:07 :une sorte de carré comme çaou on pourrait faire deux blocs comme çapour que ça fasse un carrésinon on va retourner deux espaceset donc ce que je vais faire ici c'est que je vais prendre ma lignequi est une liste de bouléenset je vais appliquer la fonction cellsymbole
00:35:28 :sur chacun de ces bouléensalors comment ça fonctionneen faitsi je viens faire çasi je viens tester nos fonctionsc'est le code en hautsi je suis iciet que je fais cellsymbolede trueça va me renvoyer çaet pareil pour falseet maintenant si je fais un map
00:36:04 :il va permettre d'appliquer une fonction d'un seul coup sur tous les éléments d'une listealors par exemple si je fais mapcellsymbole sur une listegenre true, false, false, trueça devrait envoyerun map object parce que map fait partiede ces objets qui sont un petit peu particuliers
00:36:25 :mais si on le transforme en liste de false avec la fonction liston a exactement ce qu'on voulait, à chaque fois qu'il y avait trueon a notre chaîne de caractère avec les deux blocset à chaque fois qu'on avait false on a notre chaîne de caractère videet donc c'est exactement ce qu'il nous fallait
00:36:40 :et ensuitesi à la place du liste je fais un point joinet bien ça va justeprendre toutes ces chaînes de caractère et les mettre côte à côteet je vous remets un falsetrue pour qu'on voit bienet si on avaitvrai, faux, faux, vrai, faux, vrai
00:37:04 :on a une cellule, deux fois pas de cellule, une cellule, pas de cellule, une celluleon a exactement la même chose mais représentée plus visuellementet alors pourquoi est-ce que point joinil est après une chaîne de caractère ?
00:37:16 :c'est parce que je peux mettre quelque chose dedans, par exemple si je mets virguledans cette chaîne de caractèreil va mettre une virgule dans la chaîne de caractère entre chacun de ces symbolesdonc ça pourrait être pratique par exemple de mettre une barre verticalepour qu'on voit bien quand est-ce qu'il y a des cases vides
00:37:31 :quand est-ce qu'il y a des cases pleinessi on veut faire un contour sur la grille, ça peut être utile ce genre de fonctionmais pour l'instant on va garder juste les cellulescomme ça collées côte à côted'où le point join, vous voyez on pourrait mettretoto dedans et à chaque fois, entre chaque cellule
00:37:49 :on a toto qui s'écritc'est à ça que ça sert le point joinmais si je mets une chaîne de caractère vide, évidemmentà la place de toto il n'y a rien, on a juste la représentationde nos celluleset donc c'est pour ça que chaque ligneon va la prendre, donc for line in grid
00:38:10 :cette ligne là, sur chaque élémenton va appliquer cell symbol avec maple map il applique cell symbol sur chaqueélément de la ligne, on obtient donc une listeavec à chaque fois, à la place de true ou falseune chaîne de caractère qui représente la celluleet on va faire un point join pour avoir tout ça
00:38:31 :et donc on peut dire que ça c'est la lignesous forme de chaîne de caractèreetsi on fait str grid, donc la grille sous forme de chaîne de caractèreon va dire qu'au début c'est une chaîne de caractère videet que str gridon va lui ajouter, donc plus égal
00:38:52 :c'est à dire qu'on va ajouter à la finon va ajouter la ligneplus un symbolede retour à la ligne, parce que sinon on va avoir toutes les lignes côte à côteet ça ne va pas faire une grilledonc il faut qu'à chaque fois qu'on a fini la ligne
00:39:10 :on mette un symbole de retourà la ligne et ensuiteon peut faire print str gridet donc pour vérifier si ce code là ça fonctionne bienon va pouvoir aller tout en basici, et au lieu de faire print gridoù c'était pas très clair comme çaon va pouvoir faire notre
00:39:37 :print spécial, notre truc qu'on a définiet là on voit une grille vide parce qu'elle était pleine de falsemais si on met que des true, on voit bien qu'on aune grille de 2 par 5, donc tout ce qu'on voulaiton va mettre une grille de 10 par 5 par exemple
00:39:52 :alors là il n'y a que des cellules pleinesalors comment on va faire pour mettre des cellules pleines ou pas pleineset bien on va faireimport randomfromrandom import randomet à la place de ça on va mettre randomsupérieur à .5
00:40:16 :et quand je fais ça, parce que random c'est une fonction du moduledu coup random, parce que je l'ai importé icije lui demande la fonction randomet cette fonction renvoie un nombre aléatoire entre 0 et 1donc 0,60, n'importe quoiet du coup comme il est aléatoire, il y a une chance sur 2
00:40:37 :qui soit supérieur à 5 et une chance sur 2 qui soit inférieuredonc quand je fais ça, cette condition a une chance sur 2 au hasard d'être vraieet une chance sur 2 d'être fausseet donc ici on a à peu près la moitié de la grille qui est remplie et l'autre moitié qui est vide
00:40:49 :et du coupgénéralement les combinaisons sont inférieurespourquoi inférieures, parce que si je mets 0,3 par exempleil y a 30% de cellules qui serontmais si je mets 0,1il y a 10% de cellules qui seront alluméeset si je mets 0,9, il y aura 90%en général 0,3 c'est pas mal pour le jeu de la vie
00:41:14 :mais on verra ça plus tarddonc voilà, on a une nouvelle grille affichéeet maintenant on peut s'occuper vraiment d'une cure du trucc'est à dire ce qu'on avait déjà commencé à direcomment passer à la grille suivantedonc on a déjà fait quelque chose qui prend la grille
00:41:32 :qui crée une nouvelle grille vide de la même tailleet maintenant il va falloir que sur cette nouvelle grilledonc pour ça, il va falloir faire quelque chose d'assez simpleil va falloir faire...
00:41:44 :qu'est-ce que j'ai fait ?j'ai un petit soucis de claviervoilà, il y a for line in griddonc notre grille, on parcourt chaque lignefor cell in line, on parcourt chaque cellule de la ligneet ensuite il faut appliquerles règles, du coupégale rules, notre fonction rules
00:42:08 :qui prend la cellulenotre fonction ruleselle prend une celluleelle prend une cellulequi est un boulet 1 donc ça c'est bonet des voisins, ah oui il nous faut la liste des voisinsdu coup il va falloir trouver comment récupérer les 8 voisines de chaque cellulealors comment est-ce qu'on peut faire ça ?
00:42:32 :du coup il va nous falloir une variable qui contient çaet cette variable, les voisinsil va falloir qu'on utilise une fonctionqui prend la grilleet qui va nous donner les voisinsmais la fonction qui est ici, elle ne peut pas savoir comme ça par magieà quelle cellule de la grille on en est
00:42:56 :il faut bien qu'on lui dise où on en est dans la grilleet donc il va falloir qu'on lui donnele numéro de lignede la grille actuelleen informatique en général on utilise l'ordreligne, colonne, c'est à dire qu'on donne d'abord le numéro de ligneet d'abord le numéro de colonne
00:43:17 :comment on va faire ça ? il faut modifier nos boucles fortespour qu'ici au lieu de parcourir la ligneon ait aussi un indice de notre parcourspar exempleidx, blindet je vais quand même parcourir la ligne en même tempset ici je vais faire un truc qui s'appelle la fonction enumerate
00:43:38 :et en gros ce que va faire cette fonction enumeratec'est qu'elle va prendrele parcours du listeet au lieu de juste renvoyer les éléments de la liste dans l'ordreelle va nous donner d'un côté les éléments de la liste et d'un côtéla position dans laquelle on est dans la grille
00:43:56 :pour vous donner un exemplesi on a une liste par exemplel égalecoucou, salut, bonjouret testça c'est notre listeet si on fait enumerate de let je transforme en liste parce que sinonrien à voirici on voit bienje pourrais faire une bouclepour is
00:44:33 :enumeratelprint isici on voit que i c'est d'abord 0 puis 1 puis 2 puis 3c'est l'indice de la boucleon a pas encore fini la tour de boucleon c'est à 0 puis à 1jusqu'à ce qu'on ait fait tous les tours de boucleet s c'est tout simplement ce qu'est dans l
00:45:01 :donc coucou puis salutça équivaut à faire en même tempsun for i in range len de let en même temps un for s in lc'est comme si on mélangeait les deuxen même temps on parcourt les indices d'une listeet en même temps on parcourt la liste elle-même
00:45:22 :et donc là on va faire la même chose avec les lignes de notre grillepour la grilleon va parcourir chaque ligne et on va récupérer son indiceet du coupon va avoir l'indice de colonnedonc je vais juste col pour colonneet il va falloir queon mette un numéro X ici
00:45:46 :voilà et comme çaon a rien à changer ici mais on a juste récupéré en plusl'indice de ligne et l'indice de colonneet du coup on peut mettre idx lineidx colonne dans notre fonctionqui va récupérer les voisinscette fonction là elle prend la grille, la ligne et la colonne
00:46:07 :et elle va donc renvoyer les voisines de la celluleune fois qu'on a fait çaon a récupéré la liste des voisinesqui est je la rappelle une liste de booléenspuisqu'on va avoir 8 voisines qui sont vraies ou fausseset une fois qu'on a récupéréces voisines on les met dans les règles
00:46:28 :du coup on a la nouvelle celluleet il va juste falloirprendre la nouvelle grilleen index idx lineidx colonne qui va être égale ànew cell pourquoi parce que notre nouvelle grillec'est celle qui est après l'application des règlesà la position qu'on est en train de regarder
00:46:53 :donc notre bonne ligne et notre bonne colonneelle prend comme valeur la cellule après l'applicationdes règlesdonc une fois qu'on a fait çail ne reste plus qu'à s'occuper de la fonctiongetNeighborsqui va nous récupérer les voisineset donc on va la mettre par exemple juste ici
00:47:23 :def getNeighborsgrididx linedonc la grillec'est bien une liste de listes de boulet 1ça c'est un entierpuisque c'est l'indice de notre ligueet ça c'est un entier aussiet ça, ça va renvoyer une liste de boulet 1on commence à avoir des lignesun petit peu grandes
00:47:56 :ce qu'on peut faire pour que ce soit plus clairc'est par exemple aller à la ligne icides 8 voisinscomment on fait ça ?
00:48:08 :on prend d'abord la grille en indexidx ligne et idx colonneça c'est notre cellule sur laquelle on est en train de regardermais nous on ne veut pas cette cellule là, on veut ses 8 voisineset comment on obtient les 8 voisines ?
00:48:23 :soit on va un cran vers le haut, un cran vers le bas, un cran vers la gauchedu coupon va copier çaon va copier ça làet ici on obtient 8 cellulessachant que celle là, on va imaginer que c'est celle du milieudonc on n'en a pas besoin, on va mettre des espaces ici
00:48:52 :et ensuite, si on est sur cette cellule là au milieupour avoir celle qui est au dessusil faut enlever 1 au numéro de lignec'est la ligne précédentedonc c'est idx line moins 1et du coup la ligne suivante c'est idx line plus 1ça c'est plutôt logique
00:49:15 :maintenant, si on va à gaucheet sur cette cellule làc'est la colonne précédenteet on va aligner tout ça comme çaet pareil pour la colonne suivantesi on est à droitec'est idx line plus 1et du coup les diagonalesça va être le mélange des deux
00:49:42 :si on va sur cette diagonale là, c'est la ligne précédente et la colonne précédenteet du coup c'est line moins 1et colonne moins 1c'est line plus 1 colonne plus 1donc à chaque fois, il suffit d'ajouter ou d'enlever 1à la ligne et à la colonnepour avoir la case d'à côté
00:50:03 :celle là c'est line plus 1 colonne moins 1euh non pardonc'est colonne plus 1 et ligne moins 1c'était bien colonne moins 1donc faut pas s'embrouilleret celle qu'il nous reste à faire c'est celle cic'est à dire la ligne précédentedonc line moins 1et la colonne suivante
00:50:31 :et donc on a icitoutes les cases qui nous intéressentpour les 8 cases qui nous intéressentsachant qu'on ne compte pas la cellule du milieusinon on compterait la cellule qui nous intéresse en ce momentvoilàdonc ici on a à peu près ce qu'il nous fautà un détail près
00:50:56 :qui est un détail auquel on ne pense pas forcément au débutmais imaginez si on est sur le bord de la grillesi on est sur la cellule qui est au bordil n'y a pas de ligne suivante, il n'y a pas de ligne à sa droitepareil si on est tout en bas de la grille
00:51:11 :il n'y a pas de ligne plus baset donc ça c'est un problème un peu embêtantparce qu'il va falloir faire des exceptionsd'une manière ou d'une autredu coup il y a plusieurs moyens de faire çamais un moyen simple c'est d'imaginer que la grillele bas et le haut sont reliés
00:51:33 :je ne sais pas si vous voyezmais il y a des jeux vidéo où ça se passe comme çapar exemple Pacman quand il va à droite de la grillesur les labyrinthes de Pacmanquand il y a un trou d'un côtéil revient de l'autre côtéon peut imaginer la même chose avec nos voisines
00:51:55 :une cellule qui est à droite de la grilleelle pourrait avoir comme voisine quelque chose qui est à gauche de la grilleparce que ce qu'on ferait c'est relier la gauche et la droiteon peut faire la même chose en reliant le haut et le basc'est à dire que quand on monte
00:52:10 :on revient en basc'est ce qu'il se passe si vous avez une carte de la Terreune mapmonde et que vous tracez le chemin d'un avionvous voyez bien que la Terren'est pas carréeelle n'est pas en forme de mapmondedu coup si on va à droite de la mapmonde
00:52:31 :quand on dépasse le bord on revient normalement sur la gauchemais en vérité c'est comme si on avait pris la mapmondeet qu'on l'avait mise en forme de globece qu'on va coder c'est un peu la même chosecomme si notre rectangle de jeu de la viereprésentait une figure qui est refermée sur elle même
00:52:49 :où le haut et le bas sont reliéset la droite et la gauche sont reliéset si vous voulez voir à quelle figure exactementce genre de choses ressemblec'est une figure mathématiquequi s'appelle un torsparce qu'une sphère ne fait pas exactement çaet donc un tors ça ressemble à ceci
00:53:13 :c'est une figure en forme de donutet ici ils ont noté sur le dessinles coupures qu'il fautce serait les bords de notre cartesi on prenait une carte carréeon a une frontièremais si vous imaginez que vous preniez une feuille de papiervous pouvez prendre une feuille carrée
00:53:53 :et la plier dans cette forme làalorsvous avez une feuille rectangulaire iciet vous allez la plier comme çade manière à ce quele haut et le bas de la feuille viennent se toucheret la droite et la gauche aussi viennent se toucherc'est un peu bizarre comme façon de plier
00:54:17 :là en plus on a une feuille qui est un peu élastiqueavec une vraie feuille on ne peut pas faire çala droite et la gauche se touchentet donc ici on a notre tors qui est terminédoncsi je reviens sur le codecomment est ce qu'on va pouvoir faire ça
00:54:46 :il nous faudrait un moyen de dire quand on a dépassé le nombre maximum de colonneson revient à zéroc'est à dire qu'il faudrait un trucsi on a par exemple notre width qui est égale à 10on a un moyen de faire que tous les 11supérieurs à 10 reviennent à zéro
00:55:05 :et donc il y a un moyenassez simple de faire çac'est l'opération modulo 10mais par exemple si on a 11 modulo 10on revient bien à 1et si on a 10 modulo 10on est à zéroet si on a 9 modulo 10 par contre ça ne va pas
00:55:29 :c'est à dire que c'est comme si on avait 10 colonneset que du coup quand on arrive à la dixièmeil n'y a pas de dixième puisqu'on commence à zéroje vous rappelle que si il y a 10 colonnesla première c'est la 0 et la dixième c'est la 9
00:55:44 :et donc la colonne numéro 10c'est la 11ème colonne mais elle n'existe pasdu coup on va revenir à zérodonc il faut bien que 10 redevienne 0et la colonne suivante10 plus 1j'ai oublié les parenthèsesça va faire bien la colonne 1et ensuite 10 plus 2 ça fait la colonne 2
00:56:11 :c'est à dire que c'est comme si on avait une horlogenotre horloge d'habitude est la 12 casevous voyez bien que quand on part de 0donc de midi ou de minuiton avance d'une heure on a 1, 2, 3, 4, 5et quand on arrive à la douzième heure
00:56:29 :il n'y a pas de douzième heure puisqu'on a commencé à compter à zérola première heure c'était minuitdonc la douzième heure c'est 0et bien là c'est pareil mais avec 10donc ici 2et donc ici il faudrait faire exactement la même choseprendre nos indices de lignes et de colonnes
00:56:51 :et rajouter encore des parenthèsesalors comment on va faire ça ?on va rajouter des parenthèses iciet il faut rajouter tout plein de parenthèsesheureusement que j'ai un raccourci pour rajouter des parenthèses correctementet les parenthèses sont importantes dans l'ordre des opérations mathématiquesdonc c'est un truc à noter
00:57:17 :sachant que c'est assez fastidieux mais c'est pas un code non plusvous voyez c'est juste énumérer des cases de la grilleet chaque case iciil va falloir mettremodulo widthet là ça pose la question de comment on a la widthet donc on voit que ça doit être des paramètres supplémentaires
00:57:38 :on doit obtenir dans notre fonctionla largeur et la longueurde notre grilleet donc la ligne d'ailleurs c'est modulo heightet la colonne c'est modulo widthparce que width c'est le nombre de colonneset donc si on dépasse le nombre de colonnes on veut que ça revienne à 0
00:58:01 :d'où le moduloon va mettre tous une cellule par ligneparce qu'elles vont prendre un peu de placeet donc ici il suffitde mettre des modulo heightpartout iciicion peut mettre quelques espaces pour que ça fassejoli comme çaet il faut mettre des modulo width ici
00:58:49 :donc ça on peut le faire d'un seul coup partout icivoilàet encore un petit peumodulo width iciah pardon j'ai changé d'écranun petit modulo width icidonc globalement on a exactement la même choseon a une liste de nos celluleson a bien pris la ligne précédente
00:59:16 :la colonne précédente à chaque foison fait toutes les possibilités de soit ligne précédente soit colonne suivanteet on a mis le petit modulo heightsur toutes les ligneson peut supprimer les parenthèses ici puisqu'elles sont autour de rienmais ça ne change pas grand choseet basiquementon a terminé, on a notre liste
00:59:44 :de toutes les cellules voisineset on n'aura aucun problème au niveau des bordsil faut juste qu'on pense bien à mettre width et heightpuisqu'on a ajouté ces deux paramètres à la fonctioniciil va falloir ajouter les paramètreswidthet heightet comment on va obtenir width et height ?
01:00:11 :width égale length de gridet height égale length de griden 0et pendant qu'on y est on peut les mettre tout au débutplutôt que de réutiliser length de grid et length de grid en 0on peut utiliser directement heightc'est widthet heightce qui me fait remarquer que j'ai failli me tromper
01:00:39 :puisque j'ai inversé ces deux làla hauteur c'est le nombre de ligneset la largeur c'est le nombre d'éléments dans la première lignevoilàici on parcourt les lignes de la grilleon peut enlever ce commentaire qui ne sert pas à grand choseon parcourt chaque cellule de la grille
01:01:01 :on parcourt d'abord les lignes et les cellules dans la ligneensuite on récupère le nombre de voisinsqui dépend de la grille, de notre position dans le parcourset de la taille de la grilleet les celluleson applique la règle sur cette cellule làet ensuite la nouvelle grille
01:01:23 :on la met à jour avec la nouvelle valeur de cellulequ'on a juste calculée avantà la position qui correspond bienje suis en train de me dire qu'un truc qui pourrait être intéressantc'est plutôt de passer width, height en argumenton peut copier ce code làet aller le mettre directement dans la fonction getNeighbors
01:01:44 :parce que la fonction getNeighbors connait la valeur de la grilleça évite d'avoir trop de paramètres pour riença c'est une question de goûton a le choix entre mettre des paramètres pour pas grand choseou bien répéter ces deux lignes de codesachant qu'on les a déjà ici
01:02:02 :ça change pas grand chose honnêtementune fois qu'on a fait toutes les cellules dans le parcoursqu'on les a toutes mises à jour en fonction de la grilledu coup ce qu'on peut faire c'est tester notre codeon a une grille au hasardon affiche cette grilleet on refait du coup
01:02:36 :on l'affiche à nouveauévidemment je me suis planté quelque partmais à part çaon a bien deux grillesalors là on voit le problèmec'est qu'on ne voit pas la différenceentre les deux grilleson voit pas la différence entre les deux grillesparce qu'elles sont un petit peu collées
01:03:04 :on sait pas trop quand l'une s'arrête et l'autre reprenddu coup pour ça il faut revenir sur la fonction printGrillec'est ajouter çaon prend le nombre d'élémentsdans une première ligneet à chaque fois qu'on a un élémenton met un tiré horizontalon va mettre celui-là un peu plus épais
01:03:32 :et encore fois deuxparce que toutes les cellules font deux caractères de largepour qu'on ait des cellules bien carréessinon on a des cellules rectangulairesparce que les caractères sont plus hauts que largeset donc icij'ai oublié de mettreici plusun caractère de retour à la ligne
01:04:00 :sinon il se passe exactement ce que j'ai vu icic'est à dire que notre trait est la première lignec'est pas oufmais une fois qu'on a mis notre caractère de retour à la ligneon a une séparation avant chaque grilleet alors si on veutque ce soit encore un peu plus joli
01:04:22 :on peut faireil va nous laisserdes caractères disponiblespourquoi moins un ?d'ailleurs en fait nonexcusez-moimoins deux icic'est à dire que je vais prendre le nombre de tirés qu'il fallait pour remplir la ligneet je vais lui enlever deuxje sais pas d'ailleurs si vous connaissez la multiplication avec les chaînes de caractères
01:04:59 :j'ai pas pris le temps d'expliquerici c'est le nombre de caractères que prend la grillec'est le nombre d'éléments de la grille fois deuxquand on veut multiplier une chaîne de caractères par un nombreça la répète ce nombre de fois làça va répéter le tiré ce nombre de fois là
01:05:18 :et je fais moins deux pour avoir deux tirés de moinsparce qu'au début je vais ajouter ce caractère làqui a un coude en haut à droiteet à la fin je vais ajouterc'estle coude en haut à droiteet qu'est-ce que ça va faire ?
01:05:42 :qu'est-ce que j'ai loupé ?oui j'ai oublié de mettre un plus iciça va nous fairej'ai pas besoin de mettre moins deux je suis bêtele moins deux ne servait à rienet du coup les parenthèses ne servent à riença c'est pas très graveje vais faire un encadré tout autour
01:06:06 :pourquoi c'est décalé ?pourquoi mon encadré pointe vers une cellule ?parce qu'il faut que chaque lignej'ajoute avant de la ligneune barre verticaleet avant de la fin de la ligneun caractère vertical aussisur chaque ligne j'ai mis la ligneles cellules de la ligne mais avant j'ai mis une barre verticale
01:06:33 :et après une barre verticale et un retour à la ligneà la fin il suffit de recopier ce code làde faire attention à mettre un plus égalsinon on va juste écraser tout ce qu'il y avait avantdans la chaîne de caractèreset retourner ces coudes là pour que ce soit
01:06:51 :et ici on a un joli encadréet on peut enlever ce retour à la ligne làqui ne sert à rienet on a un joli encadré autour de chaque grillemaintenant on peut faire une petite bouclecomme çaon va faire 20 étapeset ici on va avoir l'évolution de chaque grille
01:07:15 :sur 20 étapespour que ce soit un petit peu plus pratique à utiliserce qu'on peut fairec'est mettre un inputpour attendre une entrée de l'utilisateurc'est à dire que j'appuie sur entréecomme ça on voit l'évolution aussi vite que je veuxtout ne s'affiche pas d'un coup
01:07:39 :je dois appuyer à chaque foiset peut être mettre une grille un petit peu plus grandepar exemple iciune largeur de 30et une hauteur de 10comme ça une grille un peu plus intéressanteet si je fais évoluer ma grillevoilà j'ai fait les 30 étapesici au lieu d'un for in range je pourrais faire un while through
01:08:06 :et à la place d'un input on pourrait mettrele fonction sleepsleep en anglais c'est dormirmais du coup c'est juste attendre un certain nombre de tempspar exemple 1 dixième de secondec'est assez pour aller assez viteet on attend 1 dixième de seconde entre chaque affichageet ici on voit nos grilles évoluer selon les règles
01:08:31 :et donc là on est tombé sur une configuration stablesi on relance le code on va peut être tomber sur une configuration qui oscillec'est pas à tous les coupson va peut être mettre une grille un petit peu plus hautepar exemple si je mets une hauteur de 20
01:08:46 :ici on voit les figures dont j'ai parlé au tout débuton a les figures stables, les figures qui oscillentet au bout d'un moment on va peut être aller un tout petit peu plus viteque j'attendrais un petit peu moins d'un dixième de secondemais on a bien la figure qui oscille, le carré tout seul dont je vous avais parlé
01:09:01 :et on arrive bientôt à la finpeut être qu'il y aura des figures qui oscillent à la finbon tant pis, il y a aussi deux carrésdonc voilà, on peut attendre plutôtun demi-dixième de secondece qui est un peu plus rapidecomme ça on voit un petit peu plus l'évolution rapidement
01:09:22 :et ici on est bien arrivé sur une situationoù on a en bas à droite le carré qui oscilleenfin la ligne qui oscilleet d'ailleurs vous voyez bien que la ligne dépasse à droite de la grilleon a le petit point qui clignote à gauchequi vient juste du fait que un coup elle est verticale
01:09:40 :un coup elle est horizontaleet quand elle est horizontale elle dépasse sur la colonne à droitede la grille mais du coup elle revient à gauchepareil, là vous avez deux fois le même motifvous voyez ce motif làil y est deux foismais il y est une fois ici
01:10:01 :et la deuxième fois on voit qu'il dépasse en bas et il revient en hautmais c'est le même motif que celui qui est en baset il y a exactement le même dessindonc on voit bien que notre grilleest reliée en haut et en bas et à droite et à gauche
01:10:16 :comme on l'a fait avec l'opération modulovoilàqu'est-ce qu'on peut faire d'autre ?on peut faire un truc qui est pratiqueparce que là mon écran a une certaine hauteurdonc pour ça il faut utiliser le moduleque je ne me plante pasc'est OS importterminal sizele module OS va comporter
01:10:47 :les fonctions relatives à votre ordinateurque vous vouliez lancer des commandes dans une ligne de commandesque vous vouliez obtenir l'information de quel est votre système d'exploitationetcet donc terminal sizec'est la fonction qui va nous permettrede récupérer la taille du terminalet donc si je ne me trompe pas
01:11:11 :on va fairefrom os importterminal sizeterminal sizeterminal sizequ'est-ce qui ne va pas ?structure using healthterminal sizeholding terminalqu'est-ce que je me suis planté de fonctionimport oshealth de osdésolé je ne sais plus commentterminalterminal sizepas si pourtantah je sais
01:12:19 :à tous les coups c'est parce quec'est get terminal sizec'est parce que terminal size c'est l'objetqui contient la taille du terminalet que pour l'obtenir il faut utiliserget terminal sizeet doncet j'ai dû inverser les deuxdu coupnon c'était bonautant pour moic'est juste qu'il faut une face
01:12:56 :width égale width divisé par deuxdonc je mets un double sagepour que ça reste un nombre entieret moins unparce que je divise par deux parce que je vous rappelle que chaque celluleelle prend deux caractères de largela bordure de notre grille qui prend un caractère à droite
01:13:24 :et un caractère à gauche donc moins deuxet pour height c'est pareil c'est juste égalheight moins deuxet pour éviteralors là je ne sais pas si je vous montre ce qu'il se passesi je mets en plein écranvous voyez qu'en bas il y a mon curseur qui est sur une ligne vide
01:13:46 :et on ne voit pas la bordure en hautpourquoi est-ce qu'il se passe ça ?parce qu'à la fin de ma grille il y a un caractère retour à la ligneet du coup il y a une ligne vide à la finmoi je ne voudrais pas ce caractère retour à la ligne
01:14:01 :dans mon print je vais mettre end égale rien du toutnormalement par défaut end c'est ce qu'il y a à la fin du printà la fin quand vous avez fini de printqu'est-ce que vous mettez comme caractère ? c'est un retour à la ligne
01:14:13 :mais si je mets end égal rien du tout vous voyez ici qu'on voit bien toute la borduresauf qu'apparemment j'ai fait une petite erreurdans ma formule pour calculer le largeurqu'est-ce qu'il s'est passé ?
01:14:25 :pourquoi est-ce qu'elle fonctionne en bas et pas en haut ?c'est pas normal ça ?c'est étonnantlà je ne comprends pasc'est des parenthèses que j'ai mal mises ?
01:14:40 :désolé je ne comprends pas pourquoi elle ne veut pasje pourrai peut être changer à ma ficheest-ce que c'est un problème de ce terminal ?
01:15:01 :je ne vois pas pourquoi elle ne veut pasc'est étonnantça doit être un souci tout bêtequ'est-ce que j'ai fait ?si je refais le code strgridnormalement c'est le caractère strplusfois la longueurla grilleen 0 puisque c'est les lignes2plusdldldl
01:15:57 :dldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldl
01:18:30 :dldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldl
01:21:03 :dldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldl
01:23:36 :dldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldl
01:26:09 :dldldldldldldldldldldldldldldldldldldldldldldldldldldldldrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdr
01:28:43 :drdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdr
Aucune occurrence trouvée pour « ».