Que estàs construint

Aquest tutorial et mostra com construir in joc similar al arcade Whac-A-MoleTM. Específicament, el teu objectiu és arribar a un talp que apareix aleatòriament en un de cinc forats fixats. Cada vegada que ho aconsegueixis, la teva puntuació s’incrementarà en un punt.
Per tal de posar de relleu les noves funcions de App Inventor-la fitxa opcions Avançades i les capes Z per als Sprites-aquesta aplicació té un enfocament diferent al tutorial original de Mole Mash , el qual no és necessari haver realitzat amb la finalitat de fer aquest. Has, de tota manera, estar familiaritzat amb els fonaments de App Inventor – l’ús del Dissenyador de components per construir una interfície d’usuari i ús de l’Editor de blocs per especificar controladors d’esdeveniments.
Introducció
Aquest tutorial inclou:
- Creació d’una llista dels components
- L’ús de la funcionalitat de la secció Avançat de l’Editor de blocs per obtenir i establir propietats arbitràries per als components
- Tenir esdeveniments del joc controlats pel component Clock
- L’ús de capes en Z per assegurar que un sprite (ImageSprite o una Ball) apareix per davant d’un altre
Primers passos
Connecta’t a la pàgina web de App Inventor i comença un nou projecte. Estableix la propietat del títol de la pantalla Title a nom apropiat, com “Mole Mash”. Obre l’Editor de blocs i conéctalo al telèfon. Descàrrega aquests arxius d’imatge (creats per Yun Miao) fent clic dret sobre ells, i després afegeix-los al projecte prement el botó “Afegeix …” en el panell de mitjans.
![]() |
![]() |
| hole.png | mole.png |
Configuració dels components
La interfície d’usuari contindrà un total de 6 ImageSprites: 5 forats immòbils i 1 talp, que es mourà a la part superior dels forats. Utilitza el dissenyador de components per crear la interfície d’usuari. Quan hagis acabat, ha de ser semblant a la imatge de sota. No et preocupis per alinear els forats de manera uniforme. Hauràs especificar la seva localització a través de les seves propietats X i Y. Les instruccions addicionals estan per sota de la imatge.

Crea els següents components arrossegant des de la paleta al visor.
| Tipus de component | Grup de la Paleta | Com ho nombrarás | Objectiu del component |
| Canvas | Basic | GameCanvas | El camp de joc |
| ImageSprite (5) | Animation | Hole1, …, Hole5 | Forats per aparèixer el talp |
| ImageSprite | Animation | Mole | El talp |
| HorizontalArrangement | ScreenArrangement | ScoreArrangement | Per veure la puntuació |
| Label | Basic | ScoreTextLabel | Per mantenir “Puntuació:” |
| Label | Basic | ScoreValueLabel | Per mantenir la puntuació (nombre de vegades que s’assoleix al talp) |
| Clock | Basic | MoleClock | Per controlar el moviment del talp |
| Sound | Mitjana | Buzzer | Perquè vibri quan es toca el talp |
Fes els següents canvis en les propietats dels components:
| Component | Acció |
| Canvas1 | Canvia BackgroundColor a Verd. Canvia Width a 320 píxels. Canvia Height a 320 píxels. |
| Hole1 | Canvia X a 20 i Y a 60 (a dalt esquerra). |
| Hole2 | Canvia X a 130 i Y a 60 (dalt centre). |
| Hole3 | Canvia X a 240 i Y a 60 (a dalt dreta) |
| Hole4 | Canvia X a 75 i Y a 140 (baix esquerra). |
| Hole5 | Canvia X a 185 i Y a 140 (baix dreta). |
| Mole | Canvia Picture a “mole.png”. Canvia Z a 2 perquè el talp aparegui per davant dels altres ImageSprites, que per defecte tenen valor 1 per Z. |
| ScoreTextLabel | Canvia Text a “Score:”. |
| ScoreTextValue | Canvia Text a “0”. |
No hi fa la configuració de la propietat de Picture per als forats; anem a establir la propietat en l’Editor de blocs.
Afegir comportaments als components
Heus aquí un resum del que necessitem crear amb els blocs:
- Crear variables:
- holes: una llista dels forats
- currentHole: el forat del qual el talp està sortint
- Quan l’aplicació s’inicia:
- Completar la llista dels forats.
- Establir la propietat Picture de cada forat a “hole.png”.
- Trucar al procediment MoveMole (baix).
- Crear un procediment per MoveMove per:
- Establir currentHole a un forat a l’atzar de la llista holes.
- Moure el talp a la ubicació de currentHole.
- Fer que MoleClock truqui a MoveMole cada vegada que el temporitzador es dispari (cada segon).
- Implementar un controlador que fa el següent quan el talp es toca:
- Afegeix un a la puntuació.
- Fer que el telèfon vibri.
- Trucar a MoveMole.
Per continuar, obre l’Editor de blocs.
Creació de variables
Crea les variables holes i currentHole. Per ara, els donarem “falsos” valors inicials, anem a establir els seus valors inicials reals al controlador d’esdevenimentsScreen1.Initialize, que s’executa quan l’aplicació s’inicia. (Per raons tècniques, els components no pot ser referits als blocs def, que s’executen abans que l’aplicació s’iniciï) Aquí hi ha una imatge i la llista dels blocs que es necessiten:

| Tipus de bloc | Calaix | Propòsit |
| def variable es (holes) | Definition | Mantenir una llista dels forats. |
| make a list | Lists | Crear una llista buida, que s’omple quan s’inicia el programa. |
| def variable es (currentHole) | Definition | Mantenir el forat actual del talp. |
| number (0) | Numbers | Proporcionar un valor inicial requerit per currentHole. |
Com sempre, els comentaris (crear blocs amb el botó dret del ratolí) es recomana però no és obligatori.
Iniciant l’aplicació
El primer esdeveniment es produeix en qualsevol programa en Screen1.Initialize, pel que posarem el codi d’inici a aquest controlador. En concret, anem a afegir els components dels forats a la llista holes, establirem la propietat Picture de cada forat a la imatge “hole.png”, i anomenarem a MoveMole. Com que encara no hem escritMoveMole, crearem un procediment buit amb aquest nom, que anem a omplir més tard.
A continuació hi ha una imatge i la taula dels elements que necessites crear. Tingues en compte que el calaix “Any ImageSprite” (Qualsevol ImageSprite) es troba sota la pestanya “Advanced” a la dreta de “Built-In” i “My Blocks” en l’Editor de blocs.

| Tipus de bloc | Calaix | Propòsit |
| Screen1.Initialize | Screen1 | Especifiqueu ha de passar quan l’aplicació s’inicia. |
| add items to list | Lists | Afegeix els valors a … |
| holes | My Definitions | … La llista de forats: |
| component Hole1 | Hole1 | • Forat de la part superior esquerra |
| component Hole2 | Hole2 | • El forat central superior |
| component Hole3 | Hole3 | • L’orifici superior dret |
| component Hole4 | Hole4 | • L’orifici inferior esquerre |
| component Hole5 | Hole5 | • L’orifici inferior dret |
| foreach | Control | Especificar que ens agradaria … |
| name (hole) | Definitions | … Una variable anomenada “hole” … |
| holes | My Definitions | … A prendre en cada un dels valors de la llista holes. |
| ImageSprite.Picture | Any Image Sprite | Establir la propietat Picture de … |
| value hole | My Definitions | … El ImageSprite que fa referència a la variable hole … |
| text (hole.png) | Text | … A la imatge del forat buit. |
| to procedure (MoveMole) | Definition | Crear un procediment, que han de completar més tard, per moure el talp. |
| MoveMole | My Definitions | Trucar a MoveMole per a la primera col · locació del talp. |
Compara el bloc foreach amb els blocs equivalents que serien necessaris sense ell:
| Nou | Vell |
|---|---|
![]() |
![]() |
No només el conjunt de blocs l’esquerra és més curt, és menys repetitiu, evitant que el programador sigui semi-inconscient en copiar i enganxar, i és més fàcil de modificar, per exemple, si el nom de la imatge ha canviat.
Movent el Talp
Ara anem a omplir el cos del procediment MoveMole, que anomenarem quan s’inicia el programa, quan es toca el talp, i quan el nostre comptador de temps es dispari cada segon. El que volem fer és escollir a l’atzar un forat i posar al talp sobre. Aquí hi ha una imatge i la llista dels nous blocs:

| Tipus de bloc | Calaix | Propòsit |
| setembre currentHole to | My Definitions | Guardar el … |
| call pick random item | Lists | … Seleccionat a l’atzar … |
| holes | My Definition | … Forat. |
| call Mole.MoveTo | Mole | Mou el talp a la … |
| ImageSprite.X | Advanced / ImageSprite | .. Coordenada x de … |
| currentHole | My Definitions | … El forat escollit … |
| ImageSprite.Y | Advanced / ImageSprite | … I la coordenada i de … |
| current Hole | My Definitions | … El forat escollit. |
Ara hem de especificar que MoveMole ha de ser cridat cada vegada que el temporitzador MoleClock Timer es dispari. Només necessitem dos blocs per fer-ho:

| Tipus de bloc | Calaix | Propòsit |
| MoleClock.Timer | MoleClock | Quan el temporitzador acaba … |
| call MoveMole | My Definitions | … Mou el talp. |
Registre de tocs
Finalment, hem de especificar el que passa quan el talp es toca. En concret, volem:
- Incrementar la puntuació.
- Fer que el telèfon vibri breument.
- Moure el talp.
És fàcil traduir aquests als blocs:

| Mole.Touched | Mole | Quan el talp es toca … |
| setembre ScoreValueLabel.Text to | ScoreValueLabel | … Actualitza la puntuació visible a … |
| + | Math | … El resultat de sumar … |
| number (1) | Math | … 1 [i] … |
| ScoreValueLabel.Text | ScoreValueLabel | … La puntuació anterior. |
| call Buzzer.Vibrate | Buzzer | Fa que el telèfon vibri … |
| number (100) | Math | … 100 mil · lisegons. |
| call MoveMole | My Definitions | Mou el talp a una nova ubicació. |
Programa Final

Variacions
Aquestes són algunes de les variacions és possible que vulguis posar en pràctica:
- Afegir un botó de reinici per establir la puntuació a 0.
- Fer la puntuació dependent no només de la quantitat d’encerts, sinó també del nombre de fallades i que el talp va escapar.
- Augmentar la velocitat del moviment del talp en el joc, si el jugador ho està fent bé i disminuir-si el jugador ho està fent malament.
- Afegir un segon talp amb un temporitzador diferent.
Pots veure la manera d’aplicar les dues primeres variacions en el tutorial original de Mole Mash .
Revisió
Aquestes són algunes de les idees que es tracten en aquest tutorial:
- La col · locació de components en una llista List.
- Realitzar una operació a cada component en List (una llista) utilitzant el bloc foreach i característiques avançades.
- Col · locar un ImageSprite sobre d’un altre, utilitzant la seva propietat Z per controlar que va davant.
- L’ús del component Clock (rellotge) per controlar el joc.
- Creació d’un procediment i cridar des de múltiples llocs.














































