{"id":3779,"date":"2021-05-13T17:19:59","date_gmt":"2021-05-13T17:19:59","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=3779"},"modified":"2021-05-13T17:20:00","modified_gmt":"2021-05-13T17:20:00","slug":"juego-de-hundir-la-flota","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/","title":{"rendered":"Juego de hundir la flota"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Autores<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Sonia Casero P\u00e9rez<\/li><li>Milagros Mouri\u00f1o Ursul<\/li><li>Juan Antonio Vinaches Vizca\u00edno<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p>Este proyecto consiste en la implementaci\u00f3n del cl\u00e1sico juego <strong>\u00abHundir la flota\u00bb<\/strong>. Para ello, se va a utilizar una placa de Arduino como soporte del programa del juego y las conexiones con el resto de componentes y una pantalla t\u00e1ctil para seleccionar las posiciones de los barcos y atacar al oponente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Materiales<\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Componente<\/strong><\/td><td><strong>Precio<\/strong><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">L\u00e1piz t\u00e1ctil<\/td><td>\u2013<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Placa Arduino Uno<\/td><td>\u2013<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Pantalla t\u00e1ctil TFT LCD<\/td><td>20,28\u20ac<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Caja est\u00e9tica<\/td><td>1\u20ac<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Total<\/strong><\/td><td><strong>21,28\u20ac<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware<\/h2>\n\n\n\n<p>En cuanto al hardware nuestro proyecto es sencillo. Como la pantalla LCD t\u00e1ctil ven\u00eda en formato shield lo \u00fanico que tuvimos que hacer fue montarla encima del arduino haciendo coincidir los pines correspondientes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg\" alt=\"\" class=\"wp-image-3785\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-300x169.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-768x432.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1536x864.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22-1024x576.jpeg\" alt=\"\" class=\"wp-image-3787\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22-1024x576.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22-300x169.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22-768x432.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22-1536x864.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.46.22.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Despu\u00e9s, montamos la placa con la pantalla en una bonita caja. Le a\u00f1adimos un cilindro donde dejar el l\u00e1piz t\u00e1ctil para que no se pierda.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.35.46.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.35.46-768x1024.jpeg\" alt=\"\" class=\"wp-image-3783\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.35.46-768x1024.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.35.46-225x300.jpeg 225w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.35.46-1152x1536.jpeg 1152w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.35.46.jpeg 1200w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Software<\/h2>\n\n\n\n<p>La gran mayor\u00eda del proyecto se ha dedicado al desarrollo del juego y el control de la pantalla t\u00e1ctil. Aqu\u00ed se muestra el c\u00f3digo fuente:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Libraries\n\n#include &lt;Adafruit_GFX.h&gt;   \/\/ Graphic functions \n#include &lt;MCUFRIEND_kbv.h&gt;  \/\/ Display\n#include &lt;TouchScreen.h&gt;    \/\/ Touch screen  \n\n\/\/------------------------\n\n\/\/ Display \n\n\/\/ Controller's model\n\n#define CONTROLLER 0x9486\n\n\/\/ Pins\n\n#define LCD_CS  A3\n#define LCD_CD  A2\n#define LCD_WR  A1\n#define LCD_RD  A0\n#define LCD_RESET  A4\n\n\/\/------------------------\n\n\/\/ Touch screen\n\n\/\/ Pins\n\n#define XM A2\n#define XP 6\n#define YP A1\n#define YM 7\n\n\/\/ Maximum and minimum values read in touch screen\n\n#define TS_MINX 127\n#define TS_MAXX 961\n#define TS_MINY 117\n#define TS_MAXY 921\n\n\/\/ Pressure interval detected by touch screen\n\n#define MINPRESSURE 10\n#define MAXPRESSURE 1000\n\n\/\/------------------------\n\n\/\/ Game\n\n\/\/ States\n\n#define WATER 0\n#define BOAT 1\n#define MISS 2\n#define IMPACT 3\n#define SUNK 4\n\n\/\/ Colors\n\n#define BLUE 0x186EDE   \/\/ Miss square\n#define RED 0xF800      \/\/ Impact square\n#define BLACK 0x000000  \/\/ Sunk square\n#define WHITE 0xFFFFFF  \/\/ Grid background\n#define LIME 0x9CDB27   \/\/ Player 1 background color\n#define PURPLE 0x8D27C4 \/\/ Player 2 background color\n#define ORANGE 0xD67F0D \/\/ Win background\n\n\/\/ Board dimensions\n\n#define BOARD_WIDTH 12\n#define BOARD_HEIGHT 8\n\n\/\/ Boat's number\n\n#define NUM_TOTAL_BOATS 10\n\n#define NUM_PATROL_BOATS 4\n#define NUM_CRUISE 3\n#define NUM_DESTROYER 2\n#define NUM_BATTLESHIP 1\n\n\/\/ Boat's length\n\n#define PATROL_BOAT_LENGTH 1\n#define CRUISE_LENGTH 2\n#define DESTROYER_LENGTH 3\n#define BATTLESHIP_LENGTH 4\n\n\/\/ Boat's orientation\n\n#define HORIZONTAL 0\n#define VERTICAL 1\n\nint BOXSIZE = 40; \/\/ Size of board squares in pixels\n\nint board [BOARD_HEIGHT][BOARD_WIDTH];\nint board2 [BOARD_HEIGHT][BOARD_WIDTH];\n\nint numBoatsPlayer1;\nint numBoatsPlayer2;\n\nMCUFRIEND_kbv screenDisplay;  \nTouchScreen touchPanel = TouchScreen(XP, YP, XM, YM, 300);  \n\nvoid drawGrid(MCUFRIEND_kbv screenDisplay, int BOXSIZE, int board [BOARD_HEIGHT][BOARD_WIDTH]){\n  screenDisplay.fillScreen(WHITE);\n  for (int i = 0; i &lt; BOARD_HEIGHT; i++){\n    for (int j = 0; j &lt; BOARD_WIDTH; j++){\n      screenDisplay.drawRect(j*BOXSIZE, i*BOXSIZE, BOXSIZE, BOXSIZE, BLACK);\n      switch(board[i][j]){\n        case MISS:\n          screenDisplay.fillRect(j*BOXSIZE, i*BOXSIZE, BOXSIZE, BOXSIZE, BLUE);\n          break;\n        case IMPACT:\n          screenDisplay.fillRect(j*BOXSIZE, i*BOXSIZE, BOXSIZE, BOXSIZE, RED);\n          break;\n        case SUNK:\n          screenDisplay.fillRect(j*BOXSIZE, i*BOXSIZE, BOXSIZE, BOXSIZE, BLACK);\n        default: ;  \n      }\n      screenDisplay.drawRect(j*BOXSIZE, i*BOXSIZE, BOXSIZE, BOXSIZE, BLACK);\n    }\n  }\n  delay(500);\n}\n\nvoid drawNextTurnSlide(MCUFRIEND_kbv screenDisplay, char turn, int color, TouchScreen touchPanel){\n  int char_size = 10;\n  screenDisplay.setRotation(1);\n  screenDisplay.fillScreen(color);\n  screenDisplay.setCursor(220,130);\n  screenDisplay.setTextSize(10);\n  screenDisplay.print(turn);\n  pinMode(13, OUTPUT);\n  while(1){\n    digitalWrite(13, HIGH);\n    TSPoint p = touchPanel.getPoint();\n    delay(100);\n    p = touchPanel.getPoint();\n    delay(100);\n    digitalWrite(13, LOW);\n    pinMode(XM, OUTPUT);\n    pinMode(YP, OUTPUT);\n    p.x = p.x + p.y;       \n    p.y = p.x - p.y;            \n    p.x = p.x - p.y;\n    if(p.z &gt;= MINPRESSURE){\n      break;\n    }\n  }\n}\n\nint shoot(int board[BOARD_HEIGHT][BOARD_WIDTH], TouchScreen touchPanel, MCUFRIEND_kbv screenDisplay, int numBoatsPlayer){\n  int row, column;\n  boolean isSunk;\n  pinMode(13, OUTPUT);\n  while(1){\n    digitalWrite(13, HIGH);\n    TSPoint p = touchPanel.getPoint();\n    delay(100);\n    p = touchPanel.getPoint();\n    delay(100);\n    digitalWrite(13, LOW);\n    pinMode(XM, OUTPUT);\n    pinMode(YP, OUTPUT);\n    p.x = p.x + p.y;\n    p.y = p.x - p.y;\n    p.x = p.x - p.y;\n    p.x = map(p.x, TS_MINX, TS_MAXX, screenDisplay.width(), 0);\n    p.y = (screenDisplay.height() - map(p.y, TS_MINY, TS_MAXY, screenDisplay.height(), 0));\n    if(p.z &gt;= MINPRESSURE &amp;&amp; p.z &lt;= MAXPRESSURE){\/\/Update\n      row = p.y\/BOXSIZE;\n      column= p.x\/BOXSIZE;\n      switch(board[row][column]){\n        case WATER:\n           board[row][column] = MISS;\n           break;\n        case BOAT:\n          board[row][column] = IMPACT;\n          isSunk = checkIfBoatIsSunk(row, column, board);\n          if(isSunk){\n            setBoatSunk(row, column, board);\n            --numBoatsPlayer;\n            if (numBoatsPlayer == 0) {\n              return numBoatsPlayer;\n            }\n          }\n          drawGrid(screenDisplay, BOXSIZE, board);\n          continue;\n        default:\n          continue;\n      }\n      return numBoatsPlayer;\n    }\n  }\n}\n\nvoid win(MCUFRIEND_kbv screenDisplay, char player){\n  screenDisplay.setRotation(1);\n  screenDisplay.fillScreen(ORANGE);\n  screenDisplay.setCursor(40,130);\n  screenDisplay.setTextSize(5);\n  screenDisplay.print(\"Player \");\n  screenDisplay.print(player);\n  screenDisplay.print(\" wins!\");\n}\n\nboolean checkIfBoatIsSunk(int row, int column, int board[BOARD_HEIGHT][BOARD_WIDTH]){\n  int rowAux = row;\n  int columnAux = column;\n  \/\/ Up\n  while(rowAux &gt;= 0 &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    if(board[rowAux][columnAux] == BOAT){\n      return false;\n    }\n    rowAux--;\n  }\n  \/\/ Left\n  rowAux = row;\n  columnAux = column;\n  while(columnAux &gt;= 0 &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    if(board[rowAux][columnAux] == BOAT){\n      return false;\n    }\n    columnAux--;\n  }\n  \/\/ Down\n  rowAux = row;\n  columnAux = column;\n  while(rowAux &lt; BOARD_HEIGHT &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    if(board[rowAux][columnAux] == BOAT){\n      return false;\n    }\n    rowAux++;\n  }\n  \/\/ Right\n  rowAux = row;\n  columnAux = column;\n  while(columnAux &lt; BOARD_WIDTH &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    if(board[rowAux][columnAux] == BOAT){\n      return false;\n    }\n    columnAux++;\n  }\n  return true;\n}\n\nvoid setBoatSunk(int row, int column, int board[BOARD_HEIGHT][BOARD_WIDTH]){\n  int rowAux = row;\n  int columnAux = column;\n  \/\/ Up\n  while(rowAux &gt;= 0 &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    board[rowAux][columnAux] = SUNK;\n    rowAux--;\n  }\n  rowAux = row;\n  columnAux = column;\n  \/\/ Left\n  while(columnAux &gt;= 0 &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    board[rowAux][columnAux] = SUNK;\n    columnAux--;\n  }\n  rowAux = row;\n  columnAux = column;\n  \/\/ Down\n  while(rowAux &lt; BOARD_HEIGHT &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    board[rowAux][columnAux] = SUNK;\n    rowAux++;\n  }\n  rowAux = row;\n  columnAux = column;\n  \/\/ Right\n  while(columnAux &lt; BOARD_WIDTH &amp;&amp; (board[rowAux][columnAux] != WATER &amp;&amp; board[rowAux][columnAux] != MISS)){\n    board[rowAux][columnAux] = SUNK;\n    columnAux++;\n  }\n}\n\nboolean checkValidCoordinate(\n  int board [BOARD_HEIGHT][BOARD_WIDTH], int row, int column, int rowLowerIncrement,\n  int rowUpperIncrement, int columnLowerIncrement, int columnUpperIncrement) {\n  boolean isWaterAround = true;\n  for (int rowAux = row + rowLowerIncrement; rowAux &lt;= row + rowUpperIncrement; rowAux++) {\n    if (rowAux &lt; 0 || rowAux &gt;= BOARD_HEIGHT) continue;\n    for (int columnAux = column + columnLowerIncrement; columnAux &lt;= column + columnUpperIncrement; columnAux++) {\n      if (columnAux &lt; 0 || columnAux &gt;= BOARD_WIDTH) continue;\n      isWaterAround = board[rowAux][columnAux] == WATER;\n      if (!isWaterAround) break;\n    }\n    if (!isWaterAround) break;\n  }\n  return isWaterAround;\n}\n\nvoid setBoats(int board [BOARD_HEIGHT][BOARD_WIDTH], int numBoats, int boatLength){\n  for (int i = 0; i &lt; numBoats; i++) {\n    int row, column, maxValidRow, maxValidColumn, orientation, rowUpperIncrement, columnUpperIncrement;\n    int rowLowerIncrement = -1;\n    int columnLowerIncrement = -1;\n    boolean isWaterAround = true;\n    do {\n      orientation = random(0,2);\n      if (orientation == HORIZONTAL) {\n        maxValidRow = BOARD_HEIGHT;\n        maxValidColumn = BOARD_WIDTH - boatLength + 1;\n        rowUpperIncrement = 1;\n        columnUpperIncrement = boatLength;\n      } else {\n        maxValidRow = BOARD_HEIGHT - boatLength + 1;\n        maxValidColumn = BOARD_WIDTH;\n        rowUpperIncrement = boatLength;\n        columnUpperIncrement = 1;\n      }\n      row = random(0, maxValidRow);\n      column = random(0, maxValidColumn);\n      isWaterAround = checkValidCoordinate(board, row, column, rowLowerIncrement, rowUpperIncrement,\n        columnLowerIncrement, columnUpperIncrement);\n    } while (!isWaterAround);\n    if(orientation == HORIZONTAL){\n      for(int i = column; i &lt; column + boatLength; i++){\n        board[row][i] = BOAT;\n      }\n    } else { \/\/ Vertical\n      for(int i = row; i &lt; row + boatLength; i++){\n        board[i][column] = BOAT;\n      }\n    }\n  }\n}\n\nvoid setup() {\n  screenDisplay.reset();\n  randomSeed(analogRead(A0));\n  screenDisplay.begin(CONTROLLER);\n  screenDisplay.setRotation(1);\n  for (int i = 0; i &lt; BOARD_HEIGHT; i++) {\n    for (int j = 0; j &lt; BOARD_WIDTH; j++) {\n      board[i][j] = WATER;\n      board2[i][j] = WATER;\n    }\n  }\n  \/\/ Player 1\n  setBoats(board, NUM_PATROL_BOATS, PATROL_BOAT_LENGTH);\n  setBoats(board, NUM_CRUISE, CRUISE_LENGTH);\n  setBoats(board, NUM_DESTROYER, DESTROYER_LENGTH);\n  setBoats(board, NUM_BATTLESHIP, BATTLESHIP_LENGTH);\n  \/\/ Player 2\n  setBoats(board2, NUM_PATROL_BOATS, PATROL_BOAT_LENGTH);\n  setBoats(board2, NUM_CRUISE, CRUISE_LENGTH);\n  setBoats(board2, NUM_DESTROYER, DESTROYER_LENGTH);\n  setBoats(board2, NUM_BATTLESHIP, BATTLESHIP_LENGTH);\n  numBoatsPlayer1 = NUM_TOTAL_BOATS;\n  numBoatsPlayer2 = NUM_TOTAL_BOATS;\n}\n\nvoid loop() {\n  drawNextTurnSlide(screenDisplay, '1', PURPLE, touchPanel);\n  drawGrid(screenDisplay, BOXSIZE, board);\n  numBoatsPlayer2 = shoot(board, touchPanel, screenDisplay, numBoatsPlayer2);\n  drawGrid(screenDisplay, BOXSIZE, board);\n  if(numBoatsPlayer2 == 0){\n    win(screenDisplay, '1');\n    while(1) {}\n  }\n  drawNextTurnSlide(screenDisplay, '2', LIME, touchPanel);\n  drawGrid(screenDisplay, BOXSIZE, board2);\n  numBoatsPlayer1 = shoot(board2, touchPanel, screenDisplay, numBoatsPlayer1);\n  drawGrid(screenDisplay, BOXSIZE, board2);\n  if(numBoatsPlayer1 == 0){\n    win(screenDisplay, '2');\n    while(1) {}\n  }\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"352\" style=\"aspect-ratio: 640 \/ 352;\" width=\"640\" controls src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/demostracion.mov\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Problemas encontrados<\/h2>\n\n\n\n<p>Uno de los mayores problemas encontrados ha sido el manejo de la<br>pantalla LCD. Ha sido necesario la b\u00fasqueda de informaci\u00f3n para la<br>correcta para la configuraci\u00f3n de los pines y calibraci\u00f3n de la pantalla. Se ha necesitado la b\u00fasqueda de las librer\u00edas correctas para utilizar la pantalla t\u00e1ctil y el controlador correspondiente al modelo del display. Hemos encontrado informaci\u00f3n en los foros de Arduino y tutoriales para poder solventar el problema. Tambi\u00e9n hemos utilizado ejemplos de referencia que tra\u00eda el modelo de la pantalla para utilizar los valores asociados a los pines.<\/p>\n\n\n\n<p>Otro de los inconvenientes ha sido el planteamiento del sistema de turnos. La idea original ten\u00eda como base el uso de dos pantallas para cada jugador. Como la placa de Arduino Uno no ten\u00eda suficientes pines, se decidi\u00f3 dividir la pantalla en dos tableros. Al dividir la pantalla, las celdas de los tableros eran demasiado peque\u00f1as y podr\u00eda haber problemas de precisi\u00f3n por parte de la pantalla t\u00e1ctil. Al final se decidi\u00f3 mostrar una transici\u00f3n entre turnos donde se mostrase el turno del jugador y el tablero del oponente, pudiendo as\u00ed mostrar las celdas con un tama\u00f1o adecuado.<\/p>\n\n\n\n<p>Debido a que nuestro enfoque sobre la matriz de enteros ha sido representarlo como un eje cartesiano, nos ha producido dificultades a la hora de ubicar y buscar las casillas en los bucles, ya que era confuso asociar las columnas con x y las filas con y. Decidimos al final representarlo como filas y columnas para poder facilitar los valores de continuaci\u00f3n y de parada de los bucles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referencias<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/create.arduino.cc\/projecthub\/Sergey_Urusov\/arduino-mega-chess-d54383?ref=search&amp;ref_id=tft%20lcd%20shield%20ili9486%20&amp;offset=0\">https:\/\/create.arduino.cc\/projecthub\/Sergey_Urusov\/arduino-mega-chess-d54383?ref=search&amp;ref_id=tft%20lcd%20shield%20ili9486%20&amp;offset=0<\/a><\/li><li><a href=\"https:\/\/wiki.microduinoinc.com\/Main_Page\">https:\/\/wiki.microduinoinc.com\/Main_Page<\/a><\/li><li><a href=\"https:\/\/eldesvandejose.com\/2016\/04\/23\/pantalla-tactil-tft\/\">https:\/\/eldesvandejose.com\/2016\/04\/23\/pantalla-tactil-tft\/<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Autores Sonia Casero P\u00e9rez Milagros Mouri\u00f1o Ursul Juan Antonio Vinaches Vizca\u00edno Introducci\u00f3n Este proyecto consiste en la implementaci\u00f3n del cl\u00e1sico juego \u00abHundir la flota\u00bb. Para ello, se va a utilizar una placa de Arduino&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3779","post","type-post","status-publish","format-standard","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Juego de hundir la flota - 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\/juego-de-hundir-la-flota\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Juego de hundir la flota - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Autores Sonia Casero P\u00e9rez Milagros Mouri\u00f1o Ursul Juan Antonio Vinaches Vizca\u00edno Introducci\u00f3n Este proyecto consiste en la implementaci\u00f3n del cl\u00e1sico juego \u00abHundir la flota\u00bb. Para ello, se va a utilizar una placa de Arduino&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-13T17:19:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-13T17:20:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg\" \/>\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=\"8 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\\\/juego-de-hundir-la-flota\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/\"},\"author\":{\"name\":\"Administrador de la red\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/bdc38fea664f13638d2a51f4d2fc7211\"},\"headline\":\"Juego de hundir la flota\",\"datePublished\":\"2021-05-13T17:19:59+00:00\",\"dateModified\":\"2021-05-13T17:20:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/\"},\"wordCount\":497,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/05\\\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/\",\"name\":\"Juego de hundir la flota - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/05\\\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg\",\"datePublished\":\"2021-05-13T17:19:59+00:00\",\"dateModified\":\"2021-05-13T17:20:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/05\\\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2021\\\/05\\\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/juego-de-hundir-la-flota\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Juego de hundir la flota\"}]},{\"@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":"Juego de hundir la flota - 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\/juego-de-hundir-la-flota\/","og_locale":"es_ES","og_type":"article","og_title":"Juego de hundir la flota - Proyectos con Arduino.","og_description":"Autores Sonia Casero P\u00e9rez Milagros Mouri\u00f1o Ursul Juan Antonio Vinaches Vizca\u00edno Introducci\u00f3n Este proyecto consiste en la implementaci\u00f3n del cl\u00e1sico juego \u00abHundir la flota\u00bb. Para ello, se va a utilizar una placa de Arduino&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2021-05-13T17:19:59+00:00","article_modified_time":"2021-05-13T17:20:00+00:00","og_image":[{"url":"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg","type":"","width":"","height":""}],"author":"Administrador de la red","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Administrador de la red","Tiempo de lectura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/"},"author":{"name":"Administrador de la red","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/bdc38fea664f13638d2a51f4d2fc7211"},"headline":"Juego de hundir la flota","datePublished":"2021-05-13T17:19:59+00:00","dateModified":"2021-05-13T17:20:00+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/"},"wordCount":497,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/","name":"Juego de hundir la flota - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg","datePublished":"2021-05-13T17:19:59+00:00","dateModified":"2021-05-13T17:20:00+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2021\/05\/WhatsApp-Image-2021-05-13-at-18.42.49-1024x576.jpeg"},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/juego-de-hundir-la-flota\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Juego de hundir la flota"}]},{"@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\/3779","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=3779"}],"version-history":[{"count":3,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/3779\/revisions"}],"predecessor-version":[{"id":3811,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/3779\/revisions\/3811"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=3779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=3779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=3779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}