MOVE CUBE 3d


(-; Vous avez lu les conventions ? Il vaudrait mieux !... ;-)


Dernière incursion, dans cette Compilation, dans le domaine de la Tortue. Je ne me souviens plus très bien la dernière fois où j'ai adapté ce programme ; était-ce pour Thomson ou pour Atari ?... Ces procédures sont censées produire un effet 3d (cette dernière ne pouvant exister sur un écran 2d, soyons claire) ; un cube "grandit" et "redevient" petit en tournant sur lui même sur toute la surface de l'écran.

POUR CUB :C ;;construisons le cube de taille c
REPETE 4 [AV :C TD 90]
AV :C TD 45 AV :C TD 45 AV :C
TD 135 AV :C RE :C TG 45 AV :C
TD 45 AV :C RE :C TD 45 AV :C
TD 90 AV :C RE :C TD 45 RE :C TG 45
FIN
;;ais-je bien remis la Tortue à sont point de départ et dans la direction (cap) du départ ?!...

POUR TRI_D :C :A ;;jouer avec un, des angle(s)
SI :C > 120 [RECYCLE DONNE "A 30 TC :C :A STOP]
;;ah ce Recycle "d'avant" les Pentium !...
CUB :C NETTOIE TD :A ;;Nettoie : une Primitive à découvrir...
TRI_D :C + 5 :A + 2
FIN

POUR TC :C :A ;;l'effet inverse de la procédure précédente !
SI :C < 15 [RECYCLE FCAP 0 TRI_D :C :A STOP]
SI :A < 10 [DONNE "A 30]
CUB :C NETTOIE TG :A
TC :C - 5 :A - 2
FIN

POUR MC3D ;;movecube3d, banane !
RECYCLE VE CT TRI_D 10 30
FIN


ANNIVERSAIRES


Rêvons un instant de travailler sous Unix sur une station NeXT (fabuleuse machine tout aussi disparue que "l'auteur" de ce message stressant : %DecSystem-20 Not Running% - voir CMIRH) ou Sun ... Le jour dit, le Système nous souhaiterait notre anniversaire au moment de notre connections. Le programme ci-dessous simule cette gentillesse. Si vos machines sont en réseaux, divisez ce programme en deux procédures : OPERATEUR qui indique la date du jour et ENFANT faisant le reste ... Ailleurs, en ces pages, j'offre une version plus récente de ce programme, plus "interactive" et proche des recommandations ci-dessus et, en musique ! Ce qui suit est un programme de base plus proche d'un exercice classique réalisé avec mes élèves.

POUR ANNIVERSAIRE
EC [ENTREZ LA DATE DU JOUR (tel que : 02 02 1947) S.V.P.]
;;avec les machine actuelles, serait-ce toujours indispensable ? En êtes-vous certain ?
DONNE "DATE LL
DONNE "ANNIV PH PREMIER :DATE PREMIER SP :DATE
;;je n'encombre pas avec les tests "mauvais utilisateurs", mais, interdire les
;;manipulations stupides est aussi un bon exercice de programmation !...

VT
EC [ENTREZ VOTRE PRENOM.]
DONNE "P LL EC "
EC [ENTREZ VOTRE DATE DE NAISSANCE (tel que 02 02) S.V.P.]

;;eh oui : ici, nous n'avons rien à faire de l'année...
DONNE "N LL VT
SI EGAL? :N :ANNIV [EC PH PH [JOYEUX ANNIVERSAIRE, ] :P
!
"!] [EC PH [JE N'AI PAS DE MESSAGE POUR TOI AUJOURD'HUI, ] :P
FIN


LOGO, LISP, PROLOG

Avec REFAIRE (voir Sommaire), nous avons déjà pratiqué un exercice classique lorsque l'on aborde LISP, à savoir : re-créer des primitives. Si nous voulions ré-écrire DERNIER de LOGO, nous devrions créer INVERSER (cf. Sommaire) ; alors que c'est déjà une primitive LISP (et pas lips !...). Dans ce langage, ré-écrivons LAST :

Vocabulaire (LISP LOGO) : CAR = PREMIER
CDR (prononcer couder) = SAUFDERNIER
INV = la procédure INVERSER mentionnée

(def LAST (X)
(inv(CAR(INV(X)))))

Cet exemple montre bien l'importance des parenthèses qui n'est pas sans rappeler celle des crochets en LOGO. Chacun connait les similitudes entre ces deux langages ; la démarche proposée de passer de LOGO à LISP n'est pas gratuite...

Lors, oublions tout pour regarder du côté de PROLOG. Je ne vais pas présenter ce langage, mais juste prendre un exemple pour le plaisir de le détourner en LOGO !

Je ne montre pas comment déclarer des règles,
mais juste comment déclarer des faits et voir
ce que l'on peut alors obtenir

(aime (Jean Marie))

?aime (X Y), write (X Y)
;;retourne Jean Marie

?aime (X Marie), write (X)
;;retourne Jean

?aime (Jean Y), write (Y)
;;retourne Marie

Je vous laisse imaginer tout ce que vous pourriez obtenir si vous déclariez :

(aime (Jean Marie))
(aime (Paul Virginie))
(aime (Sylvain Sylvaine))
(aime (Titi Sylvestre))
(aime (Florent Vanessa))
;;oui, bon : là, ce n'est plus d'actualité... ;-)

Allez donc traduire ceci en LOGO !... Par contre, nous pouvons en tirer une idée de programme toute 'philosophique'...

POUR LOVE
EC [ENTREZ UN PRENOM MASCULIN (tel que Jean)]
;;non composé
DONNE "M LL
EC [ENTREZ UN PRENOM FEMININ (tel que Marie)]
;;idem. Je ne teste pas
DONNE "F LL
EC PH PH PH PH PH [PRETENDRIEZ-VOUS QUE] :M "AIME :F "? [(O/N)]
DONNE "A PREMIER LL
;;je ne teste pas
SI EGAL? :A "N [EC "DOMMAGE STOP] [EC PH PH PH PH PH !
[PARTANT, DIRIEZ-VOUS QUE] :F "AIME :M "? [(O/N)]
DONNE "A2 PREMIER LL
;;je ne teste toujours pas
SI EGAL? :A2 "N [EC [NOUS SOMMES D'ACCORD !] [EC PH PH PH !
[TIENS DONC ? POUR MA PART, LA PREMIERE PROPOSITION ENTRAINE !
UNIQUEMENT QUE :F [EST AIME DE] :M]
EC CAR 7
;;ou car 13 ou ec " (rien)....
EC [JE VOUS REMERCIE !...]
FIN


FABLE - I.A.

Ceci est un classique tout comme le plus complexe "Les Missionnaires et les Cannibales", mais aussi, comme HANOI ou NIM (voir Sommaire), un classique en ce qui concerne ce que nous regardons ici : l'Intelligence Artificielle.

L'histoire : Il était une fois, sur les rives d'une rivière, un passeur et sa barque, un loup, une chèvre, un chou. L'homme devait transporter ces trois passagers de la rive gauche à la rive droite. Comment pouvait-il s'y prendre sachant que : il ne peut transporter qu'un passager à chaque voyage et que, s'il n'a rien à craindre du loup, celui-ci aimerait bien manger la chèvre et que cette dernière verrait bien le chou à son menu du jour ? Evidemment : cette histoire est contée (au minimum ainsi) au(x) joueur(s).

POUR BD ;;la base de données comprends des astuces
;;permettant certaines 'économies'...
DONNE "RG "RIVE_GAUCHE
DONNE "RD "RIVE_DROITE
DONNE "X [BARQUE_1 HOMME_2 CHEVRE _3 LOUP_4 CHOU_5]
DONNE "Q1 PH PH PH PH PH [QUE PASSEZ-VOUS DE ] :RG "A :RD
!
[2 ou 3 numéros choisis dans] :X
DONNE "Q2 PH PH PH PH PH [QUE PASSEZ-VOUS DE ] :RD "A :RG
!
[2 ou 3 numéros choisis dans] :X
FIN
;;pas de test pour les joueurs stupides (ne suivant pas les instructions)

POUR DEBUT
VT BD
EC PH PH :X [SONT SUR LA] :RG
EC PH [VOUS DEVEZ LES PASSER SUR LA] :RD
EC [TOUT EN FAISANT ATTENTION A CE QUE :]
EC PH PH ITEM 3 :X [NE MANGE PAS] ITEM 5 :X
EC PH PH PH [ET QUE] ITEM 4 :X [NE MANGE PAS] ITEM 3 :X
EC [Ces gueuletons sont évités par la présence de l'homme
!
auprès des 'prédateurs']
EC []
JEU
FIN

POUR JEU
EC :Q1
DONNE "CHOIX LL
SI NON EGAL? :CHOIX [1 2 3] [EC "NIET JEU STOP] EC "OK J1]
FIN

POUR J1
EC :Q2
DONNE "CHOIX LL
;;précaution d'écraser :CHOIX à chaque fois
;;pour la place mémoire. Sage précaution avant les Pentium et bonne habitude,
;;pour une programmation "propre", élégante, de nos jours ...
SI NON EGAL? :CHOIX [1 2] [EC "NIET J1 STOP] [EC "OK J2]
FIN

Et ainsi de suite avec :

J2 = Q1, si choix = [1 2 5] alors J3
J3 = Q2, si choix = [1 2 3] alors J4
J4 = Q1, si choix = [1 2 4] alors J5
J5 = Q2, si choix = [1 2] alors J6

POUR J6
EC :Q1
DONNE "CHOIX LL
SI NON EGAL? :CHOIX [1 2 3] [EC "NIET J6 STOP]
!
[EC [BRAVO ! TERMINE...]]
FIN

Bien d'autres démarches sont possibles ; survolons-en une en faisant appel à d'autres connaissances :

Nous avons la liste : [homme barque chèvre loup chou] soit :
[H B CH L CX] codifiée ainsi : [1 2 3 4 5]

Conservons le même ordre dans la liste, mais changeons notre codification en utilisant les puissances de 2, nous obtenons :

[1 2 4 8 16] dont la somme est égale à 31

Puis, avec ET et XOU (AND et XOR), voyons les éléments de la liste pouvant aller ensembles (demeurer, voyager sans danger), c'est-à-dire, étant VRAI (égal à 1 ; 0 étant FAUX) :

H AND B = 1
CH XOR L = 1
CH XOR CX =1
CH AND L AND H = 1
CH AND CX AND H = 1

Ce qui entraîne que :

H AND B AND (CH XOR L) = 1
H AND B AND (CH XOR CX) = 1

Ceci est vérifiable avec une table de vérité. Maintenant, allons plus loin dans notre codification :

H AND B -> 1 + 2 = 3
CH XOR L -> 4 = 4 ou 8 = 8
CH XOR CX -> 4 = 4 ou 16 = 16
L AND CX -> 8 + 16 = 24
H AND B AND (CH XOR L) -> 1 + 2 + (4 ou 8) = 7 ou 11
H AND B ANC (CH XOR CX) -> 1 + 2 + (4 ou 16) = 7 ou 19

Nous obtenons ainsi la liste des voyages possibles : [3 7 11 19]

Et celle de ce qui peut demeurer sans danger (sans l'homme) : [4 8 16 24 31]

Et alors ? Nous avons 31 sur la RG, si nous désirons passer la Barque et le Chou qui font 18, ce sera impossible ; 18 n'étant pas membre des 2 dernières listes ci-dessus. Nous tentons de passer la Barque, l'Homme et le Chou qui font 19 ; c'est possible pour la raison inverse !

Cette approche permet une meilleure intéractivité dans le jeu par rapport à l'analyse faite pour le programme donné en exemple plus haut.

Avec PROLOG, nous affinerions encore plus notre analyse et notre jeu serait encore plus interactif. En effet, nous pourrions vérifier si l'Homme est déjà ou non dans la Barque, si la Barque est pleine ou vide, si celle-ci se trouve bien sur telle Rive et non sur l'autre. Et, vérifier que tel élément se trouve à tel endroit et non pas ailleurs (déjà ailleurs), etc.


MAIS CECI EST UNE AUTRE HISTOIRE !...


 

 

 

  Contenu PL

 Sommaire

 Bibliographie