Laberints (II)

En la pràctica anterior vàrem veure com resoldre laberints simples tot donant-li al nostre ninot dos comportaments, l'un és buscar una paret i posar-la a l'esquerre de la trajectòria del ninot i l'altre caminar sempre amb aquesta paret a la seva esquerra. Anem a veure si podem afegir altres comportaments al ninot perquè pugui resoldre problemes més complexos; laberints que tinguin illes, és a dir, que si seguim una paret determinada podem acabar caminant en cercle. El primer que hem d'aconseguir és que el nostre ninot sigui capaç d'adonar-se del que està passant, prendre consciencia de que està donant voltes sobre el mateix punt. Podem dissenyar diferents estratègies per aconseguir el nostre objectiu, per exemple ensenyar al nostre ninot a dibuixar i a llegir mapes, això és un xic complicat i, de moment ho deixarem i optarem pel mètode "polzet", o sigui deixar marques sobre el terreny i utilitzar-les per a determinar la nostra situació. Simplificarem inclús el mètode de la forma següent; quan arribem a una paret deixarem un senyal, si al cap d'un temps tornem a trobar-nos aquest senyal voldrà dir que ens estem movent en cercles, per tant farem que el ninot funcioni així per solucionar-ho: primer esborrarà la senyal deixada, després buscarà una nova paret amb un mètode que tingui quelcom d'aleatori i tornarà a començar el procés; deixar marca, seguir esquerre, sortir del laberint o trobar de nou una marca. Aquest sistema no garanteix que sempre surti del laberint, però millora les nostres possibilitats de fer-ho.

Tot seguit veurem com fer-ho, afegirem un nou vestit, com es mostra a la imatge següent, que ens servirà per deixar un senyal vermell quan l'hi indiquem nosaltres i, al vestit principal l'hi afegim una marca groga que actuarà de sensor

Abans de començar a escriure el nou codi dibuixarem un laberint com el de la imatge següent, i en el qual dibuixarem també una marca blava que ens indicarà la casella de terminació.

Recuperarem el codi de la pràctica anterior i el modificarem de la següent manera, perquè en tocar una paret deixi una marca nova.

Ara que hem col·locat la marca, hem d'afegir-hi codi, per tal que el ninot el detecti; fixem-nos que el ninot té una marca groga en el seu muscle esquerre que utilitzarem com a sensor per detectar el senyal vermell. També hi haurem d'afegir la detecció de final de laberint. Vegem el codi i després el comentem.

El primer que farem serà crear un bucle que es repetirà fins que aconseguim la condició de fi, taronja sobre blau (és a dir, el ninot sobre la marca blava de final), la primera instrucció del bucle veiem que es 'enviar a tots mou i esperar', el bloc que s'inicia com 'mou' encara no l'hem escrit.

Si observem aquest codi, veiem que és molt semblant al que hem utilitzat en la pràctica 1, però aquí hem esborrat el 'repetir per sempre' i l'esperar 0.1 segons' ja que això ho fa el bloc anterior. Veiem que en el codi també hem utilitzant el missatge "nova"; aquest missatge l'enviarem quan trobem un senyal vermell que ens indica que ja hem passat per aquesta casella, en aquest cas hem de buscar una nova paret i començar altra vegada el procés; vegem el codi del bloc 'nova'.

El primer que fem en codi és esborrar el senyal vermell, per això necessitem crear un altre vestit per al nostre ninot; dibuixem un vestit igual que el vermell però amb el punt blanc, que en estampar-lo esborri el senyal vermell; després generem un número aleatori (que guardem en una variable 's') i repetim el bloc 'mou' les vegades que indiqui el número. Girem 90º per no tenir la paret a l' esquerra i busquem una nova paret, per fer això hem de crear un nou missatge 'buscaP'. Ara modificarem el bloc que vàrem inicia amb la bandera verda, per tal que respongui al missatge 'buscaP'.

Veiem que en aquest darrer codi apareix el missatge 'seguir'. Aquest missatge engegarà el bloc que abans hem deixat sense encapçalament, veiem-ho.

Solament falta escriure un petit bloc per arrencar el programa des de la bandera verda i fixar les condicions d'inici.

Ara, si arrosseguem amb el ratolí el ninot a qualsevol casella del tauler (cal que la quadrícula encaixi exactament) i fem clic en la bandera verda, aquest tornarà sempre (o gairebé sempre) a la posició de sortida del laberint. Recordem que per a poder moure el ninot amb el ratolí en mode pantalla completa és necessari desbloquejar el cadenat del panell del ninot.