Forums Développement Multimédia

Aller au contenu

Optimisation binaire

CODE Actionscript

58 réponses à ce sujet

#1 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 05 March 2013 - 21:32 PM

coucou;
plein de messages ont sauté.. Monsieur Spi répondant a mon message qui l'encourageait a se pencher sur les opérateurs binaire m' a repondu que pour lui le binaire cest en dernier car c'était de l’optimisation .. J'ai repondu que s'il ne voyait le binaire que pour ca ca ne sert a rien qu'il s'y penche dessus..Lol
Le binaire c'est bien entendu avant tout une autre manière de penser; mais cest bien sur que mon avis; l'optimisation est évidente puisque on parle le langage de lordi.. Sinon merci beaucoup pour tout ce que tu partages



[EDIT Monsieur Spi] voici le sujet d'origine où la conversation commence : http://forums.mediab...environnements/
Pour permettre de parler du binaire (un peu hors sujet pour le topic d'origine) nous avons déplacé ici les message propres à cette discution.

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 March 2013 - 03:46 AM

Re,

Oui on a eu un petit problème de mise à jour, du coup les derniers messages on sauté.

Pour en revenir au problème du binaire, on peut aussi faire tout en binaire, ce n'est après tout qu'une question de traduction, mais dans ce cas on ne parles plus de développement AS mais de développement Binaire... Pour moi il faut s'assurer qu'un algo ou un code marche avant de penser à l'optimiser à mort (en binaire qui est le langage de la machine), c'est pourquoi, pour moi, le binaire fait partie des optimisations finales une fois qu'on est sur que son code marche correctement.

Quand on fait des tutos et des exercices à l'attention des débutants, penser "binaire" de suite est à mon sens une perte de 90% des lecteurs, car après tout si on peut coder binaire, le langage n'a plus vraiment d'importance, tout se fait en binaire et on apprend une nouvelle manière de coder.... Je pense que ça a sa place dans un récap général sur les optimisations à faire (sur lequel je travaille indépendament des exercices) quel que soit le jeu ou le programme, mais pas dans un tuto généraliste qui aborde une méthode précise pour atteindre un objectif. C'est pourquoi, pour moi, le binaire est une des dernières étapes du processus, sencée optimiser à mort l'application, au détriment de la lisibilité du code.

Je pense qu'on est tous d'accord pour dire que le binaire, y a pas plus optimisé, puisque c'est directement le langage que la machine comprend, mais est-ce vraiment l'objectif des exercices ? Ce serait applicable en C++, en Perl, en Python, ou quel que soit le langage en fait, mais ça ne résoult pas les problèmes, ça rationalise le code pour en faire quelque chose de plus optimisé.

Au final, si tu te sent de reprendre mes exercies et en proposer une version optimisée utilisant le binaire, lâches toi, si tu veux utiliser mes exercices comme exemple dans ton tuto sur les opérateurs binaires et en faire un exemple pratique, n'hésites pas. De mon côté j'écris au fur et à mesure une fiche pratique parlant des optimisations et méthodes générales que je n'ai pas abordé dans pour tous les exercices mais qui sont valables pour tous, ça peut aussi servir de complément ou s'inscrire dedans.

#3 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 March 2013 - 14:12 PM

Bonjour,

Voir le messagehubeert, le 05 March 2013 - 21:32 PM, dit :

Le binaire c'est bien entendu avant tout une autre manière de penser

C'est peut-être pas le lieu de parler de ça :rolleyes:, mais pour moi le binaire c'est juste une façon de représenter les données. Je n'ai jamais encore rencontré de situation ou de code où utiliser le binaire change la façon de concevoir un problème. Un nombre binaire me semble l'équivalent d'un tableau de bits qui aurait quelques méthodes spéciales.

Exemple d'une implémentation possible des tuiles d'un labyrinthe avec des objets Tile:

class Tile {
        public var isWall:Boolean;
        public var isDoor:Boolean;
        public var isTrap:Boolean;
        public var isWalkable:Boolean;
        public var apparence:int;
}

var map:Array = new Array();
var tile:Tile;

tile = new Tile();
tile.isWall = true;
tile.apparence = 1;
map.push(tile);

tile = new Tile();
tile.isDoor = true;
tile.apparence = 5;
map.push(tile);

if (map[0].isTrap) trace("Haaaaa ! ");

La même chose pourrait être faite ainsi en stockant les informations des tuiles en binaire:

const WALL:uint = 0x0001;
const DOOR:uint = 0x0002;
const TRAP:uint = 0x0004;
const WALKABLE:uint = 0x0008;
const APPARENCE:uint = 4;

var map:Array = new Array();
map.push( WALL | 1 << APPARENCE );
map.push( DOOR | 5 << APPARENCE );

if (map[0] & TRAP) trace("Haaaaa ! ");

Ou encore ainsi avec un tableau par tuile:

const WALL:uint = 1;
const DOOR:uint = 2;
const TRAP:uint = 3;
const APPARENCE:uint = 4;

var map:Array = new Array();
var tile:Array;

tile = [];
tile[WALL] = true;
tile[APPARENCE] = 1;
map.push(tile);

tile = [];
tile[DOOR] = true;
tile[APPARENCE] = 5;
map.push(tile);

if (map[0][TRAP]) trace("Haaaaa ! ");


(il y a peut-être des erreurs dans mes exemples, ce ne sont que des exemples ;) )

Selon la façon de faire, le code est plus ou moins lisible, concis, optimisé, facile à comprendre, à débugger, à maintenir. Mais je n'y vois qu'une différence dans la façon de stocker les données. Selon les problèmes à résoudre une approche ou une autre sera plus adaptée, chacune aillant des avantages et des inconvénients. C'est mon avis !

#4 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 06 March 2013 - 15:53 PM

Coucou ,
Oui c'est pas trop le lieu lol. Si je te suggérerai le binaire c'était pour toi avant tout , je pense qu une foi assimilé les principe vu comme tu es doué tu en tirerai vite un immense profit .. Lol .
J ai refait le tic tac toe en binaire , le cascade était déjà fait en binaire mais j ai pas le temps de l adopter a AS3 , j ai aussi fait un tetris qui se sert des opérateurs sur le bit

Pour lilive je répondrai plus tard car sur mon tel portable je vois mal le code. à bientôt et bon courage , je ne critique pas du tout ta manière de coder bien entendu , ni l immense boulot que tu nous fait partager . Encore merci

#5 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 07 March 2013 - 10:50 AM

coucou;
bah non.. ca ne sert pas qu'a stocker des données. ca sert a réfléchir autrement. faut justement etre en mesure de voir le problème differement et d'y apporte une solution utilisant le binaire et très souvent ca simplifie le problème..
pour le labyrinthe sur une grille de 31*31 au départ tous les murs sont fermés; il faut donc abattre les murs pour faire un chemin..

le binaire ici va nous servir.. il y a deux manière de faire

les cellule non visitées valent false ( 0) celles visités valent true (1)
si les cellules sont de valeur identique on abat pas le mur les reliant sinon oui on abat un des murs et on change l'identifiant.. c'est tres rapidement le principe..

L'autre méthode est plus globale et fait appel a des identifiants.

#6 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 07 March 2013 - 11:55 AM

Tiens au fait hubeert, j'ai utilisé le binaire pour coder dans un nombre unique le motif formé par une grille de 3x3 tuiles vides ou pleines. Ça se passe dans la classe Tile du code joint à ce post. C'était pratique dans ce cas. Mais j'ai pas eu l'impression d'adopter une manière de penser différente :mrgreen:
On doit pas utiliser les termes "une autre faÇon de penser" pour décrire la même chose ;-)

Voilà, je me force à arrêter ici ce passionnant débat, cela me semble trop hors-sujet dans ce post.

++

#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 07 March 2013 - 12:44 PM

Hello,

Il y a sur le sujet tout un tas de tutos que tu as commencé Hubeert :

http://forums.mediab.../essais/binaire
http://forums.mediab...essais/binaire2
http://ressources.me...essais/binaire3

Pourquoi ne pas les finir en te servir si tu le souhaite de mes exercices pour l'exemple et faire un comparatif des valeurs ajoutées par le binaire sur des exemples précis. Une fois fini (ou même pendant la rédaction), ouvrir un sujet dédié pour qu'on s'en cause à un endroit qui traite spécifiquement du sujet, ce qui permettra de continuer cette discution intéressante dans un endroit approprié.

Je ne remet pas en cause l'intérêt de la chose et je ne dis pas que je ne souhaite pas utiliser le binaire, par contre j'estime qu'il n'a pas sa place (en dehors de ponctuellement pour des opérations de base) dans les exercices que je monte, car ils abordent des méthodes pour résoudre des problèmes et non des solutions d'optimisation (ce qui me semble bien être l'intérêt principal du binaire). Les méthodes d'optimisation sont des choses, à mon sens, génériques qui peuvent être traitées dans une "fiche" dédiée et s'appliquer globalement pour tous les projets.

Je propose donc de clore le débat dans ce sujet à propos de l'usage du binaire, d'ouvrir un sujet à part en liaison avec les tutos que tu as commencé, et venir y causer des implications et choix concernant ce point précis, si vous n'y voyez pas d'inconvéniant.

Ha oui, et comme le rappelle Lilive, il y a aussi l'autre sujet sur lequel on s'amuse autour de la génération de donjon, si tu le souhaite n'hésites pas à venir jouer avec nous là bas et nous proposer des solutions efficaces ;-)

Lien vers le sujet annexe : http://forums.mediab...ost__p__1156463

#8 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 07 March 2013 - 12:48 PM

coucou
C'est pas spécialement hors sujet; si on reste dans l'idée de générer un environnement.
Je sais bien que tu as pas l'impression de penser différemment.. mais de fait tu ne penses pas différemment tu stockes juste de manière différente. En fait lorsque par exemple je réfléchi a la manière d’abattre les murs du labyrinthe je teste la cellule adjacente et je vois qu'elle na pas été visité j'abat donc le mur.. si elle a déjà eté visite je touche rien. comment je le sais ? en me servant des opérateur sur le bit. le résultat est le même la manière de faire et de penser différente; a mon sens lol.

au fait jai pas trouvé ton code dans le poste que tu cites..

ca cest ma map

0000000000
0000000000
0000000000
0000000000 je choisi une cellule au hasard

0000000000
0100000000
0000000000
0000000000 je la visite je la marque comme visitée

0000000000
0110000000
0000000000
0000000000 je regarde autour et je vois la cellule a droite qui a pas la même valeur je peux donc abatte le mur qui les sépare et la marquer visitée..
ainsi de suite.. je dis que je pense différemment parce que j'ai besoin d'infos pour faire le labyrinthe et donc ici je simplifie au maximum pour arriver a cette alternative cellule visitée ou pas? ca correspond a l'etat binaire oui et non vrai ou faux etc..Il y a bien sur d’autre maniére de faire que je ne critique pas du tout.. :smile:

Ceci dit, si tu penses que c'est hors sujet je respecterai bien sur

#9 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 March 2013 - 13:33 PM

Parce que le sujet m'intéresse, j'ouvre et je déplace des messages un peu hors-sujet venant d'une discussion autour du projet de création de labyrinthes par MrSpi.

Je vous laisse lire, je développe mon avis et pose mes questions ensuite :-)

[NB] Je n'arrive pas pour l'instant a rapatrier les messages, merci de re venir plus tard :D

#10 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 07 March 2013 - 14:00 PM

coucou;
merci d'ouvrir un post dédié.
Juste un aparté avant de commencer a parler d'optimisation. En général il y a deux sortes d'optimisation. Celle dite de bas niveau qui consiste améliorer un code qui fonctionne et cela se fait évidement a la fin.
Et une optimisation de haut niveau qui se situe dans le choix de l'architecture du projet et la manière de faire.
Ce que j'appelle penser différemment..
Pour moi l'optimisation binaire doit être de haut niveau, sinon elle ne sert pas a grand chose a part rendre le code difficile a comprendre.
C'est juste un avis

#11 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 07 March 2013 - 14:52 PM

optimisation binaire haut niveau ? tu orientes ton architecture autour d'une logique binaire c'est ça que t veux dire ?

#12 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 March 2013 - 15:12 PM

Voir le messagethot, le 07 March 2013 - 14:52 PM, dit :

tu orientes ton architecture autour d'une logique binaire c'est ça que t veux dire ?
Oui, je crois que c'est ce qu'il veut dire.

Pour commencer, j'aimerais quand même parler d'une des limites qui ne me semble pas anodines.
Je cadre ça sur le débat d'origine : création d'un labyrinthe.

Est-ce que construire à un haut niveau autour d'une logique binaire ne limite pas à un format de 32 x 32 cases ?
ça ne fait pas beaucoup… sachant que dans la logique dont tu parles (la même que celle de MrSpi) les murs sont des 1 et les corridors des 0, on est donc limité à une grille de : 15 x 15 corridors. C'est très peu…
Image attachée: i1.jpg

#13 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 07 March 2013 - 15:17 PM

Coucou ,
Optimisation haute c est a dire a la création du projet . Envisager donc s il s agit de se servir des opérateurs sur le bit , comment faire et avec quoi le faire pour arriver a ses fins. L optimisation peut être sur tout le projet ou uniquement sur un partie du projet . Par exemple dans un jeu se servir des OSB ( opérateur sur le bit) sur un aspect qui le supporte bien.

#14 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 07 March 2013 - 15:47 PM

Didier > normalement sur les jeux à base de tuiles on peut optimiser les maps en binaire par blocs, c'est à dire faire un ensemble de petites grilles reliées entre elles par des entrées/sorties. Cependant pour le cas précis du labyrinthe cela peut poser effectivement des problèmes de cohérence. D'habitude un entier non signé 32 bits suffit pour stocker des blocs de tuiles de 4*8 par exemple. Dans ce cas l'opti binaire peut être effectivement valable à la source (stockage des données en binaire sur un entier 32 bits non signé).

Bon après, moi le binaire c'est pas ma tasse de thé, je ne fais que resortir des trucs que j'ai lu en faisant mes propres recherches ;-)

#15 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 07 March 2013 - 15:57 PM

Voir le messagelilive, le 07 March 2013 - 11:55 AM, dit :

Tiens au fait hubeert, j'ai utilisé le binaire pour coder dans un nombre unique le motif formé par une grille de 3x3 tuiles vides ou pleines. Ça se passe dans la classe Tile du code joint à ce post. C'était pratique dans ce cas.

Voir le messagehubeert, le 07 March 2013 - 12:48 PM, dit :

au fait jai pas trouvé ton code dans le poste que tu cites..
Tu ne vois pas le zip joint ?



Voir le messagehubeert, le 07 March 2013 - 12:48 PM, dit :

En fait lorsque par exemple je réfléchi a la manière d’abattre les murs du labyrinthe je teste la cellule adjacente et je vois qu'elle na pas été visité j'abat donc le mur.. si elle a déjà eté visite je touche rien. comment je le sais ? en me servant des opérateur sur le bit. le résultat est le même la manière de faire et de penser différente; a mon sens lol.

ca cest ma map

0000000000
0000000000
0000000000
0000000000 je choisi une cellule au hasard

0000000000
0100000000
0000000000
0000000000 je la visite je la marque comme visitée

0000000000
0110000000
0000000000
0000000000 je regarde autour et je vois la cellule a droite qui a pas la même valeur je peux donc abatte le mur qui les sépare et la marquer visitée..
ainsi de suite.
C'est intéressant comme faÇon de faire.
On aurait pu faire pareil avec un tableau de valeurs booléennes.
Et du coup comment stockes-tu l'information sur les murs qui sont abattus?

Voir le messagehubeert, le 07 March 2013 - 12:48 PM, dit :

je dis que je pense différemment parce que j'ai besoin d'infos pour faire le labyrinthe et donc ici je simplifie au maximum pour arriver a cette alternative cellule visitée ou pas? ca correspond a l'etat binaire oui et non vrai ou faux etc..Il y a bien sur d’autre maniére de faire que je ne critique pas du tout.. :smile:
J'ai peur qu'on s'enferre avec cette histoire de "penser différemment". Je laisse tomber ce débat-là.
Par contre je reste curieux de ta faÇon d'implémenter le problème.

#16 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 March 2013 - 15:59 PM

Voir le messageMonsieur Spi, le 07 March 2013 - 15:47 PM, dit :

D'habitude un entier non signé 32 bits suffit pour stocker des blocs de tuiles de 4*8 par exemple.
Ça, je comprends dans une optique optimisation des ressources : une grille de 32 zones (que l'on répartit comme on veut : 8*4 ou … ? 16*2 :D )
Par contre, pour naviguer sur les jonctions, Ça peut devenir vite coton. Ce qui explique qu'on se simplifierait la vie avec juste une entrée/une sortie, basta.



Voir le messageMonsieur Spi, le 07 March 2013 - 15:47 PM, dit :

Dans ce cas l'opti binaire peut être effectivement valable à la source
C'est justement là où je ne suis pas d'accord et ou j'espère acquérir quelque chose des connaissances d'Hubert. Une grille 8*2 contenant chacune une grille 32x32, Ça ne me semble pas du tout optimisé "à la source". Au niveau du stockage des données, oui.

#17 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 March 2013 - 16:14 PM

Voir le messagelilive, le 07 March 2013 - 15:57 PM, dit :

C'est intéressant comme faÇon de faire.
Ben justement, moi je ne vois pas du tout. C'est pour moi la même logique (exactement) que celle de Mr Spi. Donc, binaire ou pas, rien n'est simplifié.


J'avais posé des espoirs sur ceci par contre :


Voir le messagehubeert, le 07 March 2013 - 10:50 AM, dit :

les cellule non visitées valent false ( 0) celles visités valent true (1)
si les cellules sont de valeur identique on abat pas le mur les reliant sinon oui on abat un des murs et on change l'identifiant.. c'est tres rapidement le principe..

Ça, je vois très bien comment le faire en binaire, sur tout une ligne d'un coup :

verticalement :
ligne2 = ligne1&ligne3;

horizontalement :
ligne = ligne | ligne<<1 & ligne>>1;

Oui ! Ça serait joli…
Malheureusement, je ne vois pas comment opérer ligne par ligne puisque cela voudrait dire que le labyrinthe serait déjà parcouru et que dans ce cas, toutes les cases (impaires) seraient visitées, donc à1. La formule ouvrirait toutes les portes. Et cela, parce que le stockage 0|1 ne suffit pas a savoir d'où on est arrivé sur une case et vers ou on est parti.

Ce qui me fait dire que je suis d'accord et pas d'accord avec Hubert : choisir d'utiliser le binaire à un haut niveau influence la logique du code elle-même. On ne peut pas utiliser la même logique* que celle de Mr Spi (je peux me tromper, hein… c'est pour Ça que j'attends beaucoup de cette discussion).

Et, au final, je suis aussi d'accord avec toi :

Citation

je reste curieux de ta faÇon d'implémenter le problème


#18 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 07 March 2013 - 16:57 PM

Coucou,
Non il y a pas de limite, si le jeux doit faire plus que 32*32 on saucissonne les variables, en fonction de l intérêt que ça a de le faire , après je ne suis nullement un expert , je veux juste apporter mon expérience , dans l autre post j ai donner une manière de faire un labyrinthe en se servant du binaire mais je ne trouve plus les source .. Lol

#19 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 07 March 2013 - 17:11 PM

Merge des messages entre les deux posts faits ;-)

#20 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 07 March 2013 - 21:31 PM

Huubert tu as vu qu'il y avait déjà un tuto ( pondu par bibi ) sur l'optimisation avec tout un chapitre sur les opérations binaires ? En fait je viens de jeter un coup d'oeil à tes tutos et il se trouve que tu aurais pu combiner les deux ou même finir le dossier sur l'optimisation ( que je n'ai jamais eu le courage ni le temps de terminer )... Qu'en penses-tu ?

#21 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 07 March 2013 - 21:49 PM

Tu fais de gros calcul sur tes maps didier ? Le compilateur JIT utilisé par Flash fait déjà de grosse opti de code, et améliore ton code de lui même.

Sinon utiliser FlasCC et les int, ou tableaux C aura plus d'impacte que d'utiliser des opérations binaires dans Flash. Surtout sur moins de 10000 éléments à traiter.

Pour les hitTest, les QuadTree sont bien plus appropriés à mon sens, car chaque descendant fait diviser par 4 le nombre d'éléments à tester.
Word hard, play hard.

#22 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 07 March 2013 - 22:48 PM

coucou
j'ai retrouvé le lien(je crois) qui m'avait donné l"idée de l’implémentation en binaire; vous comprendrez mieux; je pense l'idée..
http://fr.wikipedia....27un_labyrinthe

j'ai pas vu ton tutot sur l'optimisation ( peut mette le lien stop?)
et pour lilive javais pas téléchargé le zip.. :oops:

demain je posterai la théorie sur l’implémentation de tel procédés pour faire un labyrinthe; mais j'ai pas fait en vrai (en code) car pour mon jeu la problématique etait différente et plus simple; mais sans douta plusieurs on va y arriver lol..

#23 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 March 2013 - 23:04 PM

Voir le messageGalacta, le 07 March 2013 - 21:49 PM, dit :

Tu fais de gros calcul sur tes maps didier ? Le compilateur JIT utilisé par Flash fait déjà de grosse opti de code, et améliore ton code de lui même. Sinon utiliser FlasCC et les int, ou tableaux C aura plus d'impacte que d'utiliser des opérations binaires dans Flash. Surtout sur moins de 10000 éléments à traiter. Pour les hitTest, les QuadTree sont bien plus appropriés à mon sens, car chaque descendant fait diviser par 4 le nombre d'éléments à tester.

:-) Hello Galacta.

En fait, qu'il y ai de gros calculs ou pas, c'est plutôt l'aspect logique qui m'amuse (d'autres font des mots-croisés…) et les perfs ne sont qu'une conséquence. Alors la taille de la map, je ne crois pas que ce soit très important. Je construit déjà un labyrinthe de 64 par 32 en quelques millisecondes sur mon poste de travail, alors il n'y a pas de gêne.

Par contre, j'ai déjà vérifié qu'une bonne gestion du binaire à de l'importance. Quand je pousse 1 million de pixels dans une fontaine ou quand je ballade une caméra dans un gros voxel par exemple… Alors, le sujet m'intéresse. Surtout qu'en Math sup. je touche pas une bille, mais qu'en logique simple, genre oui/non, je suis assez à l'aise.

#24 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 March 2013 - 23:39 PM

Voir le messagehubeert, le 07 March 2013 - 22:48 PM, dit :

j'ai retrouvé le lien(je crois) qui m'avait donné l"idée de l’implémentation en binaire; vous comprendrez mieux; je pense l'idée..
http://http://fr.wik...27un_labyrinthe

Dans les notes en bas de page il y a un lien vers ici
C'est un peu dur parce qu'en anglais mais je le trouve intéressant.

Pour les 2 méthodes citées par wiki, la seconde est celle utilisée par MrSpi.
La première est "rigolotte" mais je ne vois pas comment en faire une version optimisée, à part taper des points au hasard jusqu'à en trouver un bon. Je ne crois pas trop a son efficacité.

J'attends donc demain avec impatience. :-)

#25 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 08 March 2013 - 00:30 AM

coucou;
beh si la seconde est celle utilisée par Monsieur Spi; je vois pas trop l’intérêt de proposer une autre solution. sauf peut etre de faire différemment avec les OSB.. Sinon la première solution est très intéressante je trouve; mais ca s'eloigne un peu de lidée du binaire quand même. ma proposition n'est que implémentation théorique avec les OSB. je te la propose car j'aime bien ta curiosité; et parceque j'aime bien la curiosité saine lol.; ca permet d'aller plus loin je trouve. ceci dit ne t'attend pas au code du siecle pour faire un labyrinthe; cest juste des bases sur lesquelles je serai parti; rien de plus.;

#26 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 08 March 2013 - 08:09 AM

coucou
Donc voici la théorie , sans doute améliorable de la fabrication d'un labyrinthe en OSB ( opérateur sur le bit)
Pour simplifier la vision humaine des chose je me sers en général de deux serie de variable une par ligne et une par colonne j'ai donc par exemple 31 ligne et 31 colonne elles valent 0 et tous leur bit sont a zéro.Mais ici un série de 31 ligne suffiront
je choisis au une ligne par exemple la ligne 16 et toujours au hasard un bit qui représente une case; par exemple le bit 5 faut que je dise a lordi la case 5 de la ligne 16 vient d'être visitée pour cela je vais basculer le bit 5 de false a true de 0 a 1

pour cela je me sers de l'OSB or noté ainsi |

ici deux maniere de faire soit je me sers de L OSB << qui decale le bit a gauche et qui multiplie le nombre par une puissance de 2 ou Math.Pow(base, puissance) qui est plus parlant mais bouffe plus de ressource.

donc
ligne16 |= 1<< 5
ou ligne16 | = Math.Pow(2,5) ca egale 32 en décimal et 100000 en binaire

on voit bien que le bit 5 ( on part toujours de zéro de la droite a la gauche) est a 1

pour le voir faire trace(ligne16.toString(2))

le pauvre petit bit actif est tout solitaire au milieux d'une mer de zéro; il veux se faire un copain et le cherche il a 4 direction possible haut bas droite gauche. il décide de partir au hasard a gauche mais il y a un mur il sait qu'il a le droit d'abattre le mur a la seule condition que le bit de l'autre cote du mur soit un bit inactif et qui vaut 0..

pour ce faire il se sert de l OSB & qui va tester si le bit a son cote est a 0 sinon il peut pas abattre le mur..

lui c'est le bit 5 donc il sait que son camarade a gauche sur la meme ligne c'est le bit 6 ..

et pour tester il écrit

si( ligne16 & 1<< 6) abat le mur qui nous relie

donc trace( ligne16 & 1 << 6 ) donne bien 0 le bit est inactif j’abats le mur et je le rends actif

ligne16 |= 1<<6 voila et ainsi de suite..

ensuite du bit 6 de la ligne 16 on choisi une direction au hasard par exemple bas

il faut donc tester la ligne17 avec le bit 6.

Voila la théorie en réalité je l'ai pas implémenter ... yapluqua

#27 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 08 March 2013 - 10:44 AM

Mmmmmmm… Je suis dubitatif…


En résumé :
que tu fasses :

ligne[16][6] = 1; // Méthode tableau 2d
ou
ligne[16*32 + 6] = 1; // Méthode tableau 1d
ou
ligne16 |= 1<<6; // Méthode binaire


Il n'y a pas de différence logique à la méthode :
- liste des voisines possibles
- choix d'une voisine
- abattre le mur
- modification de la valeur de la cellule visitée

Le binaire n'influence aucunement l'algorithme.
Tu choisis un stockage de données différent, tu les modifies et y accède avec les commandes appropriées. Jusque là, rien de nouveau.
Ce qui m'intéressait moi, c'était plutôt …

Voir le messagehubeert, le 07 March 2013 - 14:00 PM, dit :

Pour moi l'optimisation binaire doit être de haut niveau, sinon elle ne sert pas a grand chose a part rendre le code difficile a comprendre.
C'est juste un avis.
… et pour l'instant, je ne vois pas. Je commence même à pencher peu pour le contraire : si tu as raté le début du sujet, si tu n'as vu que le labyrinthe, il y a aussi la création de salles à l'intérieur du labyrinthe, la création de portes et le dépôtt de cléfs sur les sections du labyrinthe atteignables par le jour, porte fermée.

Autant de sections de code ou tu vas te retrouver à jongler avec des opérations binaires, ce qui rend le code un peu plus difficile à comprendre partout… alors qu'une optimisation pour stockage par exemple ne compliquera qu'une section du code.
Alors, s'il n'y a pas un avantage algorythmique, je doute de l'intérêt. Au moins pour mon cas.
Celui qui est à l'aise avec le binaire et le lit couramment, c'est différent. :-)

#28 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 08 March 2013 - 12:26 PM

coucou;
jai pas trop d'argument a t’opposer lol; vu que je ne me suis pas pencher sur le problème.J'ai balancer l'algo en vrac sans trop refelchir. pour le haut niveau faut penser a tout , avant de coder.
deja faut je fasse un labyrinthe potable.. lol et puis comprarer la vitesse d'excution pour savoir si ca optimise ou pas..

#29 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 09 March 2013 - 22:23 PM

Hello !

De mon point de vue, ce genre d'optimisation n'a d'intérêt que lorsque toutes ces conditions sont remplis :

- on est dans un enterFrame
- on applique un calcul sur un très gros groupe d'objet

ou
- si on fait du traitement de couleur sur un grand nombre de pixels

On peut évidemment l'utiliser dans d'autre cas, mais typiquement dans le contexte du labyrinthe, ça n'a pas d'intérêt car dans le pire des cas et en voyant très large, ça va prendre 20 ms pour le construire normalement. Admettons qu'avec le binaire, cela mette 10 ms, au final, tout ce qu'on aura gagné c'est 10ms lors de l'utilisation de l'application : cela n'a aucun impact sur l'utilisateur ; par contre c'est beaucoup plus difficile pour le développeur qui risque de perdre beaucoup beaucoup plus que 10 ms à lire/comprendre le code, et ce plusieurs fois pendant tout le développement :)

#30 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 10 March 2013 - 13:53 PM

coucou;
j'ai un peu réfléchi au problème ce matin et j'ai réussi a créer mon labyrinthe avec les OSB; Difficile de savoir si ca optimise pour le moment; car d'une part c'est en AS2 et d'autre part ma fonction n'est pas optimisée du tout; la seule chose certaine a vue de nez c'est que le code est beaucoup plus court (25 lignes)..
je le joins pour faire voir le principe.( c'est un des principes; car je pense qu'on peut faire differement)


choix=Math.pow(2,15)
grandeurLabyrinthe=gL=Math.pow(2,15)+1
t=0;
function traceTraitHorizontal (i,nom,val){
for( var j=0;j<16;j++) {
  if (val & 1<<j ) {trait=attachMovie(nom, nom +(i+1 * j), t++);
  trait._x+= 100+(50 * j);
  trait._y=30+(50 * i)
  if( j==1 && nom=="traitHorizontal" && i!=7 && i!=9 && i!=12) {trait._x-=50}
  if(nom=="traitVertical" && i==12 && j!=0 &&j !=6&& j!=8) {trait._y +=50}
}}}
function faireLabyrinthe (){

traceTraitHorizontal (0,"traitHorizontal",gL-2)
traceTraitHorizontal (0,"traitVertical", q=gL| random(choix))
for (var h=1; h<14;h++){
traceTraitHorizontal (h,"traitHorizontal",~q)
traceTraitHorizontal (h,"traitVertical", q=gL | random(choix))
}
traceTraitHorizontal (14,"traitHorizontal",~q)
traceTraitHorizontal (14,"traitVertical",  gL)
traceTraitHorizontal (15,"traithorizontal", gL-2)}
faireLabyrinthe()
 

Fichier(s) joint(s)



#31 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 March 2013 - 14:01 PM

Chacun fait comme il veut...
Moi je ne ferais pas comme ça ! :D

PS:

for( var j=0;j<16;j++) {
 
serait plus optimisé sous cette forme

var j:Number;
for( j=0;j<16;j++) {
 
même en AS2

++

#32 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 10 March 2013 - 14:07 PM

coucou;

:eusa_doh: meuh.. je savais pas lol. merci de ton intervention. ;-)

#33 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 March 2013 - 14:26 PM

(ceci dit, dans ton cas - une itération allant de 0 à 16 - , la différence ne sera pas transcendante :) )

#34 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 10 March 2013 - 14:29 PM

coucou;
mais cest pas idiot jai tout typé et je gagne 15% a vue de nez..

#35 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 March 2013 - 16:01 PM

dans le bout de code indiqué plus haut, le typage joue moins que le fait de créer une variable une seule fois et de s'en resservir 16 fois (au lieu de créer 16 nouvelles variables)

(pas sur de moi sur ce coup là)

#36 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 10 March 2013 - 18:57 PM

Salut,

Si tu pouvais expliquer un peu ton code hubeert ce serait super.
En l'état je n'arrive pas à le lire.
Je parle surtout de la démarche générale, pas la peine je pense d'expliquer chaque détail de l'usage que tu fais des OSB.

#37 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 10 March 2013 - 21:19 PM

Une petite réaction concernant la déclaration des variables hors boucle en AS2.

D'abord, dans un code propre, je préfère nettement déclarer les variables en début de fonction, en dehors des boucles etc. (même s'il m'arrive de donner des codes brouillons sur le forum avec des variables déclarées au fur et à mesure).

Ensuite, pour le "for(var...", selon moi, la variable n'est déclarée qu'une fois (je préfère moi aussi la déclarer avant, mais c'est juste d'un point de vue propreté).

Considérons enfin le cas d'une variable déclarée dans une boucle :
Pour l'AS2 (je ne parle pas de l'AS3 car tout est remonté en début de fonction), j'ai souvent lu que la première raison de déclarer hors boucle était l'optimisation... sauf que je ne l'ai jamais constatée cette optimisation.
Ces deux codes donnent exactement le même temps moyen :
this.onEnterFrame=function()
        {
        var nb_:Number=getTimer();
        var i:Number=-1;
        var j:Number;
        while(++i<500000) {j=i;}
        tx_.text=getTimer()-nb_;
        }
this.onEnterFrame=function()
        {
        var nb_:Number=getTimer();
        var i:Number=-1;
        while(++i<500000) {var j:Number=i;}
        tx_.text=getTimer()-nb_;
        }

Auriez-vous un autre exemple montrant une optimisation ?

Et concernant le typage en AS2, il me semblait que c'était plus pour éviter des erreurs que pour un quelconque gain de performance...
nelchael.fr freelance flash CS6

#38 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 March 2013 - 00:25 AM

coucou;
je pense aussi que ca ne change rien on ne déclare pas la variable 16 fois dans la boucle ca reste une légende de AS a mon avis.Le gain est plus important selon qu'on emplois des uint ou int ou Number selon le cas si c'est mal approprié d’après les exemple de T. Imbert et en AS3.
Le code est fait a l'arrache un peu est n'est pas optimisé car j’emploie une fonction plusieurs fois que ce soit dans une boucle ou codée en dur, ce code en l’état est plus long a exécuter que celui monsieur Spi parce que je me sers de méthode d'affichage dévolues a L'AS2, sans les méthodes d'affichage (juste le calcul de la grille) il est est quand même plus long a exécuter :smile:/&gt; ; mais il faudrait l'optimiser et l’écrire en AS3 pour comparer.
je suis vraiment désolé lilive c'est pas évident a expliquer; la première et la dernière ligne sont des constantes.(les limites)
le principe c'est que a la deuxième (verticale) ligne je lui dit choisi des cases a remplir au hasard et je m'assure qu'il mettra a coup sur un 1 au début et a la fin (avec le | )
la ligne suivante (horizontale) je lui dit fait exactement avec le contraire le tilde ~ ce qui m'assure qu'il ne va pas "boucher" mon chemin.
comme il est "bête" dans le sens il fait que ce que je lui dit je le force un peu avec des conditions dans certains cas.
je suis clair en l'etat ce code ne fait pas les choses "plus vite"; il les fait "différemment "; ca me semble plus "simple" et c'est ce que je veux dire

#39 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 00:56 AM

Hello.

Je décortique et je commence a comprendre.

En fait, pas de logique de labyrinthe parfait mais un choix effectivement binaire : si j'ouvre horizontalement, je ferme verticalement et l'inverse.
Ça te pose 2 soucis :
- quoi faire de la première (ou dernière) ligne/colonne.
- les chemins créés ne sont pas ouvert, tu en force donc quelques uns.

J'ai traduit en AS3, mais j'ai tout cassé ensuite à essayer de jouer. Je recommencerai plus proprement demain.
Je vois pas mal d'optimisations possibles dans le code mais pas tout a fait de solution…

Intéressant… Je ne sais pas si l'on peut ensuite travailler sur des salles et le dépôt des clés, (c'est encore bien flou dans mon esprit) mais je suis curieux d'aller gratter encore un peu sur ce terrain. :-)

#40 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 11 March 2013 - 01:00 AM

Nelchaël, en fait il est plus optimisé de coder :

var i:int = 0;
for(;i<max;i++){}
 

Pour voir les diferences il suffit d'installer le swfInvestigator (labs.adobe.com), c'est bien de l'optimisation mais rien a voir avec l'utilisation du binaire pour optimiser des calculs qui seront eux aussi retranscrit pour être peut être mal interpreté par la suite .... :)

#41 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 March 2013 - 01:41 AM

coucou,
bof dldler tu pinailles la lol..Ca marche je force rien; comme je dois ouvrir la porte d'entrée et de sortie je mets des conditions pour le faire, comme faire le contraire ne peut pas etre du, pour certain bit, au hasard, je le code ; comme je ne peux pas coder la première ligne et la dernière au hasard je le fait en dur ; c'est tout ; comme je suis obligé que que chaque ligne commence par un mur vertical et finisse par un mur vertical je le fais ce sont mes seules contraintes.
le labyrinthe n'est pas parfait dans le sens ou il n'y aurait qu'une seule solution, mais dans le sens qu'il y a au moins une solution (voir plus) ca marche

#42 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 08:04 AM

Bonjour Hubert.

Mais non je ne pinaille pas :-D
Désolé si le mot "parfait" t'as fait penser ça. C'est juste le nom d'un genre de labyrinthe, pas une critique. Je trouve intéressant ta façon de faire parce que tu es arrivé à une version ou le binaire impose justement ses avantages et ses contraintes et c'est bien ce qui m'intéressait. Quand on est libre de son cahier des charges, ça peut devenir rigolo et même déclencher des idées…

Là où je pinaillerais quand même :-D c'est sur la résolution du labyrinthe. Dans tous les cas il faut aller tout droit puis à gauche au fond…
Avoir à gérer la première et la dernière ligne en dehors de la boucle, ce n'est pas un souci, mais quand même on doit pouvoir faire mieux.


Sinon, je joue avec une version AS3, traduction de ton code à la base…
J'ai changé le principe pour ouvrir un peu plus de portes que nécessaire, peut-être trop et j'ai un autre souci sur les bords, avec des cases inaccessibles. Mais le code est simple.
Pour l'instant, j'arrive à ça :



- Afficher le SWF -
Fichier joint  lab bin 3.swf   1.16 Ko   35 téléchargement(s)

var datas:Array= [];
var labyrinthe= graphics;
var largeur:int= 60;
var hauteur:int= 31;
var bits:uint= 1<<hauteur;
var e:int=8;
var murs_h:uint, murs_v:uint, _x:int, _y:int, id:int;
labyrinthe.lineStyle (e*.5,0x7F7F7F);
labyrinthe.drawRect (0,0,e*largeur,e*hauteur);

for (_x=0; _x < largeur; _x++){
  datas[_x] = [Math.random()*bits,Math.random()*bits | Math.random()*bits];
  murs_h =  datas[_x][0] & datas[_x][1];
  murs_v = ~datas[_x][0] & datas[_x][1];
  for (_y=0, id = 1; _y < hauteur; _y++, id <<= 1){
   if (murs_h & id){
        labyrinthe.moveTo (_x * e, _y * e);
        labyrinthe.lineTo (_x * e + e, _y * e);
   }
   if (murs_v & id){
        labyrinthe.moveTo (_x * e, _y * e);
        labyrinthe.lineTo (_x * e, _y * e + e);
   }
  }
}


#43 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 March 2013 - 10:16 AM

coucou;
Un grand Bravo,

jai pas exploré le code; mais ca va 10 fois plus vite. Donc au point de vue optimalité (d'un point de vue rapidité) tu as déjà réussi.

Reussi aussi car en 30 ligne tu fais un labyrinthe.

Le seul bémol (que je vois) est le cadre qu'on ne peut ouvrir pour le moment.

Oui mon code est loin d'etre parfait; ca vient aussi beaucoup que j'ai la contrainte de gerer les murs de cloture ( limites)
ce que tu as résolu par le cadre
je n'ai pas essayé mais plutôt que de faire un cadre ne serait il pas plus judicieux de placer 8 lignes; 2 par cote qui permettrait d'ouvrir un portela ou l'on veut?.
De toute facon en grattant on (tu) vas y arriver; j'en ai l'intuition.Bon courage et merci de ton aide

#44 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 10:42 AM

Salut Hubert.

J'aimerais bien revenir sur ton code pour voir maintenant si je trouve comment l'améliorer.
J'ai l'impression qu'il y a quelques trucs en trop… mais c'est encore embrouillé dans mon esprit.
Ce code par exemple, me semble faire le trait de contour supérieur en ouvrant une porte au bit 2 :

traceTraitHorizontal (0,"traitHorizontal",gL-2)
 
Pourquoi le refaire alors en ligne 15 ? Sur le labyrinthe il n'y a pas d'ouverture en bas, mais sur le côté… Sans doute un chevauchement de lignes non ?

Et je bute surtout sur ces 2 lignes :
  if( j==1 && nom=="traitHorizontal" && i!=7 && i!=9 && i!=12) {trait._x-=50}
  if(nom=="traitVertical" && i==12 && j!=0 &&j !=6&& j!=8) {trait._y +=50}

Peut-tu m'expliquer la logique des valeurs 12, 0, 6, 8 ? 1, 7, 9,12 ?



Pour les pistes pour faire un labyrinthe parfait, si toi ou quelqu'un d'autre en veux encore, en poursuivant la logique binaire, il y a celles-ci :
  • Créer des trous dans les murs horizontaux uniquement avec la méthode binaire brutale
  • Parcourir le labyrinthe :
    • rechercher les voisines :
      • horizontales ? il faut qu'il n'y ai pas de mur
      • verticales ? si les cases ne sont pas déjà visitées
    • si au moins une voisine : choisir une voisine au hasard
      • si voisine verticale : ouvrir le mur
      • (si voisine horizontale, rien)
      • avancer sur la voisine
    • si pas de voisine, revenir en arrière

C'est un mélange entre la logique utilisée par MrSpi et la tienne : on génère les murs horizontaux de façon rapide et aléatoire, mais on génère les murs verticaux en respectant la logique du labyrinthe parfait. ça pourrait marcher…


Une autre version :
Quand on fait au plus simple :
var datas:Array= [];
var labyrinthe= graphics;
var largeur:int= 20;
var hauteur:int= 10;
var bits:uint= 1<<hauteur;
var e:int=20;
var murs:uint, _x:int, _y:int, id:int;
labyrinthe.lineStyle (e*.5,0x7F7F7F);
labyrinthe.drawRect (0,0,e*largeur,e*hauteur);

for (_x=0; _x < largeur; _x++){
   datas[_x] = [murs=Math.random()*bits];
   murs =  datas[_x][0];
   for (_y=0, id = 1; _y < hauteur; _y++, id <<= 1){
        if (murs & id){
   labyrinthe.moveTo (_x * e, _y * e);
   labyrinthe.lineTo (_x * e + e, _y * e);
        }
        else
        {
   labyrinthe.moveTo (_x * e, _y * e);
   labyrinthe.lineTo (_x * e, _y * e + e);
        }
   }
}
…on obtient une version très avancée de la méthode de fusion des chemins
Je ne vois pas trop comment identifier les zones puis les réunir par destruction d'un mu, mais peut-être que quelqu'un d'autre pourrait avoir une fulgurance…

De mon côté je vais avoir moins de temps maintenant que ma tribu est rentrée, mais ça me titille encore assez pour que je trouve un peu de temps…


PS : pour les entrées sorties : si toutes les cases du labyrinthe sont accessibles, on peut choisir l'entrée et la sortie au hasard. Et dessiner par dessus le cadre si on veut visualiser la sortie, mais ce n'est pas une obligation. Un point sur la case suffit.

#45 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 10:58 AM

Bon, une dernière intuition, mais après if faut que je bosse …

En fait on a très simplement un labyrinthe parfait (mais…).

J'ai tilté à propos du chevauchement que je soupçonne sur ton labyrinthe et du coup, j'ai vérifié sur le mien en mettant de la transparence à mon tracé : j'ai aussi un chevauchement, en première ligne et première colonne. Normal.
Mais si on dessine le cadre une ligne, une colonne plus tôt, on obtient un labyrinthe parfait.
Comme ceci :
var datas:Array = [];
var labyrinthe = graphics;
var largeur:int = 20;
var hauteur:int = 10;
var bits:uint = 1 << hauteur;
var e:int = 20;
var murs:uint,_x:int,_y:int,id:int;
labyrinthe.lineStyle (e*.5,0x7F7F7F,.5);
labyrinthe.drawRect (-e,-e,e*largeur+e,e*hauteur+e);

for (_x=0; _x < largeur; _x++)
{
  datas[_x] = [murs = Math.random() * bits];
  for (_y=0, id = 1; _y < hauteur; _y++, id <<= 1)
  {
   if (murs&id)
   {
        labyrinthe.moveTo (_x * e, _y * e);
        labyrinthe.lineTo (_x * e + e, _y * e);
   }
   else
   {
        labyrinthe.moveTo (_x * e, _y * e);
        labyrinthe.lineTo (_x * e, _y * e + e);
   }
  }
}



- Afficher le SWF -
Fichier joint  essai_2.swf   1.43 Ko   23 téléchargement(s)

Souci : l'arbre logique est très reconnaissable avec ses 2 grandes branches sur la première ligne et colonne. Faudrait plus que trouver un truc pour briser ça… (edit : et les chemins sont quand même très "diagonaux"… ce qui enlève un peu d'intérêt à la résolution)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)