{"id":3002,"date":"2021-01-20T12:03:59","date_gmt":"2021-01-20T12:03:59","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=3002"},"modified":"2021-01-20T12:49:10","modified_gmt":"2021-01-20T12:49:10","slug":"videoconsola-klax","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/","title":{"rendered":"VIDEOCONSOLA KLAX"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1024x576.png\" alt=\"\" class=\"wp-image-3126\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1024x576.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-300x169.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-768x432.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Autores:<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Guillermo J. G\u00aa-Delgado \u00c1lvarez<\/li><li>Eva Pastor Ab\u00e1nades<\/li><li>Iv\u00e1n Rodr\u00edguez Garc\u00eda<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Idea del proyecto:<\/h3>\n\n\n\n<p>El videojuego que hemos desarrollado toma inspiraci\u00f3n de \u201cKlax de Atari 1989\u201d y para el dise\u00f1o de la m\u00e1quina, que cumple el papel de consola, se ha usado como referencia la \u201cMesa TETRIS casera con LEDs RGB Direccionables de ELECTRONOOBS\u201d.<\/p>\n\n\n\n<p>Esta m\u00e1quina se divide en cuatro elementos: la zona superior del tablero (donde caen los bloques de colores), la l\u00ednea intermedia o l\u00ednea de captura (que tiene un hueco que retiene al bloque que cae), una zona inferior del tablero donde se almacenan los bloques que deje caer el jugador donde \u00e9l decida y, por \u00faltimo, la zona de los mandos (donde est\u00e1n los botones, el joystick y un regulador del brillo de las luces).<\/p>\n\n\n\n<p>Para conseguir puntos, el jugador colocar\u00e1 dichos bloques intentando alinearlos en grupos de 3 o m\u00e1s; mientras que si no consigue soltar el bloque que ha capturado antes de que le llegue un nuevo bloque o no coloca bien el hueco para capturarlo, el jugador perder\u00e1 puntos y la zona de captura parpadear\u00e1 en rojo.<\/p>\n\n\n\n<p>El \u201cGame over\u201d se producir\u00e1 cuando los bloques se acumulen en la zona inferior del tablero y alcancen la l\u00ednea de captura o cuando la puntuaci\u00f3n baje a cero.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Materiales:<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>ART\u00cdCULO<\/td><td>CANTIDAD<\/td><td>PRECIO\/UNIDAD<\/td><td>PRECIO TOTAL<\/td><td>ENLACE DE COMPRA<\/td><\/tr><tr><td>LED STRIP<\/td><td>68<\/td><td>0,08<\/td><td>5,44<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/2036819167.html?spm=a2g0o.productlist.0.0.2e0965c4pJStjE&amp;algo_pvid=ec7f26fd-c0b3-413c-a530-17a1a0491b74&amp;algo_expid=ec7f26fd-c0b3-413c-a530-17a1a0491b74-34&amp;btsid=0b0a050b16105484575454056e7573&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/2036819167.html?spm=a2g0o.productlist.0.0.2e0965c4pJStjE&amp;algo_pvid=ec7f26fd-c0b3-413c-a530-17a1a0491b74&amp;algo_expid=ec7f26fd-c0b3-413c-a530-17a1a0491b74-34&amp;btsid=0b0a050b16105484575454056e7573&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Botones<\/td><td>6<\/td><td>0,06<\/td><td>0,36<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/33046945784.html?spm=a2g0o.productlist.0.0.ee675499usGbIz&amp;algo_pvid=35e428b1-3a41-465e-bd7f-5587105c82cd&amp;algo_expid=35e428b1-3a41-465e-bd7f-5587105c82cd-17&amp;btsid=2100bdd816105483518634863ef163&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/33046945784.html?spm=a2g0o.productlist.0.0.ee675499usGbIz&amp;algo_pvid=35e428b1-3a41-465e-bd7f-5587105c82cd&amp;algo_expid=35e428b1-3a41-465e-bd7f-5587105c82cd-17&amp;btsid=2100bdd816105483518634863ef163&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>toggle switch<\/td><td>1<\/td><td>2,23<\/td><td>2,23<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/4000389806008.html?spm=a2g0o.productlist.0.0.20956813wUOuMr&amp;algo_pvid=e0e3552e-1fda-490c-98fa-3c8c7b37e3d6&amp;algo_expid=e0e3552e-1fda-490c-98fa-3c8c7b37e3d6-0&amp;btsid=2100bb4a16105444320893520ec7a4&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/4000389806008.html?spm=a2g0o.productlist.0.0.20956813wUOuMr&amp;algo_pvid=e0e3552e-1fda-490c-98fa-3c8c7b37e3d6&amp;algo_expid=e0e3552e-1fda-490c-98fa-3c8c7b37e3d6-0&amp;btsid=2100bb4a16105444320893520ec7a4&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Joystick<\/td><td>1<\/td><td>0,54<\/td><td>0,54<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/32677559259.html?spm=a2g0o.productlist.0.0.4d9c75d8lED1Iq&amp;algo_pvid=9b5b4d1b-2a0b-4cdd-b531-ab8b4e6215a2&amp;algo_expid=9b5b4d1b-2a0b-4cdd-b531-ab8b4e6215a2-10&amp;btsid=0b0a182b16105438414296329e5807&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/32677559259.html?spm=a2g0o.productlist.0.0.4d9c75d8lED1Iq&amp;algo_pvid=9b5b4d1b-2a0b-4cdd-b531-ab8b4e6215a2&amp;algo_expid=9b5b4d1b-2a0b-4cdd-b531-ab8b4e6215a2-10&amp;btsid=0b0a182b16105438414296329e5807&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Potenci\u00f3metro<\/td><td>1<\/td><td>1,67<\/td><td>1,67<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/4000098635621.html?spm=a2g0o.productlist.0.0.44d06ec4S6yTFK&amp;algo_pvid=79090242-9fea-4799-87df-7ffef775242f&amp;algo_expid=79090242-9fea-4799-87df-7ffef775242f-12&amp;btsid=2100bde716105485851118917e919a&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/4000098635621.html?spm=a2g0o.productlist.0.0.44d06ec4S6yTFK&amp;algo_pvid=79090242-9fea-4799-87df-7ffef775242f&amp;algo_expid=79090242-9fea-4799-87df-7ffef775242f-12&amp;btsid=2100bde716105485851118917e919a&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Buzzer<\/td><td>1<\/td><td>1,19<\/td><td>1,19<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/32978143497.html?spm=a2g0o.productlist.0.0.3e6fa35dj7pQJx&amp;algo_pvid=7cd032d6-b336-4831-805b-f79eea03de3f&amp;algo_expid=7cd032d6-b336-4831-805b-f79eea03de3f-0&amp;btsid=2100bdd516110882458307692eb465&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/32978143497.html?spm=a2g0o.productlist.0.0.3e6fa35dj7pQJx&amp;algo_pvid=7cd032d6-b336-4831-805b-f79eea03de3f&amp;algo_expid=7cd032d6-b336-4831-805b-f79eea03de3f-0&amp;btsid=2100bdd516110882458307692eb465&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Pila 9V<\/td><td>1<\/td><td>5,11<\/td><td>5,11<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/4001171825889.html?spm=a2g0o.productlist.0.0.38b843ddUgtv5s&amp;algo_pvid=329e9ae7-7307-4f26-9989-3d465ce844ac&amp;algo_expid=329e9ae7-7307-4f26-9989-3d465ce844ac-1&amp;btsid=0b0a187916105486925232578ea5ae&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/4001171825889.html?spm=a2g0o.productlist.0.0.38b843ddUgtv5s&amp;algo_pvid=329e9ae7-7307-4f26-9989-3d465ce844ac&amp;algo_expid=329e9ae7-7307-4f26-9989-3d465ce844ac-1&amp;btsid=0b0a187916105486925232578ea5ae&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Adaptador pila<\/td><td>1<\/td><td>0,29<\/td><td>0,29<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/1097854909.html?spm=a2g0o.productlist.0.0.340d63d1Z9Xc3z&amp;algo_pvid=08e9611c-0871-4da4-9e7d-1e309870deef&amp;algo_expid=08e9611c-0871-4da4-9e7d-1e309870deef-6&amp;btsid=2100bdd816105487515391655ef152&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/1097854909.html?spm=a2g0o.productlist.0.0.340d63d1Z9Xc3z&amp;algo_pvid=08e9611c-0871-4da4-9e7d-1e309870deef&amp;algo_expid=08e9611c-0871-4da4-9e7d-1e309870deef-6&amp;btsid=2100bdd816105487515391655ef152&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td>Arduino 1<\/td><td>1<\/td><td>2,93<\/td><td>2,93<\/td><td><a href=\"https:\/\/es.aliexpress.com\/item\/32272099710.html?spm=a2g0o.productlist.0.0.158d62de2HDHDl&amp;algo_pvid=bb70b5ab-5141-4280-9797-7d59b0e06c3e&amp;algo_expid=bb70b5ab-5141-4280-9797-7d59b0e06c3e-0&amp;btsid=0b0a050b16105486505215583e757d&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_\">https:\/\/es.aliexpress.com\/item\/32272099710.html?spm=a2g0o.productlist.0.0.158d62de2HDHDl&amp;algo_pvid=bb70b5ab-5141-4280-9797-7d59b0e06c3e&amp;algo_expid=bb70b5ab-5141-4280-9797-7d59b0e06c3e-0&amp;btsid=0b0a050b16105486505215583e757d&amp;ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_<\/a><\/td><\/tr><tr><td><\/td><td><\/td><td>TOTAL:<\/td><td>18,57<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware de la m\u00e1quina:<\/h2>\n\n\n\n<p>Todo esto sin contar con los materiales para la caja, que son extra dado que cumplen una funci\u00f3n meramente est\u00e9tica.<\/p>\n\n\n\n<p>La m\u00e1quina cuenta con una zona de leds de 5 columnas y 12 filas que act\u00faan como pantalla del juego, y una zona inferior destinada a la interacci\u00f3n del jugador a modo de mandos. Esta \u00faltima cuenta con una tira de 8 leds en fila que indican la puntuaci\u00f3n, 6 botones cuyas funciones se explicar\u00e1n m\u00e1s adelante, un <em>joystick<\/em> y un potenci\u00f3metro que regula la intensidad de las luces. En el lateral de la caja se encuentra el agujero que permite conectar la m\u00e1quina al ordenador y subir el c\u00f3digo, y un <em>toggle switch<\/em> que permite el paso de corriente de una pila de 9V dentro de la caja, para as\u00ed no tener que conectarlo al ordenador.<\/p>\n\n\n\n<p>A continuaci\u00f3n se mostrar\u00e1 una versi\u00f3n simplificada de Tinkercard:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" width=\"395\" height=\"462\" src=\"https:\/\/lh3.googleusercontent.com\/2ehO8OsaAaxShFfQ2cXX9vXAL8aSfN3QVglaQqmSCV09Ijj_8IZvYyenCbWiBkTBf0YewMX94Ds_4EJ0vorxOadhWAicAv3ZHZignQK4IYGmaWdYZIm4Aqo5GoXC7A\"><\/p>\n\n\n\n<p>En esta imagen se muestran los pines utilizados: 13 y 2 para los leds, 10-5 para los botones, el 4 para el <em>buzzer<\/em> y el A2 conectado al potenci\u00f3metro. Estos se han tanto a ground (los botones y el <em>buzzer<\/em> con sus respectivas resistencias), como a la conexi\u00f3n de 5v con ayuda de la motherboard. Tambi\u00e9n podemos observar que las conexiones de la tira de leds de 5&#215;12 se han unido de manera vertical, a pesar de tener un mayor gasto de cables, para facilitar la programaci\u00f3n.<\/p>\n\n\n\n<p>El diagrama mostrado anteriormente no consta de Joystick, por lo que este ser\u00e1 explicado a continuaci\u00f3n:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" width=\"218\" height=\"92\" src=\"https:\/\/lh4.googleusercontent.com\/hboSFruTeORX9e7ZZgF24NN0EqRS0tEMXX1EBICYRh6kfM_Jd8T4oW6wX6s-GKjxGXv0QXj6ySNlIOQyGcJhmvM271mfsBdmX7Q3lfdJR8idRYd3a5xNpk3M95l09g\"><\/p>\n\n\n\n<p>Se ha conectado el GND de este componente al Ground, y el Vcc a la energ\u00eda. El SW se ha conectado al pin 11, el Vrx al pin A0 y el Vry al pin A1; pero no se han utilizado para este proyecto.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" width=\"212\" height=\"103\" src=\"https:\/\/lh4.googleusercontent.com\/KM4v-mNy9xyppaQN-kW_snVojKbKsr2TxOSltKMd6XbP1GKXwJUtk7Dd3JifCRt93qaxCIcQN_1k8hI919B7oY2D9fo_ZShv4WcDC_gg6qLkk1px8IJgi10mUF-sGw\"><\/p>\n\n\n\n<p>El <em>toggle switch<\/em> permite cortar o darle electricidad a nuestro proyecto cuando sea necesario con ayuda de una pila de 9V. Una parte va al positivo de la pila,\u00a0 otra parte al Vin del arduino, y la parte ground va directamente al ground del arduino.<\/p>\n\n\n\n<p>En resumen: los componentes que hemos usado se han conectado de la siguiente forma: pines 13 y 2 para los LEDS, 10-5 para los botones, 4 para el buzzer, A0 para el joystick y A2 para el potenci\u00f3metro. Adem\u00e1s se conect\u00f3 la pila al toggle switch para dar corriente a la videoconsola.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento de la m\u00e1quina:<\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"720\" src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/01\/Principio-edited.png\" alt=\"\" class=\"wp-image-3133\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/Principio-edited.png 405w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/Principio-edited-169x300.png 169w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Para encender la m\u00e1quina se accede al <em>toggle switch<\/em>, que abre la corriente de la pila de alimentaci\u00f3n que est\u00e1 incorporada en el sistema.<\/li><li>Para mover el hueco que atrapa bloques manejado por el jugador se pueden pulsar tanto el joystick como los botones negros en la parte derecha inferior de la zona de comandos.<\/li><li>Si se desea aumentar la velocidad de ca\u00edda de los bloques se presionar\u00e1 el bot\u00f3n azul.<\/li><li>Cuando se quiera atrapar un bloque que caiga por la zona superior de la pantalla, se deber\u00e1 posicionar el hueco vac\u00edo de la l\u00ednea blanca controlado por el jugador en la misma columna que el que se desee atrapar.<\/li><li>Una vez tenga un bloque atrapado podr\u00e1 soltarlo pulsando el bot\u00f3n amarillo cuadrado.<\/li><li>Al pulsar el bot\u00f3n redondo blanco se pausar\u00e1 el juego y cuando se pulse el bot\u00f3n redondo amarillo se silenciar\u00e1.<\/li><li>En la zona superior de los mandos, adem\u00e1s de los botones, joystick, etc, tambi\u00e9n se encuentran una serie de leds alineados que representan la puntuaci\u00f3n del jugador.<\/li><li>Si el jugador consigue alinear tres o m\u00e1s bloques del mismo color en cualquier direcci\u00f3n conseguir\u00e1 500 puntos. Por cada 1000 puntos conseguidos se encender\u00e1 una luz de la fila de leds que representan la puntuaci\u00f3n.<\/li><li>Si el jugador no es capaz de atrapar un bloque se le restar\u00e1 1000 puntos, la zona intermedia de la pantalla parpadear\u00e1 en color rosa y se apagar\u00e1 un led de puntuaci\u00f3n.<\/li><li>El jugador escuchar\u00e1 una m\u00fasica feliz si consigue puntos, y una m\u00fasica triste si los pierde o si pierde el juego.<\/li><li>El \u201cgame over\u201d se produce cuando no quedan puntos o cuando no queda hueco en la zona de apilar bloques (la zona inferior de la pantalla).<\/li><li>Cuando se produzca el \u201cgame over\u201d sonar\u00e1 la m\u00fasica triste y la pantalla entera se pintar\u00e1 de rosa con las letras \u201cK.O.\u201d en amarillo en la zona superior y un parpadeo en la zona inferior.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Problemas y conclusiones:<\/h2>\n\n\n\n<p>Por lo general, no han habido problemas m\u00e1s all\u00e1 de descartar las primeras ideas por cuestiones de precios y tiempos de llegada de algunos componentes. Una vez estuvimos desarrollando la idea definitiva las fases m\u00e1s complejas fueron, por un lado la soldadura de los leds, que es algo muy delicado y a lo que se le tuvo que dedicar bastante tiempo, y por otro el c\u00f3digo definitivo, cuya base se program\u00f3 r\u00e1pidamente pero muchas funcionalidades y su posterior refinamiento tom\u00f3 mucho esfuerzo.<\/p>\n\n\n\n<p>M\u00e1s all\u00e1 de esto se ha desarrollado la m\u00e1quina sin contratiempos ni problemas graves de \u00faltima hora, por lo que estamos muy contentos con el resultado obtenido. Pensamos que hemos creado una consola tan divertida como r\u00fastica, y con bastante personalidad.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video demostraci\u00f3n:<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/01\/VIDEOPRUEBA.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo:<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;Adafruit_NeoPixel.h&gt;\n\n\/\/Configuraci\u00f3n de los LEDs.\n#define SCREEN_COLUMN 5\n#define SCREEN_ROW 12\n#define LEDS_COLUMN 8\n#define SCREEN_NUM_LEDS (SCREEN_COLUMN*SCREEN_ROW)\n#define SCREEN_PIN 13\n#define LEDS_PIN 2\n#define NUM_COLOR 8\n\nAdafruit_NeoPixel screen_pix = Adafruit_NeoPixel(SCREEN_NUM_LEDS, SCREEN_PIN, NEO_GRB + NEO_KHZ800);\nAdafruit_NeoPixel leds_pix = Adafruit_NeoPixel(LEDS_COLUMN, LEDS_PIN, NEO_GRB + NEO_KHZ800);\n\nstruct Color{\n  uint8_t r;\n  uint8_t g;\n  uint8_t b;\n  \n  Color(uint8_t red, uint8_t green, uint8_t blue){\n    r = red;\n    g = green;\n    b = blue;\n  }\n  Color(){\n    r = 0;\n    g = 0;\n    b = 0;\n  }\n};\n\nColor colorRed = Color(255, 0, 0); \/\/ROJO\nColor colorOrange = Color(255, 69, 0); \/\/NARANJA\nColor colorYellow = Color(255, 255, 0); \/\/AMARILLO\nColor colorGreen = Color(0, 128, 0); \/\/VERDE\nColor colorCyan = Color(0, 255, 255); \/\/AZUL CYAN\nColor colorBlue = Color(0, 0, 255); \/\/AZUL OSCURO\nColor colorWhite = Color(255, 255, 255); \/\/ BLANCO\nColor colorBlack = Color(0, 0, 0); \/\/ NEGRO\n\nColor colores[NUM_COLOR] = {colorBlack, colorWhite, colorRed, colorOrange, colorYellow, colorGreen, colorCyan, colorBlue};\n\nint brightness = 250;\n\n\/\/Matrices.\nint SCREEN_COLORS[SCREEN_ROW][SCREEN_COLUMN];\nint LEDS_COLORS[LEDS_COLUMN];\n\n\/\/Botones                   \/\/Arreglar donde eva.\nconst int buttonPinMute = 5;      \/\/Mute.\nconst int buttonPinPause = 6;     \/\/Pausa.\nconst int buttonPinDrop = 7;      \/\/Soltar pieza.\nconst int buttonPinCatch = 8;     \/\/Coger pieza.\nconst int buttonPinLeft = 9;      \/\/Izquierda.\nconst int buttonPinRight = 10;    \/\/Derecha.\n\nint buttonStateMute = 0;\nint buttonStatePause = 0;\nint buttonStateDrop = 0;\nint buttonStateCatch = 0;\nint buttonStateLeft = 0;\nint buttonStateRight = 0;\n\nbool mute_pressed = false;\nbool pause_pressed = false;\nbool drop_pressed = false;\nbool catch_pressed = false;\nbool left_pressed = false;\nbool right_pressed = false;\n\nconst int analogInPin = A2; \/\/ Potenci\u00f3metro.\nint sensorValue = 0;\n\n\/\/Sonido\nlong DO=523.25, RE=587.33,SOL=783.99, LA=880;\nconst int buzzer_pin = 4;\n\n\/\/Joystick\nint xPin = A0; \/\/Horizontal.\nint yPin = A1; \/\/Vertical.\nint buttonPin = 11; \/\/Bot\u00f3n de joystick.\n\nint xPosition = 0;\nint yPosition = 0;\nint buttonState = 0;\nint joy_delta = 250;\n\n\/\/Time.\nconst unsigned long MS_PER_UPDATE = 10;\nunsigned long previous = 0;\nunsigned long lag = 0;\nunsigned long game_time = 0;\n\nconst unsigned long falling_delay = 1500;\nconst unsigned long generate_block_delay_min = 2000;\nconst unsigned long generate_block_delay_max = 4000;\nint generate_delay = 0;\n\nconst int fastSpeed = 10;\n\nconst unsigned long time_tilting_blocks = 300;\nconst unsigned long time_erasing_blocks = time_tilting_blocks * 7;\nconst unsigned long time_failing = time_tilting_blocks * 5;\nconst unsigned long time_gameover = 8000;\n\n\/\/Gameplay\nbool pause = false;\nbool muted = false;\n#define MAX_POINTS 8000 \/\/Puntos m\u00e1ximos a representar.\n#define POINTS_PER_BLOCK 500\n#define POINTS_PER_FAIL -1000\nint points = (int)((float)MAX_POINTS\/2);\n\n#define PLAYER_ROW 5\nint player_pos = 2;\nint player_color = 0;\n\nbool falling_fast = false;\nbool erasing_blocks = false;\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/ FUNCIONES GENERALES \/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/Funci\u00f3n que comprueba las entradas del sistema.\nvoid input() {  \n  \/\/Comprobamos el mute.\n  buttonStateMute = digitalRead(buttonPinMute);\n  if(buttonStateMute == 0) mute_pressed = false;\n  if(!mute_pressed &amp;&amp; buttonStateMute!=0){\n    mute_pressed = true;\n    muted = !muted;\n  }\n  \n  \/\/Comprobamos la pausa.\n  buttonStatePause = digitalRead(buttonPinPause);\n  if(buttonStatePause == 0) pause_pressed = false;\n  \n  if(!pause_pressed &amp;&amp; buttonStatePause!=0){\n    pause_pressed = true;\n    pause = !pause;\n  }\n\n  \/\/Comprobamos el joystick.\n  xPosition = analogRead(xPin);\n  yPosition = analogRead(yPin);\n\n  \/\/Comprobamos los botones.\n  buttonStateDrop = digitalRead(buttonPinDrop);\n  if(buttonStateDrop == 0) drop_pressed = false;\n  buttonStateCatch = digitalRead(buttonPinCatch);\n  if(buttonStateCatch == 0) catch_pressed = false;\n  buttonStateLeft = digitalRead(buttonPinLeft);\n  if((buttonStateLeft == 0) &amp;&amp; (xPosition &lt; (500 + joy_delta))) left_pressed = false;\n  buttonStateRight = digitalRead(buttonPinRight);\n  if((buttonStateRight == 0) &amp;&amp; (xPosition &gt; (500 - joy_delta))) right_pressed = false;\n\n  \/\/Leemos los valores del potenci\u00f3metro y se actualiza el brillo de los leds.\n  int newSensorValue = analogRead(analogInPin);\n  if(sensorValue != newSensorValue){\n    sensorValue = newSensorValue;\n    \n    \/\/Hacemos un cambio de rango de potenci\u00f3metro a brillo de los leds.\n    brightness = (int)(((float)sensorValue\/1023) * 255);\n    screen_pix.setBrightness(brightness);\n    leds_pix.setBrightness(brightness);\n  }\n}\n\n\/\/Funci\u00f3n que gestiona el funcionamiento de la m\u00e1quina\n\/\/ en funci\u00f3n de las entradas introducidas.\nvoid update_game(){\n  \n  \/\/Se borran bloques si deben ser borrados.\n  if(erasing_blocks) erase_blocks();\n\n  \/\/Comprobamos movimiento del jugador.\n  player_update();\n  \n  \/\/Comprobamos si puede caer r\u00e1pido.\n  do_fall_fast();\n  \n  \/\/Calculamos a qu\u00e9 velocidad descienden los bloques.\n  unsigned long fall_delay = falling_delay;\n  if(falling_fast) fall_delay \/= fastSpeed;\n\n  \/\/Cuando los bloques tengan que caer.\n  if((game_time % fall_delay==0)){\n    \n    \/\/Se comprueba si al caer alg\u00fan bloque de la \u00faltima fila es cogido por el jugador o resta puntuaci\u00f3n.\n    catching_block();\n    \n    falling_blocks();\n\n    \/\/Generamos un nuevo bloque en un rango de tiempo establecido.\n    if(generate_delay&lt;=0){\n      generate_blocks();\n      generate_delay = random(generate_block_delay_min, generate_block_delay_max);\n    }\n  }\n  \n  \/\/Se rebaja el retraso del generador de bloques.\n  if(generate_delay&gt;0){\n    if(falling_fast) generate_delay -= MS_PER_UPDATE*fastSpeed;\n    else  generate_delay -= MS_PER_UPDATE;\n  }\n\n  \/\/Se comprueba si se deja caer pieza si no se siguen eliminando bloques.\n  if(!erasing_blocks) drop_block();\n}\n\n\/\/Funci\u00f3n que establece los valores de salida de los leds y los muestra.\nvoid render() {\n  \/\/Renderizamos la pantalla de leds.\n  for(int i = 0; i &lt; SCREEN_ROW; i++){\n    for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n      Color ledColor = colores[SCREEN_COLORS[i][j]];\n      int ledIndex = j * SCREEN_ROW + i;\n      screen_pix.setPixelColor(ledIndex, ledColor.r, ledColor.g, ledColor.b); \n    }\n  }\n  update_player_line();\n  screen_pix.show();\n\n  \/\/Renderizamos la fila de leds.\n  int num_leds = (int)(((float)points \/ MAX_POINTS) * LEDS_COLUMN);\n  for(int i = 0; i &lt; LEDS_COLUMN; i++){\n    Color ledColor = colores[LEDS_COLORS[i]];\n    if(i &lt;= num_leds) leds_pix.setPixelColor(i, ledColor.r, ledColor.g, ledColor.b);\n    else      leds_pix.setPixelColor(i, 0, 0, 0);\n  }\n  leds_pix.show();\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/ FUNCIONES ADICIONALES \/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/Funci\u00f3n que actualiza la posici\u00f3n del jugador.\nvoid player_update(){\n  if(!left_pressed &amp;&amp; (buttonStateLeft != 0 || (xPosition &gt;= (500 + joy_delta)))){\n    left_pressed = true;\n    if(player_pos&gt;0) player_pos--;\n  }\n  if(!right_pressed &amp;&amp; (buttonStateRight != 0 || (xPosition &lt;= (500 - joy_delta)))){\n    right_pressed = true;\n    if(player_pos&lt;SCREEN_COLUMN-1) player_pos++;\n  }\n  update_player_line();\n}\n\n\/\/Funci\u00f3n que actualiza la l\u00ednea del jugador, por donde realiza su movimiento.\nvoid update_player_line(){\n  for(int i = 0; i &lt; SCREEN_COLUMN; i++){\n    SCREEN_COLORS[PLAYER_ROW][i] = 1;\n  }\n  SCREEN_COLORS[PLAYER_ROW][player_pos] = player_color;\n}\n\n\/\/Funci\u00f3n que se encarga de generar bloques nuevos en el juego.\nvoid generate_blocks(){\n  int pos = random(SCREEN_COLUMN-1);\n  int color = random(2, NUM_COLOR);\n  SCREEN_COLORS[SCREEN_ROW-1][pos] = color;\n}\n\n\/\/Funci\u00f3n que provoca la ca\u00edda de los bloques.\nvoid falling_blocks(){\n  for(int i = PLAYER_ROW+2; i &lt; SCREEN_ROW; i++){\n    for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n      if(SCREEN_COLORS[i][j]!=0){\n        SCREEN_COLORS[i-1][j] = SCREEN_COLORS[i][j];\n        SCREEN_COLORS[i][j] = 0;\n      }\n    }\n  }\n}\n\n\/\/Funci\u00f3n que activa la captura r\u00e1pida de bloques.\nvoid do_fall_fast(){\n  if(!catch_pressed &amp;&amp; buttonStateCatch != 0 &amp;&amp; player_color == 0 &amp;&amp; !falling_fast){\n    bool canCatch = false;\n    int i = PLAYER_ROW+1;\n    while(i &lt; SCREEN_ROW &amp;&amp; !canCatch){\n      if(SCREEN_COLORS[i][player_pos] != 0) canCatch = true;\n      i++;\n    }\n    if(canCatch){\n      catch_pressed = true;\n      falling_fast = true;\n    }\n  }\n}\n\n\/\/Funci\u00f3n que captura un bloque o provoca p\u00e9rdida de puntos al no cogerlo.\nvoid catching_block(){  \n  \/\/Comprobamos p\u00e9rdida de puntuaci\u00f3n o captura de pieza.\n  for(int i = 0; i &lt; SCREEN_COLUMN; i++){\n    if(SCREEN_COLORS[PLAYER_ROW+1][i] != 0){\n      if(i==player_pos &amp;&amp; SCREEN_COLORS[PLAYER_ROW][player_pos]==0){\n        player_color = SCREEN_COLORS[PLAYER_ROW+1][i];\n        update_player_line();\n        SCREEN_COLORS[PLAYER_ROW+1][i] = 0;\n      }else{\n        \n        \/\/Perdida de puntuaci\u00f3n.\n        SCREEN_COLORS[PLAYER_ROW+1][i] = 0;\n        update_points(POINTS_PER_FAIL);\n\n        \/\/Animaci\u00f3n de fallo.\n        Color ledColor = colores[0];\n        int ledIndex = i * SCREEN_ROW + PLAYER_ROW;\n        screen_pix.setPixelColor(ledIndex, ledColor.r, ledColor.g, ledColor.b);\n        screen_pix.show();\n\n        unsigned long time_lifted = 0;\n        bool red = true;\n        int note = 0;\n        while(time_lifted &lt; time_failing){\n          for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n            int ledIndex = j * SCREEN_ROW + PLAYER_ROW;\n            if(red) screen_pix.setPixelColor(ledIndex, 255, 50, 50);\n            else{\n              Color ledColor = colores[SCREEN_COLORS[PLAYER_ROW][j]];\n              screen_pix.setPixelColor(ledIndex, ledColor.r, ledColor.g, ledColor.b);\n            }\n          }\n          screen_pix.show();\n          time_lifted += time_tilting_blocks;\n          delay(time_tilting_blocks);\n          previous += time_tilting_blocks;\n          red = !red;\n          \/\/Musica de p\u00e9rdida de puntos.\n          die_music(note++);\n        }\n        \/\/Restablecemos el sonido\n        noTone(buzzer_pin);\n        for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n          Color ledColor = colores[SCREEN_COLORS[PLAYER_ROW][j]];\n          screen_pix.setPixelColor(ledIndex, ledColor.r, ledColor.g, ledColor.b);\n        }\n        screen_pix.show();\n      }\n      falling_fast = false;\n    }\n  }\n}\n\n\/\/Funci\u00f3n que se encarga del comportamiento de cuando un jugador quiere soltar un bloque.\nvoid drop_block(){\n  if(!drop_pressed &amp;&amp; buttonStateDrop != 0 &amp;&amp; player_color != 0){\n    bool can_drop = false;\n    int i = 0;\n    while(i &lt; PLAYER_ROW &amp;&amp; !can_drop){\n      if(SCREEN_COLORS[i][player_pos] == 0) can_drop = true;\n      if(!can_drop) i++;\n    }\n    if(can_drop){\n      drop_pressed = true;\n      erasing_blocks = true;\n      SCREEN_COLORS[i][player_pos] = player_color;\n      player_color = 0;\n      update_player_line();\n    }\n  }\n}\n\n\/\/Funci\u00f3n que se encarga de eliminar bloques cuando forman filas de tres en tres.\nvoid erase_blocks(){\n    bool can_erase = false;\n    int i = 0;\n    while(i &lt; PLAYER_ROW &amp;&amp; !can_erase){\n      int j = 0;\n      while(j &lt; SCREEN_COLUMN &amp;&amp; !can_erase){\n        if(check_lines(i, j)) can_erase = true;\n        j++;\n      }\n      i++;\n    }\n    \n    if(!can_erase){\n      erasing_blocks = false;\n      check_is_full();\n    }\n}\n\n\/\/Funci\u00f3n que comprueba si un bloque en concreto est\u00e1 formando una l\u00ednea de 3.\nbool check_lines(int row, int column){\n  if(SCREEN_COLORS[row][column]!=0){\n    int count_north = 0;\n    int count_south = 0;\n    int count_east = 0;\n    int count_west = 0;\n    int count_north_west = 0;\n    int count_south_east = 0;\n    int count_south_west = 0;\n    int count_north_east = 0;\n    int i,j;\n   \n    \/\/Norte.\n    i = row + 1;\n    while(i &lt; PLAYER_ROW &amp;&amp; SCREEN_COLORS[i][column] == SCREEN_COLORS[row][column]){\n      count_north++;\n      i++;\n    }\n    \n    \/\/Sur.\n    i = row - 1;\n    while(i &gt;= 0 &amp;&amp; SCREEN_COLORS[i][column] == SCREEN_COLORS[row][column]){\n      count_south++;\n      i--;\n    }\n    \n    if(count_north + count_south &gt;= 2){\n      do_erase_blocks(row - count_south, column, count_north + count_south, 0);\n    }else{\n    \n      \/\/Oeste.\n      j = column - 1;\n      while(j &gt;= 0 &amp;&amp; SCREEN_COLORS[row][j] == SCREEN_COLORS[row][column]){\n        count_west++;\n        j--;\n      }\n      \n      \/\/Este.\n      j = column + 1;\n      while(j &lt; SCREEN_COLUMN &amp;&amp; SCREEN_COLORS[row][j] == SCREEN_COLORS[row][column]){\n        count_east++;\n        j++;\n      }\n    \n      if(count_west + count_east &gt;= 2){\n        do_erase_blocks(row, column - count_west, 0, count_west + count_east);\n      }else{\n        \n        \/\/Noroeste.\n        i = row + 1;\n        j = column - 1;\n        while(i &lt; PLAYER_ROW &amp;&amp; j &gt;= 0 &amp;&amp; SCREEN_COLORS[i][j] == SCREEN_COLORS[row][column]){\n          count_north_west++;\n          i++;\n          j--;\n        }\n      \n        \/\/Sureste.\n        i = row - 1;\n        j = column + 1;\n        while(i &gt;= 0 &amp;&amp; j &lt; SCREEN_COLUMN &amp;&amp; SCREEN_COLORS[i][j] == SCREEN_COLORS[row][column]){\n          count_south_east++;\n          i--;\n          j++;\n        }\n        \n        if(count_north_west + count_south_east &gt;= 2){\n          do_erase_blocks(row + count_north_west, column - count_north_west, -(count_north_west + count_south_east), count_north_west + count_south_east);\n        }else{\n          \n          \/\/Suroeste.\n          i = row - 1;\n          j = column - 1;\n          while(i &gt;= 0 &amp;&amp; j &gt;= 0 &amp;&amp; SCREEN_COLORS[i][j] == SCREEN_COLORS[row][column]){\n            count_south_west++;\n            i--;\n            j--;\n          }\n        \n          \/\/Noreste.\n          i = row + 1;\n          j = column + 1;\n          while(i &lt; PLAYER_ROW &amp;&amp; j &lt; SCREEN_COLUMN &amp;&amp; SCREEN_COLORS[i][j] == SCREEN_COLORS[row][column]){\n            count_north_east++;\n            i++;\n            j++;\n          }\n          \n          if(count_south_west + count_north_east &gt;= 2){\n            do_erase_blocks(row - count_south_west, column - count_south_west, count_south_west + count_north_east, count_south_west + count_north_east);\n          }else{\n            return false;\n          }\n        }\n      }\n    }\n    return true;\n  }else{\n    return false;\n  }\n}\n\n\/\/Funci\u00f3n que se encarga de eliminar los bloques y hacer una animaci\u00f3n.\nvoid do_erase_blocks(int row, int column, int rowMove, int columnMove){\n   if(rowMove!=0 || columnMove!=0){\n      unsigned long time_lifted = 0;\n      bool blanck = true;\n      while(time_lifted &lt; time_erasing_blocks){\n        int i = 0;\n        int j = 0;\n        int note = 0;\n        while(i &lt;= abs(rowMove) &amp;&amp; j &lt;= columnMove){\n          int myRow = row + i;\n          if(rowMove&lt;0) myRow = row - i;\n          int myColumn = column + j;\n\n          \/\/Animaci\u00f3n de parpadeo al eliminar bloques.\n          Color ledColor;\n          if(blanck)  ledColor = colores[1];\n          else        ledColor = colores[SCREEN_COLORS[myRow][myColumn]];\n          int ledIndex = myColumn * SCREEN_ROW + myRow;\n          screen_pix.setPixelColor(ledIndex, ledColor.r, ledColor.g, ledColor.b);\n          \n          if(rowMove != 0) i++;\n          if(columnMove != 0) j++;\n        }\n        points_music(note++);\n        screen_pix.show();\n        time_lifted += time_tilting_blocks;\n        delay(time_tilting_blocks);\n        previous += time_tilting_blocks;\n        blanck = !blanck;\n      }\n      noTone(buzzer_pin);\n\n      \/\/Eliminamos los bloques.\n      int i = 0;\n      int j = 0;\n      while(i &lt;= abs(rowMove) &amp;&amp; j &lt;= columnMove){\n        int myRow = row + i;\n        if(rowMove&lt;0) myRow = row - i;\n        int myColumn = column + j;\n        SCREEN_COLORS[myRow][myColumn] = 0;\n        if(rowMove != 0) i++;\n        if(columnMove != 0) j++;\n      }\n      \n      \/\/Obtenemos el n\u00famero de bloques que dan  puntos.\n      int num_blocks_points = abs(rowMove);\n      if(num_blocks_points &lt; columnMove) num_blocks_points = columnMove;\n      num_blocks_points--;\n      \n      \/\/Obtener puntuaci\u00f3n.\n      update_points(POINTS_PER_BLOCK * num_blocks_points);\n      \n      \/\/Ca\u00edda de bloques.\n      for(int i = 0; i &lt; PLAYER_ROW; i++){\n         for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n            if(SCREEN_COLORS[i][j]==0){\n               bool encontrado = false;\n               int k = i + 1;\n               while(k &lt; PLAYER_ROW &amp;&amp; !encontrado){\n                  if(SCREEN_COLORS[k][j]!=0){\n                    encontrado = true;\n                    SCREEN_COLORS[i][j] = SCREEN_COLORS[k][j];\n                    SCREEN_COLORS[k][j] = 0;\n                  }\n                  k++;\n               }\n            }\n         }\n      }\n   }\n}\n\n\/\/Funci\u00f3n que comprueba si hay hueco disponible para soltar un bloque,\n\/\/si no lo hay, fin de la partida.\nvoid check_is_full(){\n  bool hay_hueco = false;\n  int i = 0;\n  while(i &lt; SCREEN_COLUMN &amp;&amp; !hay_hueco){\n    if(SCREEN_COLORS[PLAYER_ROW-1][i] == 0) hay_hueco = true;\n    i++;\n  }\n  if(!hay_hueco) gameover();\n}\n\n\/\/Funci\u00f3n que establece el funcionamiento del fin de la partida.\nvoid gameover(){\n  \/\/Animaci\u00f3n de perder partida.\n  unsigned long time_lifted = 0;\n  bool red = true;\n\n  \/\/Vaciamos la pantalla de arriba.\n  for(int i = PLAYER_ROW + 1; i &lt; SCREEN_ROW; i++){\n    for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n      int ledIndex = j * SCREEN_ROW + i;\n      screen_pix.setPixelColor(ledIndex, 255, 50, 50);\n      screen_pix.show();\n    }\n  }\n\n  \/\/Escribimos un KO.\n  \/\/Letra K.\n  screen_pix.setPixelColor(SCREEN_ROW - 2, 255, 255, 0);\n  screen_pix.setPixelColor(SCREEN_ROW - 3, 255, 255, 0);\n  screen_pix.setPixelColor(SCREEN_ROW - 4, 255, 255, 0);\n  screen_pix.setPixelColor(SCREEN_ROW + SCREEN_ROW - 3, 255, 255, 0);\n  screen_pix.setPixelColor(2 * SCREEN_ROW + SCREEN_ROW - 2, 255, 255, 0);\n  screen_pix.setPixelColor(2 * SCREEN_ROW + SCREEN_ROW - 4, 255, 255, 0);\n  \n  \/\/Letra O.\n  screen_pix.setPixelColor((SCREEN_COLUMN - 1) * SCREEN_ROW + PLAYER_ROW + 1, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 2) * SCREEN_ROW + PLAYER_ROW + 1, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 3) * SCREEN_ROW + PLAYER_ROW + 1, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 1) * SCREEN_ROW + PLAYER_ROW + 2, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 3) * SCREEN_ROW + PLAYER_ROW + 2, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 1) * SCREEN_ROW + PLAYER_ROW + 3, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 2) * SCREEN_ROW + PLAYER_ROW + 3, 255, 255, 0);\n  screen_pix.setPixelColor((SCREEN_COLUMN - 3) * SCREEN_ROW + PLAYER_ROW + 3, 255, 255, 0);\n  screen_pix.show();\n  \n  \/\/Hacemos que la de abajo parpadee.\n  int note = 0;\n  while(time_lifted &lt; time_gameover){\n    for(int i = 0; i &lt; PLAYER_ROW; i++){\n      for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n        int ledIndex = j * SCREEN_ROW + i;\n        if(red) screen_pix.setPixelColor(ledIndex, 255, 50, 50);\n        else    screen_pix.setPixelColor(ledIndex, 0, 0, 0);\n      }\n      \/\/Musica de p\u00e9rdida de puntos.\n      die_music(note++);\n    }\n    noTone(buzzer_pin);\n    time_lifted += time_tilting_blocks;\n    screen_pix.show();\n    delay(time_tilting_blocks);\n    previous += time_tilting_blocks;\n    red = !red;\n  }\n  \/\/Restablecemos la partida.\n  reset();\n}\n\n\/\/Funci\u00f3n que reinicia la partida para volver a jugar.\nvoid reset(){\n  \n  \/\/Restablecemos las variables.\n  previous = millis();\n  lag = 0;\n  game_time = 0;\n  generate_delay = 0;\n  points = (int)((float)MAX_POINTS\/2);\n  player_pos = 2;\n  player_color = 0;\n  update_player_line();\n  falling_fast = false;\n  erasing_blocks = false;\n\n  \/\/Vaciamos la pantalla de arriba a abajo.\n  for(int i = 0; i &lt; SCREEN_ROW; i++){\n    for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n      SCREEN_COLORS[i][j] = 0;\n    }\n  }\n  \/\/Definimos los colores de la barra de puntuaci\u00f3n.\n  LEDS_COLORS[0] = 2;\n  LEDS_COLORS[1] = 4;\n  for(int i = 2; i &lt; LEDS_COLUMN; i++){\n    LEDS_COLORS[1] = 5;\n  }\n  render();\n}\n\nvoid update_points(int newPoints){\n  \/\/Calculamos cuantos leds deber\u00e1n encenderse.\n  points += newPoints;\n  if(points&lt;0) gameover();\n}\n\n\/\/Sonido cuando pierde puntos o gameover.\nvoid die_music(int note){\n  if(!muted){\n    switch(note%3){\n      case 0:\n      tone(buzzer_pin,DO);\n      break;\n      case 1:\n      tone(buzzer_pin,RE);\n      break;\n      case 2:\n      tone(buzzer_pin,DO);\n      break;\n      default:\n      noTone(buzzer_pin);\n      break;\n    }\n  }\n}\n\n\/\/Sonido al ganar puntos.\nvoid points_music(int note){\n  if(!muted){\n    switch(note){\n      case 0:\n        tone(buzzer_pin,SOL);\n      break;\n      case 1:\n        tone(buzzer_pin,LA);\n      break;\n      default:\n        noTone(buzzer_pin);\n      break;\n    }\n  }\n}\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/  FUNCIONES PRINCIPALES  \/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/Inicializaci\u00f3n del videojuego.\nvoid setup() {\n  \/\/ Inicializar las comunicaciones en serie a 9600 bps:\n  Serial.begin(9600);\n\n  pinMode(xPin, INPUT);\n  pinMode(yPin, INPUT);\n\n  \/\/Activar resistencia pull-up en el pin pulsador\n  pinMode(buttonPin, INPUT_PULLUP);\n\n  pinMode(buttonPinMute, INPUT);\n  pinMode(buttonPinPause, INPUT);\n  pinMode(buttonPinDrop, INPUT);\n  pinMode(buttonPinCatch, INPUT);\n  pinMode(buttonPinLeft, INPUT);\n  pinMode(buttonPinRight, INPUT);\n  pinMode(buzzer_pin, OUTPUT);\n\n  screen_pix.begin();\n  screen_pix.setBrightness(brightness);\n  leds_pix.begin();\n  leds_pix.setBrightness(brightness);\n\n  \/\/Inicializamos los leds.\n  for(int i = 0; i &lt; SCREEN_ROW; i++){\n    for(int j = 0; j &lt; SCREEN_COLUMN; j++){\n      SCREEN_COLORS[i][j] = 0;\n    }\n  }\n\n  \/\/Definimos los colores de la barra de puntuaci\u00f3n.\n  LEDS_COLORS[0] = 2;\n  LEDS_COLORS[1] = 4;\n  for(int i = 2; i &lt; LEDS_COLUMN; i++){\n    LEDS_COLORS[i] = 5;\n  }\n\n  \/\/Actualizamos la barra.  \n  update_points(0);\n  \n  \/\/Semilla aleatoria para valores aleatorios.\n  randomSeed(sensorValue);\n}\n\nvoid loop() {\n  \/\/Patr\u00f3n gameloop\n  unsigned long current = millis();\n  unsigned long elapsed = current - previous;\n  previous = current;\n  \n  \/\/Se comprueban todas las entradas del sistema.\n  input();\n\n  if(!pause){\n    lag += elapsed;\n    \n    \/\/Estado del juego, se actualiza seg\u00fan el lag.\n    while (lag &gt; MS_PER_UPDATE) {\n      game_time += MS_PER_UPDATE;\n      lag -= MS_PER_UPDATE;\n      update_game();\n    }\n  }\n  \n  \/\/Se establece el color de los leds.\n  render();\n}<\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Autores: Guillermo J. G\u00aa-Delgado \u00c1lvarez Eva Pastor Ab\u00e1nades Iv\u00e1n Rodr\u00edguez Garc\u00eda Idea del proyecto: El videojuego que hemos desarrollado toma inspiraci\u00f3n de \u201cKlax de Atari 1989\u201d y para el dise\u00f1o de la m\u00e1quina, que&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":3130,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3002","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>VIDEOCONSOLA KLAX - Proyectos con Arduino.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VIDEOCONSOLA KLAX - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Autores: Guillermo J. G\u00aa-Delgado \u00c1lvarez Eva Pastor Ab\u00e1nades Iv\u00e1n Rodr\u00edguez Garc\u00eda Idea del proyecto: El videojuego que hemos desarrollado toma inspiraci\u00f3n de \u201cKlax de Atari 1989\u201d y para el dise\u00f1o de la m\u00e1quina, que&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-20T12:03:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-20T12:49:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Administrador de la red\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Administrador de la red\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/\"},\"author\":{\"name\":\"Administrador de la red\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/bdc38fea664f13638d2a51f4d2fc7211\"},\"headline\":\"VIDEOCONSOLA KLAX\",\"datePublished\":\"2021-01-20T12:03:59+00:00\",\"dateModified\":\"2021-01-20T12:49:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/\"},\"wordCount\":1607,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/01\\\/soi-1.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/\",\"name\":\"VIDEOCONSOLA KLAX - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/01\\\/soi-1.png\",\"datePublished\":\"2021-01-20T12:03:59+00:00\",\"dateModified\":\"2021-01-20T12:49:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/01\\\/soi-1.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/01\\\/soi-1.png\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/videoconsola-klax\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VIDEOCONSOLA KLAX\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/bdc38fea664f13638d2a51f4d2fc7211\",\"name\":\"Administrador de la red\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g\",\"caption\":\"Administrador de la red\"},\"sameAs\":[\"https:\\\/\\\/blogs.etsii.urjc.es\"],\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/etsiiadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"VIDEOCONSOLA KLAX - Proyectos con Arduino.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/","og_locale":"es_ES","og_type":"article","og_title":"VIDEOCONSOLA KLAX - Proyectos con Arduino.","og_description":"Autores: Guillermo J. G\u00aa-Delgado \u00c1lvarez Eva Pastor Ab\u00e1nades Iv\u00e1n Rodr\u00edguez Garc\u00eda Idea del proyecto: El videojuego que hemos desarrollado toma inspiraci\u00f3n de \u201cKlax de Atari 1989\u201d y para el dise\u00f1o de la m\u00e1quina, que&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2021-01-20T12:03:59+00:00","article_modified_time":"2021-01-20T12:49:10+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1.png","type":"image\/png"}],"author":"Administrador de la red","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Administrador de la red","Tiempo de lectura":"22 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/"},"author":{"name":"Administrador de la red","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/bdc38fea664f13638d2a51f4d2fc7211"},"headline":"VIDEOCONSOLA KLAX","datePublished":"2021-01-20T12:03:59+00:00","dateModified":"2021-01-20T12:49:10+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/"},"wordCount":1607,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1.png","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/","name":"VIDEOCONSOLA KLAX - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1.png","datePublished":"2021-01-20T12:03:59+00:00","dateModified":"2021-01-20T12:49:10+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/01\/soi-1.png","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/videoconsola-klax\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"VIDEOCONSOLA KLAX"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/bdc38fea664f13638d2a51f4d2fc7211","name":"Administrador de la red","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g","caption":"Administrador de la red"},"sameAs":["https:\/\/blogs.etsii.urjc.es"],"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/etsiiadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/3002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=3002"}],"version-history":[{"count":10,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/3002\/revisions"}],"predecessor-version":[{"id":3138,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/3002\/revisions\/3138"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/3130"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=3002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=3002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=3002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}