Clavier et souris ensemble
appuyer attend une touche du clavier. cliquer attend un clic sur une toile. Et si on veut accepter les deux ? C'est le rôle de interagir.
Une instruction, deux façons de répondre
t est une toile
dimension(t, 300, 120)
remplir(t, #0D1117)
label(t, 20, 65, 'Clique ici, ou appuie sur A ou B', #E6EDF3, 14)
affiche t
action est un nombre
x est un nombre
y est un nombre
interagir t, ['a', 'b'] dans action, x, y
si action = 0 alors
affiche 'Clic au point ' + x + ', ' + y
sinon si action = 1 alors
affiche 'Touche A'
sinon
affiche 'Touche B'
fin si
interagir attend le premier événement, puis remplit trois variables nombre :
- un clic sur la toile :
action vaut 0, et x, y reçoivent la position du clic ; - une touche :
action vaut le numéro de la touche dans la liste (1 pour la première, 2 pour la deuxième...), et x, y valent -1.
La toile doit avoir été affichée avant.
Question : Avec interagir t, ['z', 's', 'q', 'd'] dans action, x, y, que vaut action si on appuie sur q ? — 3. q est la troisième touche de la liste : action vaut 3. La valeur 0 est réservée au clic.
Déplacer un personnage
Un carré se déplace avec les touches Z, Q, S, D... ou saute directement à l'endroit où on clique.
t est une toile
dimension(t, 400, 300)
posX est un nombre vaut 200
posY est un nombre vaut 150
action est un nombre
x est un nombre
y est un nombre
procédure dessiner()
effacer(t)
remplir(t, #0D1117)
label(t, 10, 20, 'Z Q S D ou clic pour bouger - X pour quitter', #8B949E, 12)
rectangle_arrondi(t, posX - 15, posY - 15, 30, 30, 6, #1D9BF0)
affiche t
fin procédure
fini est un booléen vaut faux
tant que non fini
appelle dessiner()
interagir t, ['z', 's', 'q', 'd', 'x'] dans action, x, y
si action = 0 alors
posX vaut x
posY vaut y
sinon si action = 1 alors
posY soustrait 20
sinon si action = 2 alors
posY ajoute 20
sinon si action = 3 alors
posX soustrait 20
sinon si action = 4 alors
posX ajoute 20
sinon
fini vaut vrai
fin si
posX vaut limiter(posX, 15, 385)
posY vaut limiter(posY, 15, 285)
fin tant que
affiche 'Au revoir !'
Le schéma est toujours le même : dessiner, attendre, réagir, et on recommence. limiter empêche le carré de sortir de la toile.
Dans la liste, utilise des touches d'une seule lettre ou d'un seul chiffre : 'z', 'x', '5'.
Un jeu : le trésor caché
Un trésor est enterré sous l'une des 48 cases. On creuse en cliquant ; chaque case creusée indique à quelle distance se trouve le trésor. Au clavier : N pour une nouvelle partie, X pour quitter.
t est une toile
dimension(t, 400, 340)
fouilles est un tableau
tresorCol est un nombre
tresorRang est un nombre
essais est un nombre
gagne est un booléen
message est un texte
procédure nouvellePartie()
pour r de 0 à 5
pour c de 0 à 7
fouilles[r][c] vaut -1
fin pour
fin pour
tresorCol vaut hasard(0, 7)
tresorRang vaut hasard(0, 5)
essais vaut 0
gagne vaut faux
message vaut 'Clique sur une case pour creuser.'
fin procédure
procédure dessiner()
ecart est un nombre
teinte est un texte
effacer(t)
remplir(t, #0D1117)
pour r de 0 à 5
pour c de 0 à 7
ecart vaut fouilles[r][c]
si ecart = -1 alors
teinte vaut #C2A477
sinon si ecart = 0 alors
teinte vaut #FFD43B
sinon si ecart <= 2 alors
teinte vaut #E5484D
sinon si ecart <= 4 alors
teinte vaut #F5A524
sinon
teinte vaut #3B82F6
fin si
rectangle(t, c * 50 + 1, r * 50 + 1, 48, 48, teinte)
si ecart > 0 alors
label(t, c * 50 + 20, r * 50 + 31, ecart, #FFFFFF, 16)
fin si
fin pour
fin pour
label(t, 10, 325, message, #E6EDF3, 13)
affiche t
fin procédure
action est un nombre
x est un nombre
y est un nombre
col est un nombre
rang est un nombre
eloignement est un nombre
fini est un booléen vaut faux
appelle nouvellePartie()
tant que non fini
appelle dessiner()
interagir t, ['n', 'x'] dans action, x, y
si action = 1 alors
appelle nouvellePartie()
sinon si action = 2 alors
fini vaut vrai
sinon si non gagne et y < 300 alors
col vaut limiter(arrondi_inferieur(x / 50), 0, 7)
rang vaut limiter(arrondi_inferieur(y / 50), 0, 5)
si fouilles[rang][col] = -1 alors
essais ajoute 1
eloignement vaut absolue(col - tresorCol) + absolue(rang - tresorRang)
fouilles[rang][col] vaut eloignement
si eloignement = 0 alors
gagne vaut vrai
message vaut 'Trouvé en ' + essais + ' coups ! (N : rejouer)'
sinon
message vaut 'Coups : ' + essais + ' (N : rejouer, X : quitter)'
fin si
fin si
fin si
fin tant que
affiche 'À bientôt !'
Le programme est long, mais chaque morceau est simple :
fouilles est une grille : -1 pour une case intacte, sinon la distance au trésor ;nouvellePartie remet tout à zéro et cache le trésor ;dessiner colorie chaque case : sable, rouge (tout près), orange, bleu (loin), or (trouvé) ;- la boucle principale attend un clic ou une touche, et réagit.
La distance compte les cases à parcourir, horizontalement puis verticalement : absolue(col - tresorCol) + absolue(rang - tresorRang).
arrondi_inferieur(x / 50) transforme la position du clic en numéro de colonne : chaque case fait 50 pixels de large.
Attendre, ou ne pas attendre ?
CoddyRun propose deux familles d'outils pour le clavier et la souris.
Ceux qui attendent : appuyer, cliquer, interagir. Le programme se met en pause jusqu'à l'action du joueur. Parfaits pour les jeux tour par tour : morpion, trésor, bataille navale, quiz.
Ceux qui n'attendent pas : touche_enfoncée, touche_pressée, souris_x, souris_clic... Le programme continue de tourner. Indispensables pour les jeux en temps réel : une balle qui rebondit, un personnage qui court.
Pour choisir, pose-toi une question : est-ce que quelque chose doit bouger pendant que le joueur réfléchit ? Si non, interagir suffit, et le programme est bien plus simple.
En résumé
interagir toile, [touches] dans action, x, y attend un clic ou une touche.- Clic :
action vaut 0 et x, y donnent la position. Touche : action vaut son numéro dans la liste. - Le schéma : dessiner, attendre, réagir, recommencer.
- Ces instructions bloquent le programme : elles conviennent aux jeux tour par tour.