Le but du monde de Reeborg est d'enseigner la programmation informatique en utilisant le langage Python. Vous êtes invités à consulter la documentation, qui inclut un tutoriel de programmation Python.

L'objectif final de cet exercice est la résolution d'un labyrinthe en suivant le mur à gauche et en utilisant l'algorithme de Pledge détaillé sur le site interstices.info

Supposons que tous les angles du labyrinthe soient droits. On n'a alors que deux possibilités, tourner à droite ou à gauche selon un angle de \(90°\).

On compte alors les changements de direction en augmentant d'un point lorsque l'on tourne à gauche et en diminuant d'un point lorsque l'on tourne à droite (y compris la première fois que l'on tourne à droite quand on atteint un mur).

Au début, le décompte est à zéro. Les deux instructions sont alors les suivantes :

  1. Aller tout droit jusqu'au mur, passer à l'instruction 2 ;

  2. Longer le mur par la gauche jusqu'à ce que le décompte des changements de direction atteigne zéro, passer à l'instruction 1 ;

Il faut répéter ces actions jusqu'à ce que l'on revienne à la lumière du jour.

Question

Copier/coller le code du fichier monde Plege_OC.json dans le cadre gauche de la plateforme https://codebeautify.org/jsonviewer

À l'aide de la vue en arborescence, déterminez les dimensions du labyrinthe nommé Pledge_OC, le nombre total de murs, la position initiale du robot et celle de la sortie du labyrinthe.

1
{
2
  "walls": {
3
    "4,2": [
4
      "north"
5
    ],
6
    "4,3": [
7
      "north"
8
    ],
9
    "4,1": [
10
      "north"
11
    ],
12
    "2,5": [
13
      "north"
14
    ],
15
    "2,6": [
16
      "east",
17
      "north"
18
    ],
19
    "2,4": [
20
      "north"
21
    ],
22
    "2,2": [
23
      "north"
24
    ],
25
    "2,1": [
26
      "east"
27
    ],
28
    "4,5": [
29
      "east",
30
      "north"
31
    ],
32
    "4,6": [
33
      "north"
34
    ],
35
    "6,3": [
36
      "north"
37
    ],
38
    "6,4": [
39
      "east"
40
    ],
41
    "1,4": [
42
      "north",
43
      "east"
44
    ],
45
    "1,3": [
46
      "north"
47
    ],
48
    "3,4": [
49
      "north",
50
      "east"
51
    ],
52
    "3,3": [
53
      "north"
54
    ],
55
    "1,5": [
56
      "north"
57
    ],
58
    "3,7": [
59
      "east"
60
    ],
61
    "4,7": [
62
      "east"
63
    ],
64
    "5,4": [
65
      "north"
66
    ],
67
    "5,5": [
68
      "east"
69
    ],
70
    "5,6": [
71
      "east"
72
    ],
73
    "6,6": [
74
      "east"
75
    ],
76
    "7,5": [
77
      "north"
78
    ],
79
    "7,4": [
80
      "north"
81
    ],
82
    "5,3": [
83
      "east"
84
    ],
85
    "6,2": [
86
      "north"
87
    ],
88
    "6,1": [
89
      "north"
90
    ],
91
    "3,2": [
92
      "east"
93
    ],
94
    "3,1": [
95
      "north"
96
    ],
97
    "1,2": [
98
      "east"
99
    ],
100
    "1,1": [
101
      "east"
102
    ],
103
    "7,1": [
104
      "north"
105
    ]
106
  },
107
  "small_tiles": false,
108
  "rows": 7,
109
  "cols": 7,
110
  "tiles": {
111
    "6,1": [
112
      "gravel"
113
    ],
114
    "6,2": [
115
      "gravel"
116
    ],
117
    "6,3": [
118
      "gravel"
119
    ],
120
    "6,5": [
121
      "gravel"
122
    ],
123
    "6,6": [
124
      "gravel"
125
    ],
126
    "5,6": [
127
      "gravel"
128
    ],
129
    "4,6": [
130
      "gravel"
131
    ],
132
    "3,6": [
133
      "gravel"
134
    ],
135
    "2,6": [
136
      "gravel"
137
    ],
138
    "1,6": [
139
      "gravel"
140
    ],
141
    "6,4": [
142
      "gravel"
143
    ],
144
    "5,4": [
145
      "gravel"
146
    ],
147
    "5,5": [
148
      "gravel"
149
    ],
150
    "4,5": [
151
      "gravel"
152
    ],
153
    "3,5": [
154
      "gravel"
155
    ],
156
    "3,4": [
157
      "gravel"
158
    ],
159
    "4,4": [
160
      "gravel"
161
    ],
162
    "4,3": [
163
      "gravel"
164
    ],
165
    "3,3": [
166
      "gravel"
167
    ],
168
    "3,2": [
169
      "gravel"
170
    ],
171
    "4,2": [
172
      "gravel"
173
    ],
174
    "5,3": [
175
      "gravel"
176
    ],
177
    "5,2": [
178
      "gravel"
179
    ],
180
    "5,1": [
181
      "gravel"
182
    ],
183
    "4,1": [
184
      "gravel"
185
    ],
186
    "3,1": [
187
      "gravel"
188
    ],
189
    "2,1": [
190
      "gravel"
191
    ],
192
    "2,2": [
193
      "gravel"
194
    ],
195
    "2,3": [
196
      "gravel"
197
    ],
198
    "2,4": [
199
      "gravel"
200
    ],
201
    "2,5": [
202
      "gravel"
203
    ],
204
    "1,5": [
205
      "gravel"
206
    ],
207
    "1,4": [
208
      "gravel"
209
    ],
210
    "1,3": [
211
      "gravel"
212
    ],
213
    "1,2": [
214
      "gravel"
215
    ],
216
    "1,1": [
217
      "gravel"
218
    ],
219
    "1,7": [
220
      "gravel"
221
    ],
222
    "2,7": [
223
      "gravel"
224
    ],
225
    "3,7": [
226
      "gravel"
227
    ],
228
    "4,7": [
229
      "gravel"
230
    ],
231
    "5,7": [
232
      "gravel"
233
    ],
234
    "6,7": [
235
      "gravel"
236
    ],
237
    "7,1": [
238
      "gravel"
239
    ],
240
    "7,2": [
241
      "gravel"
242
    ],
243
    "7,3": [
244
      "gravel"
245
    ],
246
    "7,4": [
247
      "gravel"
248
    ],
249
    "7,5": [
250
      "gravel"
251
    ],
252
    "7,6": [
253
      "gravel"
254
    ],
255
    "7,7": [
256
      "gravel"
257
    ]
258
  },
259
  "robots": [
260
    {
261
      "x": 1,
262
      "y": 5,
263
      "objects": {},
264
      "model": "classic",
265
      "_orientation": 0,
266
      "_is_leaky": true,
267
      "_prev_x": 1,
268
      "_prev_y": 5,
269
      "_prev_orientation": 0,
270
      "_trace_history": [],
271
      "_trace_style": "default",
272
      "_trace_color": "seagreen",
273
      "__id": 69,
274
      "initial_position": [
275
        1,
276
        5
277
      ],
278
      "possible_initial_positions": [
279
        [
280
          1,
281
          5
282
        ]
283
      ]
284
    }
285
  ],
286
  "goal": {
287
    "possible_final_positions": [
288
      [
289
        7,
290
        1
291
      ]
292
    ],
293
    "position": {
294
      "image": "racing_flag",
295
      "x": 7,
296
      "y": 1
297
    }
298
  },
299
  "description": [
300
    "",
301
    "<h1>Perdu dans un labyrinthe</h1>",
302
    "<p>Reeborg explorait un labyrinthe lorsque sa lampe de poche a cessé de fonctionner.</p>",
303
    "<p>Écrivez un programme utilisant une clause <code>if/elif/else</code> qui permettra à Reeborg de trouver la sortie.",
304
    "Le secret est de compter les changements de direction en augmentant d'un point ",
305
    "lorsque l'on tourne à gauche et en diminuant d'un point lorsque l'on tourne à droite ",
306
    "(y compris la première fois que l'on tourne à droite quand on atteint un mur).</p>",
307
    "",
308
    "<p>Au début, le décompte est à zéro. Les deux instructions sont alors les suivantes :</p>",
309
    "<ol>",
310
    "    <li>Aller tout droit jusqu'au mur, passer à l'instruction 2 ;</li>",
311
    "    <li>Longer le mur par la droite (ou par la gauche, mais toujours dans le même sens) ",
312
    "        jusqu'à ce que le décompte des changements de direction atteigne zéro, ",
313
    "        passer à l'instruction 1 ;</li>",
314
    "</ol>   ",
315
    "<p>Il faut répéter ces actions jusqu'à ce que l'on revienne à la lumière du jour.</p>",
316
    "<h3>Ce que vous devez connaître</h3>",
317
    "<ul><li>Les fonctions <code>avance()</code>, <code>tourne_a_gauche()</code> et <code>depose()</code>.</li>",
318
    "<li>Les conditions <code>rien_devant()</code> ou <code>mur_devant()</code>,",
319
    "<code>rien_a_droite()</code> ou <code>mur_a_droite()</code>, et <code>objet_ici()</code>.</li>",
320
    "<li>Comment utiliser des boucles <code>while</code> et des énoncés <code>if/elif/else</code>.</li>",
321
    "<li>Il pourrait être utile de savoir comment faire la négation d'une condition",
322
    "(mot-clé <code>not</code> en Python).</li></ul>",
323
    "DIFFICULTY4",
324
    ""
325
  ],
326
  "editor": [
327
    "from biblio import *",
328
    "",
329
    "pense(0)",
330
    "            ",
331
    "while not au_but() :",
332
    "    while not mur_devant() :",
333
    "        avance()",
334
    "        if au_but() :",
335
    "            pause()",
336
    "    droite()",
337
    "    suivi_mur_G(-1)",
338
    "      ",
339
    "            ",
340
    "    ",
341
    ""
342
  ],
343
  "library": [
344
    "# Alias",
345
    "gauche = tourne_a_gauche",
346
    "",
347
    "def droite():",
348
    "    for loop in range(3):",
349
    "        gauche()",
350
    "        ",
351
    "def mur_a_gauche() :",
352
    "    gauche()",
353
    "    gauche()",
354
    "    test = mur_a_droite()",
355
    "    gauche()",
356
    "    gauche()",
357
    "    return test",
358
    "",
359
    "def suivi_mur_G(compteur):",
360
    "    if mur_devant() and not mur_a_droite() and compteur != 0 :",
361
    "        droite()",
362
    "        compteur -=1",
363
    "    while not mur_devant() and not au_but() :",
364
    "        avance()",
365
    "        #print(compteur)",
366
    "        if not mur_a_gauche() and compteur != 0 :",
367
    "            gauche()",
368
    "            compteur +=1",
369
    "        if mur_devant() and not mur_a_droite() and compteur != 0 :",
370
    "            droite()",
371
    "            compteur -=1",
372
    "        elif mur_devant() and mur_a_gauche() and mur_a_droite() and compteur != 0 :",
373
    "            droite()",
374
    "            droite()",
375
    "            compteur -=2"
376
  ],
377
  "pre": [
378
    "",
379
    ""
380
  ],
381
  "post": [
382
    "",
383
    ""
384
  ],
385
  "onload": [
386
    "var x, y;",
387
    "x = 1;",
388
    "y = 5;",
389
    ""
390
  ]
391
}

Indice

Utiliser le bouton "Tree Viewer"

Question

Quel est le niveau de difficulté associé au défi de programmation de ce labyrinthe ?

Indice

Il suffit de parcourir les items associés à la clé "Description" pour obtenir la valeur associée à DIFFICULTY

Question

À partir du code JSON précédent, récupérer le script Python de la bibliothèque à importer et le script en Python du programme nécessaire au robot.

Indice

Le code de la biblio

1
# Alias
2
gauche = tourne_a_gauche
3
4
def droite():
5
    for loop in range(3):
6
        gauche()
7
        
8
def mur_a_gauche() :
9
    gauche()
10
    gauche()
11
    test = mur_a_droite()
12
    gauche()
13
    gauche()
14
    return test
15
16
def suivi_mur_G(compteur):
17
    if mur_devant() and not mur_a_droite() and compteur != 0 :
18
        droite()
19
        compteur -=1
20
    while not mur_devant() and not au_but() :
21
        avance()
22
        #print(compteur)
23
        if not mur_a_gauche() and compteur != 0 :
24
            gauche()
25
            compteur +=1
26
        if mur_devant() and not mur_a_droite() and compteur != 0 :
27
            droite()
28
            compteur -=1
29
        elif mur_devant() and mur_a_gauche() and mur_a_droite() and compteur != 0 :
30
            droite()
31
            droite()
32
            compteur -=2

Indice

Le code Python

1
from biblio import *
2
3
#pense(0)
4
     
5
while not au_but() :
6
    while not mur_devant() :
7
        avance()
8
        if au_but() :
9
            pause()
10
    droite()
11
    suivi_mur_G(-1)

Question

Reproduire sur une feuille le labyrinthe ci-contre et décrire l'algorithme de Pledge.

Au début, le décompte est à zéro. Les deux instructions sont alors les suivantes :

  1. Aller tout droit jusqu'au mur, passer à l'instruction 2 ;

  2. Longer le mur par la gauche jusqu'à ce que le décompte des changements de direction atteigne zéro, passer à l'instruction 1 ;

Il faut répéter ces actions jusqu'à ce que l'on revienne à la lumière du jour.

Sur le site de Reeborg dans le menu Autres Options 

  1. Cliquez sur Ouvrir un monde (Ouvre un monde à partir d'un fichier) et chargez le fichier Plege_OC.json contenant le code joint précédemment.

  2. Cliquez sur Importer une bibliothèque (Ouvre un fichier contenant un programme et remplace le contenu de la bibliothèque par le contenu du fichier choisi) et chargez le fichier obtenu précédemment contenant le script Python de la bibliothèque à importer.

  3. Cliquez sur Ouvrir un programme (Ouvre un fichier local et remplace le contenu de l'éditeur par le contenu du fichier) et chargez le fichier obtenu précédemment contenant le programme nécessaire au robot.

Il suffit maintenant de lancer l’exécution du programme (bouton Lecture) pour vérifier votre solution précédente.

Remarque : Sur la plateforme Reeborg, vous pouvez créer vos propres mondes en modifiant un monde existant mais lors de la mise en forme et l'ajout par exemple d'image de fond dans chaque case, cela demande énormément de "clique" à la souris. Il sera en fait plus rapide de modifier directement dans le fichier JSON les items associés à la clé "tiles".