Page 2 sur 2

Publié : sam. 10/déc./2005 14:58
par lionel_om
Pour le langage Lisp (dont je parlai un peu plus haut), ca ressemble à ça :

Code : Tout sélectionner

;;; *****************************************************
;;;		Les variables globales
;;; *****************************************************

(defvar *laby*)
(defvar *chemin*)


;;; *****************************************************
;;;		Les quelques fonctions
;;; *****************************************************

;;; initialisation du labyrinthe et MAZ du chemin parcouru
(defun initLaby ()
	(setq *laby* '(
		(E 1 8)(1 2 9 E)(2 3 1)(3 4 2)
		(4 5 3)(5 6 4)(6 7 5)(7 15 6)
		(8 E 9)(9 1 10 8)(10 11 18 9)(11 12 10)
		(12 13 11)(13 14 12)(14 15 13)(15 7 14)
		(16 17 24)(17 25 16)(18 10 26)(19 20 27)
		(20 28 19)(21 22 29)(22 23 30 21)(23 31 22)
		(24 16 32)(25 17 33)(26 18 34)(27 19 35)
		(28 20 36)(29 21 37)(30 22 38)(31 23 39)
		(32 24 40)(33 25 34)(34 26 35 33)(35 27 34)
		(36 28 44)(37 29 45)(38 30 46)(39 31 47)
		(40 32 48)(41 42 49)(42 43 50 41)(43 44 51 42)
		(44 36 52 43)(45 37 53)(46 38 54)(47 39 55)
		(48 40 56)(49 41 50)(50 42 51 49)(51 43 52 50)
		(52 44 51)(53 45 61)(54 46 62)(55 47 63)
		(56 48 64)(57 58 65)(58 59 66 57)(59 60 67 58)
		(60 68 59)(61 53 69)(62 54 70)(63 55 71)
		(64 56 72)(65 57 66 73)(66 58 67 74 65)(67 59 68 75 66)
		(68 60 76 67)(69 61 77)(70 62 78)(71 63 S)
		(72 64 73)(73 65 74 72)(74 66 75 73)(75 67 76 74)
		(76 68 77 75)(77 69 76)(78 70)(S 71)
		(76 68 77 75)(77 69 76)(78 70)(S 71)
	))
	(setq *chemin* nil)
)


;;; renvoi la liste des mouvements possibles à partir du point actuel
;;;	on renvoi 'S, si on est juste à côté de la sortie
(defun mvt_possible (etat_courant)
	(if (member 'S (cdr (assoc etat_courant *laby*)))
		(list 'S)
		(cdr (assoc etat_courant *laby*))
	)
)


;;; Cherche les états atteignables possibles
;;; s'appelle récursivement jusqu'à trouver la sorti (si possible...)
(defun explore (etat_courant etat_precedent)
	;;;(print etat_courant)
	(setq *laby* (remove (assoc etat_precedent *laby*) *laby*))
	(if (equal etat_courant 'S)
		(push etat_courant *chemin*)
		(dolist (x (mvt_possible etat_courant))
			(if (explore x etat_courant)
				(progn
					(push etat_courant *chemin*)
					(return t)
				)
			)
		)
	)
)


;;; Cherche un chemin possible pour sortir du labyrinthe
(defun lance_laby ()
	;;; réinitialise les variables
	(initLaby)
	;;; lance l'exploration + affichages correspondants au résulat
	(if (explore 'E nil)
		(progn
			(print *chemin*)
			"Sortie Trouvee"
		)
		"Sortie non Trouvee"
	)
)

;;; Lance le programme
(lance_laby)
Vous pouvez remarquer que la syntaxe est très particulière...
La base de Lisp est les "Listes" !!! et donc tout ce qui est récursif.
Les listes ce construissent très facilement, mais le reste ... :?

ce code est le résultat de mon TP3 (fais en 20min, montre en main :D) qui consiste en "la recherche de la sortie d'un labyrinthe)

Voici quelques liens
Créateur de niveaux pour le labyrinthe
télécharger Lisp (version gratuite)

Voilà, si vous avez des questions ...

Publié : sam. 10/déc./2005 15:12
par Chris
Purée! 8O

C'est incompréhensible ton langage! (Je parle du LISP, hein! :lol: )

Et il y a beaucoup de gens qui s'en servent, de ce truc?

Publié : sam. 10/déc./2005 15:32
par lionel_om
Bah apparement c'est pas mal utilisé dans l'IA.
En fait, "( .... )" est une liste

Le premier élément est une fonction (sauf pour les listes de données).
Exemple : (remove elt my_list) ;;; enlève l'élément "elt" de "my_list"

généralement une liste est évaluée, fauf si on met un " ' " devant : " '( ...) "
Son évaluation renvoi une valeur (qui peut être stoquée ou non - avec un set, setf, setq par exemple)
Exemples :
(set 'a 5) ;;; a prend la valeur 5
(set 'a '(+ 7 2)) ;;; a prend la valeu 9
On est obligé de mettre un " ' " devant le "a" à la première ligne car il est pour l'instant inconnu. La première ligne peut être remplacée par :
(setq a 5) ;;; : setq = setquote

etc....

Voila les principes de bases.
Si vous êtes intéressés, je peut vous filer les PDF de mes cours...
Sinon vous pouvez trouver des trucs sur le net.
:wink:

Publié : sam. 10/déc./2005 23:13
par LeCyb
Si tu veux je connais pas mal de gens qui ont une intelligence plus qu'artificielle :lol: :lol: :lol:

Publié : dim. 11/déc./2005 17:13
par Ulix
Boujour a tous,

Dobor a écrit :
le voici tout corrigé !!
en purebasic les structures c'est le signe "\" pas le point !
j'ai corrigé d'autre erreur due a la difference des deux languages Very Happy
Et j'ai essayé le code, je n'ai pas compris comment l'utilisé ny les valeurs a lui fournir :oops:

Un exemple d'utilisation serais le bien venu !
Quelqu'un a t-il celà, parce "moi pas avoir beaucoup intelligence" :lol:

merci d'avance.

Publié : dim. 11/déc./2005 21:38
par Backup
je n'ai fait que traduire le code pour l'explication faut aller sur le forum du Dark basic que j'ai donné plus haut !


dans ta signature il manque quelques chose
"La théorie c'est quand rien ne marche et qu'on comprend tout, la pratique c'est quand tout fonctionne et que l'on ne sait pas pourquoi."
Albert EINSTEIN
il manque "ici nous avons reuni les deux la theorie et la pratique, rien ne marche, et personne ne sais pourquoi !" :lol:

Publié : lun. 12/déc./2005 17:41
par Ulix
Bien vu, mon cher Dobro :!:

En plus sans le "ici..." c'est plus court.