hpp-lang 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/ast.d.ts +89 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/capabilities.d.ts +75 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +181 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/examples.d.ts +9 -0
- package/dist/examples.d.ts.map +1 -0
- package/dist/examples.js +780 -0
- package/dist/examples.js.map +1 -0
- package/dist/extensions/line/index.d.ts +45 -0
- package/dist/extensions/line/index.d.ts.map +1 -0
- package/dist/extensions/line/index.js +99 -0
- package/dist/extensions/line/index.js.map +1 -0
- package/dist/extensions/maze/index.d.ts +37 -0
- package/dist/extensions/maze/index.d.ts.map +1 -0
- package/dist/extensions/maze/index.js +43 -0
- package/dist/extensions/maze/index.js.map +1 -0
- package/dist/extensions/soccer/index.d.ts +8 -0
- package/dist/extensions/soccer/index.d.ts.map +1 -0
- package/dist/extensions/soccer/index.js +93 -0
- package/dist/extensions/soccer/index.js.map +1 -0
- package/dist/hardware.d.ts +44 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +2 -0
- package/dist/hardware.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/interpreter.d.ts +88 -0
- package/dist/interpreter.d.ts.map +1 -0
- package/dist/interpreter.js +795 -0
- package/dist/interpreter.js.map +1 -0
- package/dist/lexer.d.ts +21 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +175 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +60 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +569 -0
- package/dist/parser.js.map +1 -0
- package/dist/robotics/actions.d.ts +13 -0
- package/dist/robotics/actions.d.ts.map +1 -0
- package/dist/robotics/actions.js +38 -0
- package/dist/robotics/actions.js.map +1 -0
- package/dist/robotics/contracts.d.ts +88 -0
- package/dist/robotics/contracts.d.ts.map +1 -0
- package/dist/robotics/contracts.js +31 -0
- package/dist/robotics/contracts.js.map +1 -0
- package/dist/robotics/index.d.ts +21 -0
- package/dist/robotics/index.d.ts.map +1 -0
- package/dist/robotics/index.js +19 -0
- package/dist/robotics/index.js.map +1 -0
- package/dist/robotics/motion.d.ts +139 -0
- package/dist/robotics/motion.d.ts.map +1 -0
- package/dist/robotics/motion.js +248 -0
- package/dist/robotics/motion.js.map +1 -0
- package/dist/robotics/sensors.d.ts +15 -0
- package/dist/robotics/sensors.d.ts.map +1 -0
- package/dist/robotics/sensors.js +12 -0
- package/dist/robotics/sensors.js.map +1 -0
- package/dist/robotics/snapshot.d.ts +12 -0
- package/dist/robotics/snapshot.d.ts.map +1 -0
- package/dist/robotics/snapshot.js +9 -0
- package/dist/robotics/snapshot.js.map +1 -0
- package/dist/robotics/types.d.ts +12 -0
- package/dist/robotics/types.d.ts.map +1 -0
- package/dist/robotics/types.js +9 -0
- package/dist/robotics/types.js.map +1 -0
- package/dist/runtime.d.ts +81 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +150 -0
- package/dist/runtime.js.map +1 -0
- package/dist/tokens.d.ts +33 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +97 -0
- package/dist/tokens.js.map +1 -0
- package/dist/version.d.ts +14 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
package/dist/examples.js
ADDED
|
@@ -0,0 +1,780 @@
|
|
|
1
|
+
/** Programas-exemplo H++ (PT) — do primeiro passo ao goleiro. */
|
|
2
|
+
export const EXAMPLES = [
|
|
3
|
+
{
|
|
4
|
+
id: 'danca',
|
|
5
|
+
name: '1 · Dança do robô',
|
|
6
|
+
level: 'Fundamental 1 — primeira execução',
|
|
7
|
+
code: `# Meu primeiro programa: o robô dança sem parar!
|
|
8
|
+
# O SEMPRE roda um pouquinho a cada ciclo.
|
|
9
|
+
SEMPRE
|
|
10
|
+
ANDAR 0.5
|
|
11
|
+
GIRAR 0.8
|
|
12
|
+
FIM
|
|
13
|
+
`
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: 'perseguidor',
|
|
17
|
+
name: '2 · Perseguidor de bola',
|
|
18
|
+
level: 'Fundamental 1 — sensores',
|
|
19
|
+
code: `# Se vejo a bola, miro e ando. Perto e de frente: CHUTO!
|
|
20
|
+
SE ver_bola ENTAO
|
|
21
|
+
MIRAR_BOLA
|
|
22
|
+
ANDAR 0.7
|
|
23
|
+
SE dist_bola < 0.2 E abs(direcao_bola) < 15 ENTAO
|
|
24
|
+
CHUTAR
|
|
25
|
+
FIM
|
|
26
|
+
SENAO
|
|
27
|
+
GIRAR 0.5
|
|
28
|
+
FIM
|
|
29
|
+
`
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'goleiro',
|
|
33
|
+
name: '3 · Goleiro esperto',
|
|
34
|
+
level: 'Fundamental 2 — variáveis e lógica',
|
|
35
|
+
code: `# Guarda a linha do gol e afasta o perigo.
|
|
36
|
+
# memoria: conta quantas vezes afastei a bola.
|
|
37
|
+
afastadas = 0
|
|
38
|
+
|
|
39
|
+
SE ver_bola ENTAO
|
|
40
|
+
SE dist_bola < 0.35 ENTAO
|
|
41
|
+
MIRAR_GOL
|
|
42
|
+
CHUTAR
|
|
43
|
+
afastadas = afastadas + 1
|
|
44
|
+
SENAO
|
|
45
|
+
MIRAR_BOLA
|
|
46
|
+
SE abs(direcao_bola) > 90 ENTAO
|
|
47
|
+
GIRAR 0.6
|
|
48
|
+
SENAO
|
|
49
|
+
ANDAR 0.4
|
|
50
|
+
FIM
|
|
51
|
+
FIM
|
|
52
|
+
SENAO
|
|
53
|
+
PARAR
|
|
54
|
+
FIM
|
|
55
|
+
`
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'patrulha',
|
|
59
|
+
name: '4 · Patrulha com função',
|
|
60
|
+
level: 'Fundamental 2 — funções e repetição',
|
|
61
|
+
code: `# Minha função: gira para procurar a bola.
|
|
62
|
+
FUNCAO procurar()
|
|
63
|
+
GIRAR 0.7
|
|
64
|
+
FIM
|
|
65
|
+
|
|
66
|
+
SE ver_bola ENTAO
|
|
67
|
+
MIRAR_BOLA
|
|
68
|
+
ANDAR 0.6
|
|
69
|
+
SE dist_bola < 0.25 ENTAO
|
|
70
|
+
CHUTAR
|
|
71
|
+
FIM
|
|
72
|
+
SENAO
|
|
73
|
+
procurar()
|
|
74
|
+
FIM
|
|
75
|
+
`
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'dupla',
|
|
79
|
+
name: '5 · Dupla pelo rádio',
|
|
80
|
+
level: 'Fundamental 2 — equipe e linha',
|
|
81
|
+
code: `# Fujo da linha branca, persigo a bola e aviso a equipe.
|
|
82
|
+
SE linha_frente ENTAO
|
|
83
|
+
GIRAR 0.8
|
|
84
|
+
SENAO
|
|
85
|
+
SE ver_bola ENTAO
|
|
86
|
+
MIRAR_BOLA
|
|
87
|
+
ANDAR 0.6
|
|
88
|
+
SE dist_bola < 0.25 ENTAO
|
|
89
|
+
CHUTAR
|
|
90
|
+
ENVIAR_RADIO 1
|
|
91
|
+
FIM
|
|
92
|
+
SENAO
|
|
93
|
+
GIRAR 0.4
|
|
94
|
+
FIM
|
|
95
|
+
FIM
|
|
96
|
+
`
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'cola',
|
|
100
|
+
name: '6 · Cola na bola (dribbler)',
|
|
101
|
+
level: 'Fundamental 2 — condução',
|
|
102
|
+
code: `# Liga o rolete para grudar a bola e leva até o gol.
|
|
103
|
+
SE ver_bola ENTAO
|
|
104
|
+
MIRAR_BOLA
|
|
105
|
+
DRIBLAR 1
|
|
106
|
+
ANDAR 0.7
|
|
107
|
+
SE dist_bola < 0.2 ENTAO
|
|
108
|
+
MIRAR_GOL
|
|
109
|
+
SE direcao_bola > -10 E direcao_bola < 10 ENTAO
|
|
110
|
+
DRIBLAR 0
|
|
111
|
+
CHUTAR
|
|
112
|
+
FIM
|
|
113
|
+
FIM
|
|
114
|
+
SENAO
|
|
115
|
+
DRIBLAR 0
|
|
116
|
+
GIRAR 0.5
|
|
117
|
+
FIM
|
|
118
|
+
`
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: 'linha',
|
|
122
|
+
name: '7 · Respeita a linha',
|
|
123
|
+
level: 'Fundamental 1 — regras do jogo',
|
|
124
|
+
code: `# A regra proíbe cruzar a linha branca com mais da metade do corpo:
|
|
125
|
+
# quem cruza sai do campo por 60 segundos! Vendo a linha na frente,
|
|
126
|
+
# dou ré fazendo meia-volta; vendo atrás, paro. A bola pode estar
|
|
127
|
+
# do outro lado — eu NÃO atravesso, procuro de dentro do campo.
|
|
128
|
+
SE linha_frente ENTAO
|
|
129
|
+
ANDAR -0.5
|
|
130
|
+
GIRAR 0.8
|
|
131
|
+
SENAO
|
|
132
|
+
SE linha_tras ENTAO
|
|
133
|
+
PARAR
|
|
134
|
+
SENAO
|
|
135
|
+
SE ver_bola ENTAO
|
|
136
|
+
MIRAR_BOLA
|
|
137
|
+
ANDAR 0.6
|
|
138
|
+
SENAO
|
|
139
|
+
GIRAR 0.4
|
|
140
|
+
FIM
|
|
141
|
+
FIM
|
|
142
|
+
FIM
|
|
143
|
+
`
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: 'segura',
|
|
147
|
+
name: '8 · Finalização segura',
|
|
148
|
+
level: 'Fundamental 2 — sem gol contra',
|
|
149
|
+
code: `# Chutar de qualquer jeito pode dar gol contra! Perto da bola,
|
|
150
|
+
# miro o gol de ataque e só chuto bem de frente; se não,
|
|
151
|
+
# conduzo com o drible até a posição certa.
|
|
152
|
+
SE ver_bola ENTAO
|
|
153
|
+
SE dist_bola < 0.25 ENTAO
|
|
154
|
+
MIRAR_GOL
|
|
155
|
+
DRIBLAR 1
|
|
156
|
+
SE abs(direcao_bola) < 12 ENTAO
|
|
157
|
+
DRIBLAR 0
|
|
158
|
+
CHUTAR
|
|
159
|
+
FIM
|
|
160
|
+
SENAO
|
|
161
|
+
MIRAR_BOLA
|
|
162
|
+
DRIBLAR 1
|
|
163
|
+
ANDAR 0.6
|
|
164
|
+
FIM
|
|
165
|
+
SENAO
|
|
166
|
+
DRIBLAR 0
|
|
167
|
+
GIRAR 0.4
|
|
168
|
+
FIM
|
|
169
|
+
`
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: 'atacante_v2',
|
|
173
|
+
name: '9 · Atacante inteligente V2',
|
|
174
|
+
level: 'Fundamental 2 — estratégia completa',
|
|
175
|
+
code: `# H++ SOCCER — ATACANTE INTELIGENTE V2
|
|
176
|
+
#
|
|
177
|
+
# Estratégia:
|
|
178
|
+
#
|
|
179
|
+
# 1. Proteger o campo
|
|
180
|
+
# 2. Procurar a bola
|
|
181
|
+
# 3. Perseguir a bola
|
|
182
|
+
# 4. Controlar a bola
|
|
183
|
+
# 5. Alinhar para o gol
|
|
184
|
+
# 6. Finalizar
|
|
185
|
+
#
|
|
186
|
+
# O programa trabalha somente com percepção relativa.
|
|
187
|
+
# Não utiliza posição absoluta da bola.
|
|
188
|
+
|
|
189
|
+
# MEMÓRIA
|
|
190
|
+
chutes = 0
|
|
191
|
+
afastadas = 0
|
|
192
|
+
perdidas = 0
|
|
193
|
+
procurando = 0
|
|
194
|
+
|
|
195
|
+
# PROCURAR: executado quando a bola não está visível.
|
|
196
|
+
FUNCAO procurar()
|
|
197
|
+
DRIBLAR 0
|
|
198
|
+
GIRAR 0.45
|
|
199
|
+
procurando = procurando + 1
|
|
200
|
+
FIM
|
|
201
|
+
|
|
202
|
+
# PERSEGUIR: bola distante. Corrige o ângulo, depois avança.
|
|
203
|
+
FUNCAO perseguir()
|
|
204
|
+
DRIBLAR 0
|
|
205
|
+
MIRAR_BOLA
|
|
206
|
+
SE abs(direcao_bola) > 60 ENTAO
|
|
207
|
+
SE direcao_bola < 0 ENTAO
|
|
208
|
+
GIRAR -0.55
|
|
209
|
+
SENAO
|
|
210
|
+
GIRAR 0.55
|
|
211
|
+
FIM
|
|
212
|
+
SENAO
|
|
213
|
+
ANDAR 0.8
|
|
214
|
+
FIM
|
|
215
|
+
FIM
|
|
216
|
+
|
|
217
|
+
# APROXIMAR: bola a distância intermediária.
|
|
218
|
+
FUNCAO aproximar()
|
|
219
|
+
DRIBLAR 0
|
|
220
|
+
MIRAR_BOLA
|
|
221
|
+
SE abs(direcao_bola) > 35 ENTAO
|
|
222
|
+
SE direcao_bola < 0 ENTAO
|
|
223
|
+
GIRAR -0.40
|
|
224
|
+
SENAO
|
|
225
|
+
GIRAR 0.40
|
|
226
|
+
FIM
|
|
227
|
+
SENAO
|
|
228
|
+
ANDAR 0.55
|
|
229
|
+
FIM
|
|
230
|
+
FIM
|
|
231
|
+
|
|
232
|
+
# CONTROLAR: bola próxima e sob controle (dribbler ligado).
|
|
233
|
+
# Na condução, quem orienta a trajetória é o GOL (direcao_gol),
|
|
234
|
+
# não mais a bola — aquisição (MIRAR_BOLA) ficou nas fases anteriores.
|
|
235
|
+
FUNCAO controlar()
|
|
236
|
+
DRIBLAR 1
|
|
237
|
+
MIRAR_GOL
|
|
238
|
+
SE abs(direcao_gol) > 30 ENTAO
|
|
239
|
+
SE direcao_gol < 0 ENTAO
|
|
240
|
+
GIRAR -0.35
|
|
241
|
+
SENAO
|
|
242
|
+
GIRAR 0.35
|
|
243
|
+
FIM
|
|
244
|
+
SENAO
|
|
245
|
+
ANDAR 0.35
|
|
246
|
+
FIM
|
|
247
|
+
FIM
|
|
248
|
+
|
|
249
|
+
# FINALIZAR: o chute depende da orientação para o GOL,
|
|
250
|
+
# nunca da direção da bola (bola ≠ gol).
|
|
251
|
+
FUNCAO finalizar()
|
|
252
|
+
MIRAR_GOL
|
|
253
|
+
SE abs(direcao_gol) < 10 ENTAO
|
|
254
|
+
DRIBLAR 0
|
|
255
|
+
CHUTAR
|
|
256
|
+
chutes = chutes + 1
|
|
257
|
+
ENVIAR_RADIO 1
|
|
258
|
+
SENAO
|
|
259
|
+
DRIBLAR 1
|
|
260
|
+
SE direcao_gol < 0 ENTAO
|
|
261
|
+
GIRAR -0.30
|
|
262
|
+
SENAO
|
|
263
|
+
GIRAR 0.30
|
|
264
|
+
FIM
|
|
265
|
+
FIM
|
|
266
|
+
FIM
|
|
267
|
+
|
|
268
|
+
# RECUAR: a linha branca tem prioridade máxima.
|
|
269
|
+
FUNCAO recuar()
|
|
270
|
+
DRIBLAR 0
|
|
271
|
+
ANDAR -0.6
|
|
272
|
+
GIRAR 0.8
|
|
273
|
+
afastadas = afastadas + 1
|
|
274
|
+
FIM
|
|
275
|
+
|
|
276
|
+
# PARAR: usado quando a linha traseira é detectada.
|
|
277
|
+
FUNCAO parar_seguro()
|
|
278
|
+
DRIBLAR 0
|
|
279
|
+
PARAR
|
|
280
|
+
FIM
|
|
281
|
+
|
|
282
|
+
# CICLO PRINCIPAL: segurança, percepção, decisão por distância.
|
|
283
|
+
SEMPRE
|
|
284
|
+
SE linha_frente ENTAO
|
|
285
|
+
recuar()
|
|
286
|
+
SENAO
|
|
287
|
+
SE linha_tras ENTAO
|
|
288
|
+
parar_seguro()
|
|
289
|
+
SENAO
|
|
290
|
+
SE ver_bola ENTAO
|
|
291
|
+
procurando = 0
|
|
292
|
+
perdidas = 0
|
|
293
|
+
SE dist_bola > 0.60 ENTAO
|
|
294
|
+
perseguir()
|
|
295
|
+
SENAO
|
|
296
|
+
SE dist_bola > 0.30 ENTAO
|
|
297
|
+
aproximar()
|
|
298
|
+
SENAO
|
|
299
|
+
SE dist_bola < 0.22 ENTAO
|
|
300
|
+
finalizar()
|
|
301
|
+
SENAO
|
|
302
|
+
controlar()
|
|
303
|
+
FIM
|
|
304
|
+
FIM
|
|
305
|
+
FIM
|
|
306
|
+
SENAO
|
|
307
|
+
perdidas = perdidas + 1
|
|
308
|
+
procurar()
|
|
309
|
+
FIM
|
|
310
|
+
FIM
|
|
311
|
+
FIM
|
|
312
|
+
FIM
|
|
313
|
+
`
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
id: 'atacante_v3',
|
|
317
|
+
name: '10 . Atacante inteligente V3',
|
|
318
|
+
level: 'Fundamental 2 — estratégia completa',
|
|
319
|
+
code: `# H++ SOCCER — ATACANTE INTELIGENTE V3
|
|
320
|
+
#
|
|
321
|
+
# Estratégia:
|
|
322
|
+
#
|
|
323
|
+
# 1. Proteger o campo
|
|
324
|
+
# 2. Procurar a bola
|
|
325
|
+
# 3. Perseguir a bola
|
|
326
|
+
# 4. Controlar a bola
|
|
327
|
+
# 5. Alinhar para o gol
|
|
328
|
+
# 6. Finalizar
|
|
329
|
+
#
|
|
330
|
+
# O programa trabalha somente com percepção relativa.
|
|
331
|
+
# Não utiliza posição absoluta da bola.
|
|
332
|
+
|
|
333
|
+
# MEMÓRIA
|
|
334
|
+
chutes = 0
|
|
335
|
+
afastadas = 0
|
|
336
|
+
perdidas = 0
|
|
337
|
+
procurando = 0
|
|
338
|
+
|
|
339
|
+
# PROCURAR: executado quando a bola não está visível.
|
|
340
|
+
FUNCAO procurar()
|
|
341
|
+
DRIBLAR 0
|
|
342
|
+
GIRAR 0.40
|
|
343
|
+
procurando = procurando + 1
|
|
344
|
+
FIM
|
|
345
|
+
|
|
346
|
+
# PERSEGUIR: bola distante. Corrige o ângulo, depois avança.
|
|
347
|
+
FUNCAO perseguir()
|
|
348
|
+
DRIBLAR 0
|
|
349
|
+
MIRAR_BOLA
|
|
350
|
+
SE abs(direcao_bola) > 55 ENTAO
|
|
351
|
+
SE direcao_bola < 0 ENTAO
|
|
352
|
+
GIRAR -0.59
|
|
353
|
+
SENAO
|
|
354
|
+
GIRAR 0.5
|
|
355
|
+
FIM
|
|
356
|
+
SENAO
|
|
357
|
+
ANDAR 0.7
|
|
358
|
+
FIM
|
|
359
|
+
FIM
|
|
360
|
+
|
|
361
|
+
# APROXIMAR: bola a distância intermediária.
|
|
362
|
+
FUNCAO aproximar()
|
|
363
|
+
DRIBLAR 0
|
|
364
|
+
MIRAR_BOLA
|
|
365
|
+
SE abs(direcao_bola) > 35 ENTAO
|
|
366
|
+
SE direcao_bola < 0 ENTAO
|
|
367
|
+
GIRAR -0.42
|
|
368
|
+
SENAO
|
|
369
|
+
GIRAR 0.45
|
|
370
|
+
FIM
|
|
371
|
+
SENAO
|
|
372
|
+
ANDAR 0.57
|
|
373
|
+
FIM
|
|
374
|
+
FIM
|
|
375
|
+
|
|
376
|
+
# CONTROLAR: bola próxima e sob controle (dribbler ligado).
|
|
377
|
+
# Na condução, quem orienta a trajetória é o GOL (direcao_gol),
|
|
378
|
+
# não mais a bola — aquisição (MIRAR_BOLA) ficou nas fases anteriores.
|
|
379
|
+
FUNCAO controlar()
|
|
380
|
+
DRIBLAR 1
|
|
381
|
+
MIRAR_GOL
|
|
382
|
+
SE abs(direcao_gol) > 32 ENTAO
|
|
383
|
+
SE direcao_gol < 0 ENTAO
|
|
384
|
+
GIRAR -0.34
|
|
385
|
+
SENAO
|
|
386
|
+
GIRAR 0.32
|
|
387
|
+
FIM
|
|
388
|
+
SENAO
|
|
389
|
+
ANDAR 0.37
|
|
390
|
+
FIM
|
|
391
|
+
FIM
|
|
392
|
+
|
|
393
|
+
# FINALIZAR: o chute depende da orientação para o GOL,
|
|
394
|
+
# nunca da direção da bola (bola ≠ gol).
|
|
395
|
+
FUNCAO finalizar()
|
|
396
|
+
MIRAR_GOL
|
|
397
|
+
SE abs(direcao_gol) < 10 ENTAO
|
|
398
|
+
DRIBLAR 0
|
|
399
|
+
CHUTAR
|
|
400
|
+
chutes = chutes + 1
|
|
401
|
+
ENVIAR_RADIO 1
|
|
402
|
+
SENAO
|
|
403
|
+
DRIBLAR 1
|
|
404
|
+
SE direcao_gol < 0 ENTAO
|
|
405
|
+
GIRAR -0.30
|
|
406
|
+
SENAO
|
|
407
|
+
GIRAR 0.30
|
|
408
|
+
FIM
|
|
409
|
+
FIM
|
|
410
|
+
FIM
|
|
411
|
+
|
|
412
|
+
# RECUAR: a linha branca tem prioridade máxima.
|
|
413
|
+
FUNCAO recuar()
|
|
414
|
+
DRIBLAR 0
|
|
415
|
+
ANDAR -0.6
|
|
416
|
+
GIRAR 0.8
|
|
417
|
+
afastadas = afastadas + 1
|
|
418
|
+
FIM
|
|
419
|
+
|
|
420
|
+
# PARAR: usado quando a linha traseira é detectada.
|
|
421
|
+
FUNCAO parar_seguro()
|
|
422
|
+
DRIBLAR 0
|
|
423
|
+
PARAR
|
|
424
|
+
FIM
|
|
425
|
+
|
|
426
|
+
# CICLO PRINCIPAL: segurança, percepção, decisão por distância.
|
|
427
|
+
SEMPRE
|
|
428
|
+
SE linha_frente ENTAO
|
|
429
|
+
recuar()
|
|
430
|
+
SENAO
|
|
431
|
+
SE linha_tras ENTAO
|
|
432
|
+
parar_seguro()
|
|
433
|
+
SENAO
|
|
434
|
+
SE ver_bola ENTAO
|
|
435
|
+
procurando = 0
|
|
436
|
+
perdidas = 0
|
|
437
|
+
SE dist_bola > 0.60 ENTAO
|
|
438
|
+
perseguir()
|
|
439
|
+
SENAO
|
|
440
|
+
SE dist_bola > 0.30 ENTAO
|
|
441
|
+
aproximar()
|
|
442
|
+
SENAO
|
|
443
|
+
SE dist_bola < 0.22 ENTAO
|
|
444
|
+
finalizar()
|
|
445
|
+
SENAO
|
|
446
|
+
controlar()
|
|
447
|
+
FIM
|
|
448
|
+
FIM
|
|
449
|
+
FIM
|
|
450
|
+
SENAO
|
|
451
|
+
perdidas = perdidas + 1
|
|
452
|
+
procurar()
|
|
453
|
+
FIM
|
|
454
|
+
FIM
|
|
455
|
+
FIM
|
|
456
|
+
FIM
|
|
457
|
+
`
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
id: 'predicados',
|
|
461
|
+
name: '11 · Predicados (perguntas)',
|
|
462
|
+
level: 'Fundamental 2 — funções que respondem',
|
|
463
|
+
code: `# Predicados: FUNCAO + RETORNAR transformam medidas em perguntas.
|
|
464
|
+
# A função enxerga os sensores, as entradas e as variáveis globais.
|
|
465
|
+
FUNCAO gol_alinhado()
|
|
466
|
+
RETORNAR abs(direcao_gol) < 10
|
|
467
|
+
FIM
|
|
468
|
+
|
|
469
|
+
FUNCAO bola_perto()
|
|
470
|
+
RETORNAR dist_bola < 0.25
|
|
471
|
+
FIM
|
|
472
|
+
|
|
473
|
+
SEMPRE
|
|
474
|
+
SE ver_bola ENTAO
|
|
475
|
+
MIRAR_BOLA
|
|
476
|
+
ANDAR 0.6
|
|
477
|
+
SE bola_perto() ENTAO
|
|
478
|
+
MIRAR_GOL
|
|
479
|
+
SE gol_alinhado() ENTAO
|
|
480
|
+
CHUTAR
|
|
481
|
+
FIM
|
|
482
|
+
FIM
|
|
483
|
+
SENAO
|
|
484
|
+
GIRAR 0.4
|
|
485
|
+
FIM
|
|
486
|
+
FIM
|
|
487
|
+
`
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
id: 'atacante_v4',
|
|
491
|
+
name: '12 · Atacante inteligente V4',
|
|
492
|
+
level: 'Fundamental 2 — funções que respondem',
|
|
493
|
+
code: `#
|
|
494
|
+
# Estratégia:
|
|
495
|
+
#
|
|
496
|
+
# 1. Respeitar o jogo (parar no fim e no intervalo)
|
|
497
|
+
# 2. Proteger o campo (linhas têm prioridade máxima)
|
|
498
|
+
# 3. Procurar a bola (giro alternado pelo relógio do jogo)
|
|
499
|
+
# 4. Perseguir a bola (longe: corrige o ângulo, depois avança)
|
|
500
|
+
# 5. Aproximar (distância intermediária, chegada suave)
|
|
501
|
+
# 6. Controlar a bola (perto: conduz orientado pelo GOL)
|
|
502
|
+
# 7. Alinhar para o gol
|
|
503
|
+
# 8. Finalizar (só com bola dominada E gol alinhado)
|
|
504
|
+
#
|
|
505
|
+
# O programa trabalha somente com percepção relativa.
|
|
506
|
+
# Não utiliza posição absoluta da bola.
|
|
507
|
+
#
|
|
508
|
+
# NOTA DE MEMÓRIA (importante): no H++ o programa inteiro roda a cada
|
|
509
|
+
# ciclo, então "x = 0" no topo zeraria todo ciclo. Por isso este programa
|
|
510
|
+
# NÃO usa contadores entre ciclos: toda decisão sai só dos sensores do
|
|
511
|
+
# ciclo atual. A alternância da busca usa o relógio do jogo (tempo).
|
|
512
|
+
#
|
|
513
|
+
|
|
514
|
+
# PROCURAR: bola fora de vista. Gira no próprio eixo alternando o lado
|
|
515
|
+
# a cada 5 s de jogo (tempo % 10); sem avançar, para não atravessar
|
|
516
|
+
# a linha durante a busca cega.
|
|
517
|
+
FUNCAO procurar()
|
|
518
|
+
DRIBLAR 0
|
|
519
|
+
SE tempo % 10 < 5 ENTAO
|
|
520
|
+
GIRAR 0.40
|
|
521
|
+
SENAO
|
|
522
|
+
GIRAR -0.40
|
|
523
|
+
FIM
|
|
524
|
+
FIM
|
|
525
|
+
|
|
526
|
+
# PERSEGUIR: bola distante. Primeiro corrige o ângulo, só avança
|
|
527
|
+
# quando já está apontado - evita correr em curva e perder a bola de vista.
|
|
528
|
+
FUNCAO perseguir()
|
|
529
|
+
DRIBLAR 0
|
|
530
|
+
MIRAR_BOLA
|
|
531
|
+
SE abs(direcao_bola) > 55 ENTAO
|
|
532
|
+
SE direcao_bola < 0 ENTAO
|
|
533
|
+
GIRAR -0.59
|
|
534
|
+
SENAO
|
|
535
|
+
GIRAR 0.5
|
|
536
|
+
FIM
|
|
537
|
+
SENAO
|
|
538
|
+
ANDAR 0.7
|
|
539
|
+
FIM
|
|
540
|
+
FIM
|
|
541
|
+
|
|
542
|
+
# APROXIMAR: distância intermediária. Mesma lógica do perseguir,
|
|
543
|
+
# com janela de ângulo e passo menores (chegada suave, sem atropelar).
|
|
544
|
+
FUNCAO aproximar()
|
|
545
|
+
DRIBLAR 0
|
|
546
|
+
MIRAR_BOLA
|
|
547
|
+
SE abs(direcao_bola) > 35 ENTAO
|
|
548
|
+
SE direcao_bola < 0 ENTAO
|
|
549
|
+
GIRAR -0.42
|
|
550
|
+
SENAO
|
|
551
|
+
GIRAR 0.45
|
|
552
|
+
FIM
|
|
553
|
+
SENAO
|
|
554
|
+
ANDAR 0.57
|
|
555
|
+
FIM
|
|
556
|
+
FIM
|
|
557
|
+
|
|
558
|
+
# CONTROLAR: bola próxima e sob controle (dribbler ligado).
|
|
559
|
+
# Na condução, quem orienta a trajetória é o GOL (direcao_gol),
|
|
560
|
+
# não mais a bola - aquisição (MIRAR_BOLA) ficou nas fases anteriores.
|
|
561
|
+
# Se a bola escapa para trás (fora do dribbler), volta a mirar a bola.
|
|
562
|
+
FUNCAO controlar()
|
|
563
|
+
DRIBLAR 1
|
|
564
|
+
SE abs(direcao_bola) > 60 ENTAO
|
|
565
|
+
MIRAR_BOLA
|
|
566
|
+
SE direcao_bola < 0 ENTAO
|
|
567
|
+
GIRAR -0.40
|
|
568
|
+
SENAO
|
|
569
|
+
GIRAR 0.40
|
|
570
|
+
FIM
|
|
571
|
+
SENAO
|
|
572
|
+
MIRAR_GOL
|
|
573
|
+
SE abs(direcao_gol) > 32 ENTAO
|
|
574
|
+
SE direcao_gol < 0 ENTAO
|
|
575
|
+
GIRAR -0.34
|
|
576
|
+
SENAO
|
|
577
|
+
GIRAR 0.32
|
|
578
|
+
FIM
|
|
579
|
+
SENAO
|
|
580
|
+
ANDAR 0.37
|
|
581
|
+
FIM
|
|
582
|
+
FIM
|
|
583
|
+
FIM
|
|
584
|
+
|
|
585
|
+
# FINALIZAR: o chute exige bola dominada (à frente) E gol alinhado,
|
|
586
|
+
# nunca só um dos dois (bola desalinhada = chute para fora).
|
|
587
|
+
# Se a bola escapou do dribbler, readquire antes de pensar no gol.
|
|
588
|
+
FUNCAO finalizar()
|
|
589
|
+
SE abs(direcao_bola) > 35 ENTAO
|
|
590
|
+
DRIBLAR 1
|
|
591
|
+
MIRAR_BOLA
|
|
592
|
+
ANDAR 0.30
|
|
593
|
+
SENAO
|
|
594
|
+
MIRAR_GOL
|
|
595
|
+
SE abs(direcao_bola) < 30 E abs(direcao_gol) < 12 ENTAO
|
|
596
|
+
DRIBLAR 0
|
|
597
|
+
CHUTAR
|
|
598
|
+
ENVIAR_RADIO 1
|
|
599
|
+
SENAO
|
|
600
|
+
DRIBLAR 1
|
|
601
|
+
SE direcao_gol < 0 ENTAO
|
|
602
|
+
GIRAR -0.30
|
|
603
|
+
SENAO
|
|
604
|
+
GIRAR 0.30
|
|
605
|
+
FIM
|
|
606
|
+
FIM
|
|
607
|
+
FIM
|
|
608
|
+
FIM
|
|
609
|
+
|
|
610
|
+
# RECUAR: a linha da frente tem prioridade máxima. Solta o dribbler
|
|
611
|
+
# (não puxa a bola para fora junto) e avisa a equipe pelo rádio.
|
|
612
|
+
FUNCAO recuar()
|
|
613
|
+
DRIBLAR 0
|
|
614
|
+
ANDAR -0.6
|
|
615
|
+
GIRAR 0.8
|
|
616
|
+
ENVIAR_RADIO 2
|
|
617
|
+
FIM
|
|
618
|
+
|
|
619
|
+
# PARAR: fim de jogo, intervalo ou emergência - desliga tudo.
|
|
620
|
+
FUNCAO parar_seguro()
|
|
621
|
+
DRIBLAR 0
|
|
622
|
+
PARAR
|
|
623
|
+
FIM
|
|
624
|
+
|
|
625
|
+
# VOLTAR_PARA_DEFESA: linha traseira detectada - sai de ré girando
|
|
626
|
+
# para dentro do campo sem atravessar a linha com a frente.
|
|
627
|
+
FUNCAO voltar_para_defesa()
|
|
628
|
+
DRIBLAR 0
|
|
629
|
+
ANDAR -0.4
|
|
630
|
+
GIRAR 0.6
|
|
631
|
+
FIM
|
|
632
|
+
|
|
633
|
+
# CICLO PRINCIPAL: relógio do jogo, segurança, percepção, decisão.
|
|
634
|
+
SEMPRE
|
|
635
|
+
SE fase == "fim" OU fase == "intervalo" ENTAO
|
|
636
|
+
parar_seguro()
|
|
637
|
+
SENAO
|
|
638
|
+
SE linha_frente ENTAO
|
|
639
|
+
recuar()
|
|
640
|
+
SENAO
|
|
641
|
+
SE linha_tras ENTAO
|
|
642
|
+
voltar_para_defesa()
|
|
643
|
+
SENAO
|
|
644
|
+
SE linha_esq ENTAO
|
|
645
|
+
DRIBLAR 0
|
|
646
|
+
ANDAR -0.4
|
|
647
|
+
GIRAR -0.6
|
|
648
|
+
SENAO
|
|
649
|
+
SE linha_dir ENTAO
|
|
650
|
+
DRIBLAR 0
|
|
651
|
+
ANDAR -0.4
|
|
652
|
+
GIRAR 0.6
|
|
653
|
+
SENAO
|
|
654
|
+
SE ver_bola ENTAO
|
|
655
|
+
SE dist_bola > 0.60 ENTAO
|
|
656
|
+
perseguir()
|
|
657
|
+
SENAO
|
|
658
|
+
SE dist_bola > 0.30 ENTAO
|
|
659
|
+
aproximar()
|
|
660
|
+
SENAO
|
|
661
|
+
SE dist_bola < 0.22 ENTAO
|
|
662
|
+
finalizar()
|
|
663
|
+
SENAO
|
|
664
|
+
controlar()
|
|
665
|
+
FIM
|
|
666
|
+
FIM
|
|
667
|
+
FIM
|
|
668
|
+
SENAO
|
|
669
|
+
procurar()
|
|
670
|
+
FIM
|
|
671
|
+
FIM
|
|
672
|
+
FIM
|
|
673
|
+
FIM
|
|
674
|
+
FIM
|
|
675
|
+
FIM
|
|
676
|
+
FIM
|
|
677
|
+
`
|
|
678
|
+
},
|
|
679
|
+
// --- Primitivas de movimento (§29) -------------------------------------
|
|
680
|
+
{
|
|
681
|
+
id: 'danca_tempo',
|
|
682
|
+
name: '13 · Dança com tempo',
|
|
683
|
+
level: 'Fundamental 1 — movimento temporal',
|
|
684
|
+
code: `# O temporal NÃO trava o simulador: cada instrução dura o seu tempo
|
|
685
|
+
# e o restante do programa segue rodando em paralelo.
|
|
686
|
+
REPETIR 4 VEZES
|
|
687
|
+
ANDAR_POR 0.5, 1
|
|
688
|
+
GIRAR_POR 0.5, 1
|
|
689
|
+
VOLTAR_POR 0.5, 1
|
|
690
|
+
FIM
|
|
691
|
+
PARAR
|
|
692
|
+
`
|
|
693
|
+
},
|
|
694
|
+
{
|
|
695
|
+
id: 'simples',
|
|
696
|
+
name: '14 · Andar, esperar e parar',
|
|
697
|
+
level: 'Fundamental 1 — movimento básico',
|
|
698
|
+
code: `# Três primitivas: anda, espera sem mexer no motor, para.
|
|
699
|
+
ANDAR 0.5
|
|
700
|
+
ESPERAR 2
|
|
701
|
+
PARAR
|
|
702
|
+
`
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
id: 'diferencial',
|
|
706
|
+
name: '15 · Robô diferencial',
|
|
707
|
+
level: 'Fundamental 1 — controle de motores',
|
|
708
|
+
code: `# MOTORES recebe o par (esquerda, direita). Valores iguais andam
|
|
709
|
+
# em linha reta; valores opostos giram no próprio eixo.
|
|
710
|
+
MOTORES 0.5, 0.5
|
|
711
|
+
ESPERAR 2
|
|
712
|
+
MOTORES -0.5, 0.5
|
|
713
|
+
ESPERAR 1
|
|
714
|
+
PARAR
|
|
715
|
+
`
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
id: 'linha_robotics',
|
|
719
|
+
name: '16 · Seguidor de linha (primitivas)',
|
|
720
|
+
level: 'Fundamental 1 — sensores de linha + tempo',
|
|
721
|
+
code: `# Seguidor de linha usando só primitivas Robotics temporais:
|
|
722
|
+
# cada correção dura um tempo e sozinha já para o robô.
|
|
723
|
+
SE linha_frente ENTAO
|
|
724
|
+
VOLTAR_POR 0.5, 0.4
|
|
725
|
+
GIRAR_POR 0.6, 0.3
|
|
726
|
+
SENAO
|
|
727
|
+
SE linha_dir ENTAO
|
|
728
|
+
GIRAR_POR 0.5, 0.3
|
|
729
|
+
SENAO
|
|
730
|
+
SE linha_esq ENTAO
|
|
731
|
+
GIRAR_POR -0.5, 0.3
|
|
732
|
+
SENAO
|
|
733
|
+
ANDAR 0.5
|
|
734
|
+
FIM
|
|
735
|
+
FIM
|
|
736
|
+
FIM
|
|
737
|
+
`
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
id: 'maze_robotics',
|
|
741
|
+
name: '17 · Labirinto com distância real',
|
|
742
|
+
level: 'Fundamental 2 — espacial + estado do movimento',
|
|
743
|
+
code: `# Labirinto: só dá um comando novo quando o anterior terminou
|
|
744
|
+
# (movimento_ativo) e mede a parede de verdade antes de decidir.
|
|
745
|
+
ENQUANTO movimento_ativo FACA
|
|
746
|
+
ESPERAR 0.05
|
|
747
|
+
FIM
|
|
748
|
+
|
|
749
|
+
SE dist_frente < 0.30 ENTAO
|
|
750
|
+
GIRAR_POR 0.6, 0.5
|
|
751
|
+
SENAO
|
|
752
|
+
ANDAR_METROS 0.25
|
|
753
|
+
FIM
|
|
754
|
+
`
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
id: 'soccer_robotics',
|
|
758
|
+
name: '18 · Soccer com primitivas explícitas',
|
|
759
|
+
level: 'Fundamental 2 — tempo, distância e chute',
|
|
760
|
+
code: `# O perseguidor de bola, agora com as primitivas novas:
|
|
761
|
+
# GIRAR_POR/ANDAR_POR quando é só aproximar, ANDAR_METROS quando
|
|
762
|
+
# a bola está ao alcance e o encoder mede a chegada de verdade.
|
|
763
|
+
SE ver_bola ENTAO
|
|
764
|
+
MIRAR_BOLA
|
|
765
|
+
SE dist_bola > 0.35 ENTAO
|
|
766
|
+
ANDAR_POR 0.7, 0.5
|
|
767
|
+
SENAO
|
|
768
|
+
SE abs(direcao_bola) < 15 ENTAO
|
|
769
|
+
CHUTAR
|
|
770
|
+
SENAO
|
|
771
|
+
ANDAR_METROS 0.15
|
|
772
|
+
FIM
|
|
773
|
+
FIM
|
|
774
|
+
SENAO
|
|
775
|
+
GIRAR_POR 0.4, 0.3
|
|
776
|
+
FIM
|
|
777
|
+
`
|
|
778
|
+
}
|
|
779
|
+
];
|
|
780
|
+
//# sourceMappingURL=examples.js.map
|