Site hosted by Angelfire.com: Build your free website today!
Retour au sommaire
Activité précédente : L'interface, les boutons le terrain de jeu du morpion.
Activité suivante :    Labyrinthe 1, le dessin.

18. Le jeu des allumettes, l'ordinateur apprend.

Matériel informatique:

Notions:

Notions Windows :
Editeur.

Notions opératoires :
Commandes : si  ec mot donne chose  

Opération : lismot  hasard vide?


Objectif élève :

Faire un programme pour jouer au jeu des allumettes.

Objectif pédagogique :

Introduire les notions d'algorithne, de stratégie.

Consigne :

Faire un programme pour jouer au jeu des allumettes.
 

Réalisation :

Règle du jeu:
On part d'un tas de n allumettes, chaque joueur en retire à son tour une, deux ou trois, celui qui prend la dernière a gagné.

Initialisation:
La procédure allumettes <nombre d'allumettes> formera le tas d'allumettes. 
La mémoire :tot contient le nombre d'allumettes.

pour allumettes :n
donne "tot :n
end

1.- L'ordinateur joue au hasard.

Le jeu sera divisé en deux procédures:


A la fin de chaque procédure, on appelle la procédure adverse.

Si après avoir joué, le total est zéro, il y a victoire et le jeu s'arrête.

Procédure   joueur.

Pour saisir la réponse du joueur on utilise la primitive lismot qui ouvre un fenêtre de dialogue et retourne le contenu de la zone de saisie comme un mot.

Les procédures peuvent avoir des données facultatives, qui ont une valeur par défaut (au départ), on peut aussi considérer ces données comme des variables initialisées.

Pour définir une donnée facultative, il faut donner dans la ligne de titre une liste avec le nom de la variable suivi d'une expression donnant la valeur par défaut. exemple : pour joueur [:n lismot] (n recevra le résultat de lismot, ce que l'on aura écrit dans la fenêtre de saisie.)
 

pour joueur [:n lismot]
donne "tot :tot - :n
(ec [vous jouez] :n [il reste ] :tot)
si :tot = 0 [ec [Voua avez gagné] stop ]
ordi
end
 
Procédure ordinateur.
Si :tot est inférieur à 4. l'ordinateur joue le nombre d'allumettes restantes (et gagne), sinon l'ordinateur joue au hasard un nombre de 1 à 3 .
 
pour ordi
sisinon :tot < 4 [donne "ordi :tot][donne "ordi 1 + hasard 3]
donne "tot :tot - :ordi
(ec [je joue ] :ordi [il reste ] :tot )
si :tot = 0 [ec [j'ai gagné] stop]
joueur
end


! Ouvrir l'éditeur avec le bouton programme et définir les procédures.
! Dans le commander:
allumettes 15
joueur (ou ordi si l'ordinateur doit commencer).

On peut améliorer la procédure joueur en introduisant un contrôle sur la validité de la saisie.
Une entrée vide provoque l'arrêt de la partie avec le message abandon.
Un nombre supérieur à 3 ou inférieur à 1 ou une donnée autre qu'un nombre provoque une nouvelle saisie.
 

pour joueur [:n lismot]
si vide? :n [ec "Abandon stop]
si (ou :n > 3 :n < 1 non nombre? :n) [ joueur stop]
donne "tot :tot - :n
(ec [vous jouez] :n [il reste ] :tot)
si :n = 0 [ec [Vous avez gagné] stop ]
ordi
end


2.- L'ordinateur apprend.

A chaque nombre, on peut jouer 1, 2 ou 3.
Pour chaque nombre, on va mettre en mémoire une liste [1 2 3], si l'ordinateur perd, il enlève de la liste le nombre qui l'a fait perdre.
Si une liste devient vide, c'est que cette position est perdante, l'ordinateur jouera alors au hasard et avertira qu'il peut perdre.

La procédure init met associe la liste des coups possible : [1 2 3] à chaque nombre de 1 à :max .
Les mémoires recevant la liste seront nommées c1 c2 c3  ...
Les noms c1, c2, c3 ... sont construits avec l'expression mot "c compteur .
Le rapporteur compteur donne le nombre de répétitions déjà effectuées y compris la répétion en cours.

L'expression mot "c :tot + :ordi + :n donne le nom de la mémoire correspondant au dernier coup joué par l'ordinateur. (:tot est la position actuelle, :n les allumettes enlevées par le joueur,  :ordi celles enlevées par l'ordinateur.
Ainsi :tot + :n + :ordi donne le nombre d'allumettes au tour précédent de l'ordinateur.
Et mot :tot + :n + :ordi donne le nom de la mémoire contenant la liste des coups possibles au tour précédent .

pour init :max
repete :max [donne mot "c compteur [ 1 2 3 ] ]
end


La procédure perte enlève le dernier coup joué.

pour perte [:coup mot "c :tot + :ordi + :n]
si vide? chose :coup [stop]
donne :coup sp chose :coup
end


La procédure ordi devient:

pour ordi [:coups chose mot "c :tot]
sisinon vide? :coups ~
    [ec [En jouant bien vous gagnerez] donne "ordi 1 + hasard 3]~
    [donne "ordi premier :coups]
donne "tot :tot - :ordi (ec [je joue ] :ordi [il reste ] :tot )
si :tot = 0 [ec [j'ai gagné] stop]
joueur
end


Dans la procédure joueur il faut exécuter perte quand le joueur gagne.

La procédure joueur devient.
 

pour joueur [:n lismot]
si vide? :n [ec "Abandon stop]
si (ou :n > 3 :n < 1 non nombre? :n) [ joueur stop]
donne "tot :tot - :n (ec [vous jouez] :n [il reste ] :tot)
si :n = 0 [perte ec [Vous avez gagné] stop ]
ordi
end
 
Si l'on examine les mémoires après un grand nombre de parties, il y a des listes vides pour chaque multiple de 4.
Ce sont les positions perdantes. Conaissant la solution du problème, on peut programmer l'ordinateur pour appliquer cette règle.

3.- L'ordinateur cherche à laisser le plus proche multiple de 4
 

pour ordi2
donne "ordi reste :tot 4
si :ordi = 0 [donne "ordi 1 + hasard 3]
si :tot < 4 [donne "ordi :tot]
donne "tot :tot - :ordi (ec [je joue ] :ordi [il reste ] :tot )
si :tot = 0 [ec [j'ai gagné] stop]
joueur2
end


! Copier joueur , renommer la copie joueur2 et changer la fin de joueur2 pour appeler ordi2 et supprimer l'appel à perte.
 

pour joueur2 [:n lismot]
si vide? :n [ec "Abandon stop]
si (ou :n > 3 :n < 1 non nombre? :n) [ joueur stop]
donne "tot :tot - :n
(ec [vous jouez] :n [il reste ] :tot)
si :n = 0 [ec [Vous avez gagné] stop ]
ordi2
end


Retour au sommaire
Activité précédente : L'interface, les boutons le terrain de jeu du morpion.
Activité suivante :    Labyrinthe 1, le dessin.