El vocabulari complet d'en Karel
Ja coneixes les instruccions bàsiques, els bucles, les condicions i els procediments. En aquest capítol completem el vocabulari d'en Karel amb eines que et permetran resoldre problemes més ambiciosos: mirar als costats, decidir entre tres o més opcions, i algunes convencions que fan el codi més net.
Girar en rodó: turn_around()
Ja coneixes turn_around() del capítol 5. Aquí el formalitzem: turn_around() fa que en Karel giri 180° sense moure's de casella. Si mirava l'Est, ara mira l'Oest. Si mirava el Nord, ara mira el Sud.
És equivalent a fer turn_left() dues vegades seguides (o turn_right() dues vegades). Tria el que et sembli més clar en cada situació.
Observa com en Karel va fins al final del corredor i torna:
La variable que no cal: _
Quan escrius for i in range(5):, la i és un nom que es crea automàticament per comptar les repeticions. Però en Karel no fem servir mai aquest comptador: només volem repetir N vegades.
En Python, quan un nom existeix però no el necessites, la convenció és escriure _ (guió baix) en lloc d'una lletra:
for _ in range(5):
move()
El programa fa exactament el mateix. La diferència és de comunicació: _ li diu a qui llegeix el codi «no necessito aquest valor, només vull repetir». Al llarg del curs i dels reptes trobaràs les dues formes: tria la que et sembli més natural.
Mirar als costats: left_is_clear() i right_is_clear()
Fins ara, en Karel només podia mirar endavant: front_is_clear() i front_is_blocked(). Però de vegades necessita saber si té un camí lliure al costat sense haver de girar, mirar, i tornar a girar.
Dues condicions noves:
left_is_clear()— la casella que queda a l'esquerra d'en Karel és lliure?right_is_clear()— la casella que queda a la dreta d'en Karel és lliure?
Cap de les dues mou ni gira en Karel. Només responen una pregunta.
En l'exemple següent, en Karel camina per un corredor. Cada cop que detecta una obertura a la dreta, hi fa una incursió i torna:
Aquí tens la taula completa de condicions d'en Karel:
# Condicions de moviment
front_is_clear() # el davant és lliure?
front_is_blocked() # el davant té obstacle?
left_is_clear() # l'esquerra és lliure?
right_is_clear() # la dreta és lliure?
# Condicions del món
pearl_here() # hi ha una perla aquí?
bag_is_empty() # la motxilla és buida?
Tres camins: if / elif / else
Fins ara hem vist if (una alternativa) i if/else (dues alternatives). Però què passa quan hi ha tres possibilitats?
Per exemple: «si la dreta és lliure, gira a la dreta i avança; si no, si el davant és lliure, avança recte; si tampoc, gira a l'esquerra». Amb if i else imbricats:
if right_is_clear():
turn_right()
move()
else:
if front_is_clear():
move()
else:
turn_left()
Funciona, però cada else afegeix un nivell d'indentació. Amb quatre o cinc casos, el codi se'n va cap a la dreta i costa de llegir.
elif (contracció de «else if») resol el problema. Afegeix una condició nova al mateix nivell:
if right_is_clear():
turn_right()
move()
elif front_is_clear():
move()
else:
turn_left()
Les dues versions fan exactament el mateix. Però la versió amb elif és plana: totes les opcions estan al mateix nivell d'indentació. En programació, «pla» sol significar «fàcil de llegir».
Regla: un if pot tenir tants elif com vulguis, però només un else al final. L'else és opcional.
Observa com en Karel navega un petit laberint amb la lògica de tres casos:
Exercici
1) Si hi ha una perla, recull-la.
2) Si no hi ha perla però la dreta és lliure, gira a la dreta, avança, comprova si hi ha perla (i recull-la si n'hi ha), i torna al corredor.
3) Si cap de les dues anteriors, simplement avança.
Usa
if, elif i else dins d'un while front_is_clear():.