diff --git a/content/espanol/android-tictactoe/_index.md b/content/espanol/android-tictactoe/_index.md new file mode 100644 index 0000000000..38c9de7cb5 --- /dev/null +++ b/content/espanol/android-tictactoe/_index.md @@ -0,0 +1,45 @@ +--- +title: "Java: Gato" +description: "Obtén información sobre variables, funciones y condicionales mientras creas una aplicación Gato para Android." +date: 2021-03-13T14:04:59.61-07:00 +prereq: "Android Studio" +difficulty: "Intermedio" +download: "resources/_gen/files/TicTacToe.zip" +icon: "fab fa-android" +draft: false +--- + +## Comienza tu aventura de juego para Android + +¿Alguna vez te has preguntado cómo podrías construir tu propio juego de Gato? + +¡Estas de suerte, hoy es el día, podrás construir el tuyo! + +Juego del Gato en Android + +## ¡Vamos a comenzar! + +## ¿Qué es Android? + +¡Android es actualmente el sistema operativo móvil más utilizado en el mundo! Android Studio te permite crear aplicaciones que pueden usar estos dispositivos Android. De hecho, si tienes un teléfono Android, ¡incluso puedes descargar la aplicación que estás haciendo hoy en tu teléfono! + +## Acerca de este Proyecto + +En este proyecto te hemos dado una aplicación Android que funciona principalmente que es un juego de Tic-Tac-Toe. ¡Necesita tu ayuda para solucionar algunos problemas y agregar algunas partes para que sea un gran juego! + +## Descarga los archivos del proyecto + +Para comenzar, descargue los archivos del proyecto siguiendo estos pasos: +1. [Descarga los archivos de proyecto](../resources/_gen/files/TicTacToe.zip) para tu juego. +2. Busque el archivo TicTacToe.zip en su carpeta de descargas. +3. Descomprima el archivo. + - En Windows: Haga clic derecho en TicTacToe.zip y seleccione `Extraer todo...`. Se creará una carpeta llamada `TicTacToe` que contiene el código del proyecto. + +¡En esta aventura, tendrás que resolver los rompecabezas marcados con etiquetas `PUZZLE` para completar el juego! + +## Tabla de contenidos + +
+Tabla de contenidos +{{% children /%}} +
\ No newline at end of file diff --git a/content/espanol/android-tictactoe/android-setup.md b/content/espanol/android-tictactoe/android-setup.md new file mode 100644 index 0000000000..30c4868807 --- /dev/null +++ b/content/espanol/android-tictactoe/android-setup.md @@ -0,0 +1,77 @@ +--- +title: "Configuración de Android" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 2 +--- +Sigue los pasos que se indican a continuación para instalar Android Studio en tu ordenador. Si ya tienes Android Studio instalado, ábrelo y salta al siguiente paso. + +Estos pasos tienen ejemplos para instalar en equipos Windows. Sin embargo, los pasos también son similares para otros tipos de computadoras. + +## Descarga e Instala Android Studio +1. [Descarga Android Studio](https://developer.android.com/studio/) para tu sistema operativo. +2. [Sigue estos pasos](https://developer.android.com/studio/install) para instalar Android Studio. + + +## Establecer la variable de entorno JAVA_HOME +Android Studio viene con una versión de Java necesaria para que ciertas partes de la aplicación se ejecuten. Siga los pasos a continuación para establecer la variable de entorno `JAVA_HOME` en su computadora, que le indica a estas herramientas dónde encontrar Java: +1. En el cuadro de búsqueda en la parte inferior izquierda de la pantalla, escriba `env`. +2. Selecciona en "Mejor coincidencia" `Editar las variables de entorno del sistema`. + +Editar variables de entorno del sistema + +3. Selecciona `Variables de entorno...`. + +4. `Nuevo...` en `Variables de usuario`. + +5. Escribe JAVA_HOME como el nombre de la variable. + +6. Copia lo siguiente en el valor de la variable: +``` +C:\Program Files\Android\Android Studio\jre +``` +7. Selecciona OK. +muestra los pasos para configurar JAVA_HOME variable de entorno + +{{% notice tip %}} +Te recomendamos que reinicies tu computadora ahora para que Android Studio se abra correctamente. +{{% /notice %}} + +## Inicia Android Studio +Una vez instalada, abre Android Studio para trabajar en la aplicación. + +{{% notice tip %}} +Hay varias formas de iniciar la aplicación Android Studio en tu computadora con Windows. Aquí hay dos métodos: +#### Método 1 +1. Haz clic en el ícono de Windows en la esquina inferior izquierda de tu computadora. +2. Desplázate por la lista hasta que veas la carpeta `Android Studio`. +3. Haz clic en la carpeta `Android Studio` para expandirla. +4. Haz clic en la aplicación `Android Studio` en la carpeta para iniciar Android Studio. + +#### Método 2 +1. Haz clic en el ícono de Windows en la esquina inferior izquierda de tu computadora. +2. Desplázate por la lista hasta que veas la carpeta `Android Studio`. +3. Haz clic en la carpeta `Android Studio` para expandirla. +4. Haz clic en la aplicación `Android Studio` en la carpeta para iniciar Android Studio. +{{% /notice %}} + +## Abre los Archivos del Proyecto +1. Haz clic en `Abrir un proyecto existente` en la pantalla de inicio de Android Studio. +2. Busca la ubicación donde descargó los archivos del proyecto. +3. Selecciona la carpeta `TicTacToe` dentro de la carpeta `TicTacToe` que descomprimiste anteriormente. + - La carpeta `TicTacToe` para seleccionar debe tener un ícono verde de Android al lado, lo que indica que es una carpeta de proyecto de Android. +Muestra como abrir el proyecto del juego del Gato en Android Studio + +Inicia Android Studio y abre el proyecto. Deberías ver algo similar a la siguiente captura de pantalla: +Ejemplo de Android Studio IDE + +## Aceptar Licencias +Antes de poder ejecutar el código, deberá aceptar las licencias de Android siguiendo los pasos a continuación: +1. Haz clic en el botón `Terminal` en la parte inferior de la ventana de Android Studio. +2. Escribe el siguiente comando, reemplazando `` con el nombre de usuario de tu computadora. + +``` +C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager --licenses +``` +3. Escribe `y` y presiona `ENTER` en las indicaciones, para aceptar las licencias. Esto será necesario varias veces. +muestra los pasos necesarios para aceptar las licencias de Android diff --git a/content/espanol/android-tictactoe/answer-key.md b/content/espanol/android-tictactoe/answer-key.md new file mode 100644 index 0000000000..d1a3487de9 --- /dev/null +++ b/content/espanol/android-tictactoe/answer-key.md @@ -0,0 +1,51 @@ +--- +title: "Respuestas - Android Gato" +date: 2021-03-13T14:17:07.42-07:00 +hidden: true +weight: 14 +--- + +### Acertijo 1 +```xml + + Gato + +``` + +### Acertijo 2 +```kotlin +Toast.makeText(this, "Bienvenido al juego del Gato", Toast.LENGTH_LONG).show() +``` + +### Acertijo 3 +#### Acertijo 3a +```kotlin +var colorGreen = Color.GREEN +``` +#### Acertijo 3b +```kotlin +var winner = -1 +``` + +### Acertijo Final +```kotlin +//cross1 +if (Player1.contains(1) && Player1.contains(5) && Player1.contains(9)) +{ + winner = 1 +} +if (Player2.contains(1) && Player2.contains(5) && Player2.contains(9)) +{ + winner = 2 +} + +//cross2 +if (Player1.contains(3) && Player1.contains(5) && Player1.contains(7)) +{ + winner = 1 +} +if (Player2.contains(3) && Player2.contains(5) && Player2.contains(7)) +{ + winner = 2 +} +``` \ No newline at end of file diff --git a/content/espanol/android-tictactoe/app-structure.md b/content/espanol/android-tictactoe/app-structure.md new file mode 100644 index 0000000000..3699b59c05 --- /dev/null +++ b/content/espanol/android-tictactoe/app-structure.md @@ -0,0 +1,29 @@ +--- +title: "Estructura de la Aplicación del Juego" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 3 +--- + +## Volviendo a lo Básico +Ahora que el juego tiene el título correcto, profundicemos en todos estos archivos en la carpeta del juego. ¿Qué significan todos ellos? ¿Cómo contribuye al juego? +Archivos de App mostrados en Android Studio + +### AndroidManifest.xml +Cada proyecto en Android incluye un archivo de manifiesto. Para tu juego, este es el archivo `AndroidManifest.xml`. El archivo de manifiesto define los metadatos para su juego, por ejemplo, puede definir el icono y el tema general para su aplicación de juego. + +### activity_main.xml +Este archivo se encuentra en la carpeta "layout". Como indica el nombre de la carpeta, los archivos de esta carpeta definen el aspecto de la aplicación. Si observa el código de `activity_main.xml`, verá palabras clave como `TableLayout` o `TableRow`. La combinación de palabras clave en el archivo `activity_main.xml` crea el diseño para los botones de selección de juegos (Jugador vs Jugador o Jugador vs Computadora), el tablero de tres en raya y el botón de reinicio. La palabra clave `TableLayout` dice que el diseño se alineará con un estilo de tabla, que incluye columnas y filas. La palabra clave `TableRow` crea una nueva fila en el diseño, con cada elemento adicional correspondiente a un lugar en esa fila: +Tablero de Gato con 5 filas. La primera fila incluye los dos botones de selección de juegos, seguidos de 3 filas por 3 columnas para la cuadrícula del juego de Gato, y finalmente la quinta fila con el botón de reinicio + +### MainActivity.kt + +Este archivo se encuentra en la carpeta "java". El archivo contiene el código y la lógica de la aplicación. + +### colors.xml, strings.xml, styles.xml + +Estos archivos se encuentran en la carpeta "valores". Los archivos contienen valores a los que pueden hacer referencia otros archivos XML y código de aplicación. + +## Juntando Todo + +Todos estos archivos trabajan juntos para crear tu juego. El archivo `activity_main.xml` decide lo que se le muestra. Al hacer clic en los botones, los eventos se envían desde el `activity_main.xml` al `MainActivity.kt` para determinar qué sucede en ese clic del botón. Para valores repetibles, `activity_main.xml` y `MainActivity.kt` pueden llegar a `colors.xml`, `strings.xml` o `styles.xml` para usar esos valores desde una ubicación conveniente. \ No newline at end of file diff --git a/content/espanol/android-tictactoe/booleans.md b/content/espanol/android-tictactoe/booleans.md new file mode 100644 index 0000000000..091dff515d --- /dev/null +++ b/content/espanol/android-tictactoe/booleans.md @@ -0,0 +1,46 @@ +--- +title: "Booleanos" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 9 +--- +Los booleanos son declaraciones `true` (verdaderas) o `false` (falsas). A diferencia de las cadenas o los números, los booleanos almacenan declaraciones de verdad: ¿lo que estoy diciendo es verdadero o falso? Por ejemplo, si pregunto: "¿Eres un robot?", Esta pregunta produce un resultado verdadero o falso, que llamamos booleano. En este caso, como no eres un robot (¡con suerte!), produciríamos falso. También podemos usar operadores matemáticos para crear expresiones booleanas. Aquí hay algunos ejemplos; Sin embargo, observe los símbolos inusuales para "igual a" y "no igual a": + +| Operador | Descripción | Operador | Descripción | +| -------- | --------------------- | -------- | ------------------------ | +| `<` | Menos que | `>` | Mayor que | +| `<=` | Menos que ó igual que | `>=` | Mayor que ó igual que | +| `==` | Igual que | `!=` | Diferente que | + +Como de costumbre, use `System.out.println` para imprimir sus resultados: + +```kotlin +System.out.println(10 < 8); +System.out.println((3 * 6) == (32 - 14)); +``` +{{% notice tip %}} +## Trabajando Juntos + +Elimine todo el texto `System.out.println` en su código. Intenta adivinar las respuestas a las siguientes expresiones. Utilice `System.out.println` para comprobar sus respuestas. + +- `54 < (10 + 32)` +- `(37 / 5) == 7` +- `"Hola" + "Mundo" == "Hola Mundo"` +- `false == false` +{{% /notice %}} + +## Operadores Booleanos + +También puede conectar expresiones booleanas entre sí mediante `&&` (AND) y `||` (OR) operador. Por ejemplo, supongamos que pregunto: "¿Eres un humano y Nuvi es un robot?" La palabra "y" conecta las dos preguntas verdadero-falso. En este caso, dado que es cierto que eres un humano, y también es cierto que Nuvi es un robot, entonces el resultado general es "verdadero". Aquí hay una tabla que describe lo que sucede cuando conectamos booleanos: + +| Expresión | Resultado | Expresión | Resultado | +| --------------------------- | -------- | ------------------------------------- | ------- | +| true && true | `true` | true || true | `true` | +| true && false | `false` | true || false | `true` | +| false && true | `false` | false || true | `true` | +| false && false | `false` | false || false | `false` | + +En resumen, `&&` requiere que ambas expresiones booleanas sean verdaderas, mientras que `||` sólo requiere que una de las dos expresiones booleanas sea verdadera. Aquí hay algunos ejemplos más: + +- `(5 < 8) && (9 != 10)` produce `true` ya que tanto 5 es menor que 8 y 9 no es igual a 10. +- `(6 != 2 * 3) || (8 < 2 * 4)` produce `false` ya que tanto 6 no es igual a 2 * 3, y 8 no siendo menos de 2 * 4 producen `false`. diff --git a/content/espanol/android-tictactoe/comments.md b/content/espanol/android-tictactoe/comments.md new file mode 100644 index 0000000000..fe949dface --- /dev/null +++ b/content/espanol/android-tictactoe/comments.md @@ -0,0 +1,32 @@ +--- +title: "Comentarios" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 6 +--- +Los desarrolladores a menudo necesitan colaborar con otros desarrolladores. Los comentarios son una forma fácil para que los desarrolladores escriban notas en el código y se comuniquen con otros. Los comentarios son ignorados por la computadora; Por lo tanto, también son una manera fácil de decirle a la computadora que no ejecute ciertas líneas de código. Hay dos formas de crear comentarios: + +1. Para comentar una línea, coloca `//` al inicio de una línea de código. Por ejemplo: + +```kotlin +// Este es un comentario de una sola línea. +``` + +2. Para comentar varias líneas a la vez, indique el comienzo del comentario con `/*` y al final del comentario con `*/`. Por ejemplo: + +```kotlin +/* Este es un comentario de varias líneas de código. +Esta línea también es parte del comentario. */ +``` + +Para eliminar un comentario (o descomentar una línea), simplemente elimine el botón `//` para un comentario de una sola línea, o el `/*` y los `*/` caracteres para el comentario de varias líneas. + +{{% notice tip %}} +## Trabajando Juntos + +1. Escribe `//` al inicio de `Toast.makeText(this, "Welcome to Tic-Tac-Toe”, Toast.LENGTH_LONG).show()`. Después presiona el botón de inicio (►), asegurate de que el texto `Bienvenido al juego del Gato` no se muestre en la pantalla. +2. Borra `//` y en su lugar, rodea `Toast.makeText(this, "Welcome to Tic-Tac-Toe”, Toast.LENGTH_LONG).show()` con `/*` y `*/`. Revisa que el texto de `Welcome to Tic-Tac-Toe` sigue sin mostrarse en la pantalla después de presionar el botón de inicio (►). +3. Borra tanto `/*` como `*/`, y presiona el botón de inicio (►). El mensaje de `Welcome to Tic-Tac-Toe` debería de verse en la consola. + A lo largo de los rompecabezas de hoy, verá varios comentarios de varias líneas y `// PUZZLE` comentarios (como el del acertijo 2). Estos comentarios nos guiarán para completar el juego del Gato, así que asegúrate de entender cómo comentar y descomentar el código. + +{{% /notice %}} \ No newline at end of file diff --git a/content/espanol/android-tictactoe/conditionals.md b/content/espanol/android-tictactoe/conditionals.md new file mode 100644 index 0000000000..73775099d8 --- /dev/null +++ b/content/espanol/android-tictactoe/conditionals.md @@ -0,0 +1,25 @@ +--- +title: "Condicionales" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 10 +--- +Podemos usar sentencias `if` para ejecutar una instrucción de código solo si se cumplen ciertas condiciones. + +Por ejemplo: + +```kotlin +if (isRainingOutside == true) { + takeUmbrella = true; +} else { + takeUmbrella = false; +} +``` + +Para nuestro juego, deberíamos usar declaraciones `if` para determinar si un jugador tiene 3 coincidencias verticales, horizontales o diagonales. + +Dentro de los `()` al lado de `if`, debes especificar una _expresión booleana_. Los **booleanos** son declaraciones `true` (verdaderas) o `false` (falsas). Podemos utilizar esto en nuestra declaración `if`. Si la expresión es `true`, se ejecuta el código dentro de `{ }`. Si la expresión es `false`, se ejecuta el código dentro de `{ }` después de la declaración `else`. + +También puedes conectar **expresiones booleanas** usando el operador `&&` (AND) lo cual significa `y` y el operador `||` (OR), el cual significa `ó`. + +Echa un vistazo a la función `CheckWinner()` en `MainActivity.kt` y piensa en lo que están haciendo todas las declaraciones `&&` conectadas. \ No newline at end of file diff --git a/content/espanol/android-tictactoe/numbers.md b/content/espanol/android-tictactoe/numbers.md new file mode 100644 index 0000000000..d7d8aafb5e --- /dev/null +++ b/content/espanol/android-tictactoe/numbers.md @@ -0,0 +1,51 @@ +--- +title: "Números" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 8 +--- +La computadora también puede hacer matemáticas regulares que se ven en la escuela. Utilice ´System.out.println´ para imprimir el resultado de las expresiones matemáticas. + +```kotlin +System.out.println(5 + 4); +System.out.println(6 * (9 - 7) / 3); +``` + +Aquí está la lista completa de símbolos matemáticos que puede usar: + + + + + + + + + + + + + + + + + + + + +
+Suuma\División
-Resta%Módulo (resto)
*Multiplicación(,)Paréntesis
+ +**_Datato curioso: División de Computadora_** + +La computadora hace la división de manera diferente a su calculadora regular. La división de computadoras excluirá los restos o decimales. Por ejemplo, 15 / 4 produce 3, y no 3.75. + +{{% notice tip %}} +## Trabajando Juntos + +Intente imprimir las respuestas a lo siguiente en la consola. Asegúrese de que sus soportes coinciden. Use una calculadora (o matemática mental) para verificar que la computadora produjo la respuesta correcta. + +- `2 - 19` +- `(3 + 5) \* 6` +- `(13 + 5 \* 8) / (6 - (3 + 7))` +- `3 % 2` + +{{% /notice %}} diff --git a/content/espanol/android-tictactoe/printconsole.md b/content/espanol/android-tictactoe/printconsole.md new file mode 100644 index 0000000000..58de0419ce --- /dev/null +++ b/content/espanol/android-tictactoe/printconsole.md @@ -0,0 +1,38 @@ +--- +title: "Imprimiéndolo en Consola" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 4 +--- +A veces, es posible que el juego o la aplicación no funcionen de la manera esperada o que desee escribir algo en la consola con fines de registro. Además de depurar la aplicación, puede usar `System.out.println()` para escribir su mensaje. Busca tus mensajes en la ventana "logcat" en la parte inferior de Android Studio: +Ventana Logcat en Android Studio que muestra los mensajes creados con la función de registro System.out.printIn + +{{% notice tip %}} + +## Trabajando Juntos + +1. Sin quitar las comillas, intente cambiar `"Reiniciando el juego Tac-Tic-Toe!"` a `"Reiniciando el juego Tic-Tac-Toe!" ` o cualquier otra frase que te guste. Presione ejecutar para ver si algo cambia. +2. Agregue otro `System.out.println` debajo de la línea actual para imprimir una segunda oración debajo de la primera oración. +3. Presione ejecutar para ver si se imprimen dos oraciones. Si ves algún texto rojo, pide ayuda. + +{{% /notice %}} + +{{% notice warning %}} +## ¡AYUDA! ¡Tengo un montón de texto rojo! + +Si ve algún texto rojo, ¡ha encontrado algunos errores! Por favor, pida ayuda. Tenga cuidado con lo siguiente al codificar en Android: + +1. `out` y `println` comienzan con una letra minúscula. +2. `Sistema` comienza con una letra mayúscula. +2. Asegúrese de que la oración que desea imprimir esté rodeada de comillas y que la oración esté entre paréntesis. +3. No elimine ninguna llave `{` o `}`. + +{{% /notice %}} + + +`System.out.println` es útil cuando desea corregir errores en el código, pero su usuario (la persona que usa la aplicación) no puede ver el texto impreso con esta función. ¡Pero podemos hacer esto con toasts! Una notificación del sistema es un texto rápido y pequeño que hacemos visible para el usuario. A continuación, le indicamos cómo hacer un toast: + +```kotlin +Toast.makeText(this, "Texto que se quiera mostrar", Toast.LENGTH_SHORT).show() +``` +Ejemplo de toast. Puede utilizar la función toast.makeText con el contexto de argumentos, la cadena de mensaje y Toast.LENGTH_LONG o Toast.LENGTH_SHORT para mostrar un mensaje de bienvenida, como Bienvenido al juego de Gato diff --git a/content/espanol/android-tictactoe/puzzle1.md b/content/espanol/android-tictactoe/puzzle1.md new file mode 100644 index 0000000000..24fb1e2851 --- /dev/null +++ b/content/espanol/android-tictactoe/puzzle1.md @@ -0,0 +1,19 @@ +--- +title: "Acertijo 1 - Ejecuta el juego y resuélvelo" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 2 +--- + +## Ejecuta el juego +Presiona el botón de reproducción (►) en la parte superior de Android Studio para iniciar el juego. +Presiona el botón de inicio + +Verás que el título en la parte superior de la aplicación dice Gota (¡eso no parece correcto!); cambiémoslo a Gato. + +## Resuelve el Acertijo +Haz doble clic en el archivo `strings.xml` debajo de app → res → values: +Muestra cómo navegar por las cadenas de los strings.xml en Android Studio + +¿Cómo puedes modificar este archivo para que diga Tic-Tac-Toe? +Imagen que muestra cómo modificar la cadena de nombre de la aplicación para que diga Gato diff --git a/content/espanol/android-tictactoe/puzzle2.md b/content/espanol/android-tictactoe/puzzle2.md new file mode 100644 index 0000000000..c32ac3bc84 --- /dev/null +++ b/content/espanol/android-tictactoe/puzzle2.md @@ -0,0 +1,22 @@ +--- +title: "Acertijo 2 - Bienvenida al usuario" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 5 +--- +Vamos a agregar un mensaje de bienvenida que el usuario pueda ver cuando inicie tu aplicación! + +Ve a **MainActivity.kt** y encuentra `// PUZZLE 2` en el código y escribe un toast que de la bienvenida al usuario a tu juego con "Bienvenido al juego del Gato". Ahora presiona el botón de inicio (►) en el código y escribe una notificación (toast) del sistema que dé la bienvenida al usuario a tu juego con "Bienvenido al juego del Gato!”. Ahora presiona el botón de inicio (►) en la parte superior de Android Studio y tu app debería tener este aspecto: + +Ejemplo del juego con un mensaje de bienvenida exitoso usando un toast + +{{% notice warning %}} +## ¡AYUDA! ¡Tengo un montón de texto rojo! + +Si ve algún texto rojo, ¡ha encontrado algunos errores! Por favor, pida ayuda. Ten cuidado con lo siguiente al codificar en Android: + +1. La `t` en `Toast` es mayúscula. +2. Asegúrate de que la oración que quieras mostrar este rodeada de comillas, y que los paréntesis estén en el lugar correcto. +3. No elimines ningún signo de llave `{` ó `}`. + +{{% /notice %}} \ No newline at end of file diff --git a/content/espanol/android-tictactoe/puzzle3.md b/content/espanol/android-tictactoe/puzzle3.md new file mode 100644 index 0000000000..9c613eb4ea --- /dev/null +++ b/content/espanol/android-tictactoe/puzzle3.md @@ -0,0 +1,24 @@ +--- +title: "Acertijo 3 - La Prueba Final" +date: 2021-03-13T14:17:07.42-07:00 +draft: false +weight: 11 +--- + +## Acertijo 3a +Este rompecabezas pondrá a prueba tu conocimiento sobre las variables. Hay algo extraño con uno de los colores del jugador en el tablero. + +Busque `// PUZZLE 3a` en el archivo `MainActivity.kt` y actualice la variable `colorGreen` para mostrar piezas de color verde en el tablero. + +## Acertijo 3b +¿Por qué el jugador 2 siempre gana en el primer movimiento? Esto no tiene ningún sentido, resuelve el rompecabezas 3b para arreglar el juego. + +Encuentra `// PUZZLE 3b` en el archivo `MainActivity.kt` y actualiza la variable `winner` para asegurarte de que un jugador realmente gane. + +## Acertijo Final + +Ahora que el Jugador 2 ya no está ganando automáticamente el juego y todas las piezas del juego se ven bien, todavía hay una última cosa que es extraña. Las reglas de Tic-Tac-Toe establecen que un jugador puede ganar cuando el jugador tiene 3 piezas conectadas horizontal, vertical o diagonalmente. El juego funciona bien para detectar las victorias horizontales y verticales, pero algo está mal con la verificación diagonal. + +Busque `// FINAL PUZZLE` en el archivo `MainActivity.kt`. ¡Resuelve este rompecabezas para completar el juego! + +Android juego del Gato diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.gitignore b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.gitignore new file mode 100644 index 0000000000..603b140773 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/.gitignore b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/.gitignore new file mode 100644 index 0000000000..26d33521af --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/.name b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/.name new file mode 100644 index 0000000000..a9863df93a --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/.name @@ -0,0 +1 @@ +Tic-Tac-Toe \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/codeStyles/Project.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/codeStyles/Project.xml new file mode 100644 index 0000000000..7643783a82 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/codeStyles/codeStyleConfig.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000000..79ee123c2b --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/compiler.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/compiler.xml new file mode 100644 index 0000000000..fb7f4a8a46 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/gradle.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/gradle.xml new file mode 100644 index 0000000000..7b46144d88 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/jarRepositories.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/jarRepositories.xml new file mode 100644 index 0000000000..e34606ccde --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/misc.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/misc.xml new file mode 100644 index 0000000000..360e6d41e3 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/vcs.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/vcs.xml new file mode 100644 index 0000000000..b082f7b0ef --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/.gitignore b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/build.gradle b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/build.gradle new file mode 100644 index 0000000000..af434effa7 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/build.gradle @@ -0,0 +1,40 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 33 + + defaultConfig { + applicationId "org.nuevofoundation.tic_tac_toe" + minSdkVersion 16 + targetSdkVersion 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + buildFeatures { + viewBinding = true + } + namespace 'org.nuevofoundation.tic_tac_toe' +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + +} \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/proguard-rules.pro b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/proguard-rules.pro new file mode 100644 index 0000000000..481bb43481 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/androidTest/java/org/nuevofoundation/tic_tac_toe/ExampleInstrumentedTest.kt b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/androidTest/java/org/nuevofoundation/tic_tac_toe/ExampleInstrumentedTest.kt new file mode 100644 index 0000000000..81b11365aa --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/androidTest/java/org/nuevofoundation/tic_tac_toe/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package org.nuevofoundation.tic_tac_toe + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("org.nuevofoundation.tic_tac_toe", appContext.packageName) + } +} \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/AndroidManifest.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..bdb1e58ce0 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/java/org/nuevofoundation/tic_tac_toe/MainActivity.kt b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/java/org/nuevofoundation/tic_tac_toe/MainActivity.kt new file mode 100644 index 0000000000..529557679c --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/java/org/nuevofoundation/tic_tac_toe/MainActivity.kt @@ -0,0 +1,292 @@ +package org.nuevofoundation.tic_tac_toe + +import android.graphics.Color +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.view.View +import android.widget.Button +import android.widget.Toast +import org.nuevofoundation.tic_tac_toe.databinding.ActivityMainBinding +import java.util.* + +class MainActivity : AppCompatActivity() { + private lateinit var binding: ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + binding = ActivityMainBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) + + // PUZZLE 2 + + } + + var player1 = ArrayList() + var player2 = ArrayList() + var activePlayer = 1 + var setPlayer = 1 + var colorBlue = Color.rgb(0, 161, 241) + // PUZZLE 3a + var colorGreen = Color.BLACK + + fun restartGame(view:View) + { + println("Restarting the Tac-Tic-Toe Game!") + binding.topLeftBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.topCenterBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.topRightBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.centerLeftBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.centerBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.centerRightBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.bottomLeftBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.bottomCenterBtn.setBackgroundResource(android.R.drawable.btn_default) + binding.bottomRightBtn.setBackgroundResource(android.R.drawable.btn_default) + + binding.topLeftBtn.text = "" + binding.topCenterBtn.text = "" + binding.topRightBtn.text = "" + binding.centerLeftBtn.text = "" + binding.centerBtn.text = "" + binding.centerRightBtn.text = "" + binding.bottomLeftBtn.text = "" + binding.bottomCenterBtn.text = "" + binding.bottomRightBtn.text = "" + + player1.clear() + player2.clear() + activePlayer = 1 + + binding.topLeftBtn.isEnabled = true + binding.topCenterBtn.isEnabled = true + binding.topRightBtn.isEnabled = true + binding.centerLeftBtn.isEnabled = true + binding.centerBtn.isEnabled = true + binding.centerRightBtn.isEnabled = true + binding.bottomLeftBtn.isEnabled = true + binding.bottomCenterBtn.isEnabled = true + binding.bottomRightBtn.isEnabled = true + + setPlayer = 1 + binding.PVP.setBackgroundColor(colorBlue) + binding.PVC.setBackgroundColor(android.R.drawable.btn_default) + + } + + fun buttonClick(view: View) + { + val buSelected:Button = view as Button + var cellId = 0 + when(buSelected.id) + { + R.id.topLeftBtn -> cellId = 1 + R.id.topCenterBtn -> cellId = 2 + R.id.topRightBtn -> cellId = 3 + + R.id.centerLeftBtn -> cellId = 4 + R.id.centerBtn -> cellId = 5 + R.id.centerRightBtn -> cellId = 6 + + R.id.bottomLeftBtn -> cellId = 7 + R.id.bottomCenterBtn -> cellId = 8 + R.id.bottomRightBtn -> cellId = 9 + } + playGame(cellId,buSelected) + + } + + fun playerChoose(view:View) + { + val ps:Button = view as Button + when(ps.id) + { + R.id.PVP -> { + setPlayer = 1 + ps.setBackgroundColor(colorBlue) + binding.PVC.setBackgroundColor(android.R.drawable.btn_default) + } + R.id.PVC -> { + setPlayer = 2 + ps.setBackgroundColor(colorBlue) + binding.PVP.setBackgroundColor(android.R.drawable.btn_default) + } + } + } + + + private fun playGame(cellId:Int, buSelected:Button) + { + if (activePlayer == 1) + { + buSelected.text = "X" + buSelected.setBackgroundColor(colorGreen) + player1.add(cellId) + activePlayer = 2 + if (setPlayer == 1) + {} + else + { + try { + autoPlay() + }catch (ex:Exception) + { + Toast.makeText(this,"Game Over",Toast.LENGTH_SHORT).show() + } + + } + } + else + { + buSelected.text = "O" + buSelected.setBackgroundColor(colorBlue) + player2.add(cellId) + activePlayer = 1 + } + buSelected.isEnabled = false + checkWinner() + } + + private fun checkWinner() + { + // PUZZLE 3b + var winner = 2 + + //row1 + if (player1.contains(1) && player1.contains(2) && player1.contains(3)) + { + winner = 1 + } + if (player2.contains(1) && player2.contains(2) && player2.contains(3)) + { + winner = 2 + } + + //row2 + if (player1.contains(4) && player1.contains(5) && player1.contains(6)) + { + winner = 1 + } + if (player2.contains(4) && player2.contains(5) && player2.contains(6)) + { + winner = 2 + } + + //row3 + if (player1.contains(7) && player1.contains(8) && player1.contains(9)) + { + winner = 1 + } + if (player2.contains(7) && player2.contains(8) && player2.contains(9)) + { + winner = 2 + } + + //col1 + if (player1.contains(1) && player1.contains(4) && player1.contains(7)) + { + winner = 1 + } + if (player2.contains(1) && player2.contains(4) && player2.contains(7)) + { + winner = 2 + } + + //col2 + if (player1.contains(2) && player1.contains(5) && player1.contains(8)) + { + winner = 1 + } + if (player2.contains(2) && player2.contains(5) && player2.contains(8)) + { + winner = 2 + } + + //col3 + if (player1.contains(3) && player1.contains(6) && player1.contains(9)) + { + winner = 1 + } + if (player2.contains(3) && player2.contains(6) && player2.contains(9)) + { + winner = 2 + } + + // FINAL PUZZLE + + + if (winner != -1) + { + if (winner == 1) + { + if(setPlayer == 1) { + Toast.makeText(this, "Player 1 Wins!!", Toast.LENGTH_SHORT).show() + stopTouch() + } + else + { + Toast.makeText(this, "You Won!!", Toast.LENGTH_SHORT).show() + stopTouch() + } + } + else + { + if (setPlayer == 1) { + Toast.makeText(this, "Player 2 Wins!!", Toast.LENGTH_SHORT).show() + stopTouch() + } + else + { + Toast.makeText(this, "CPU Wins!!", Toast.LENGTH_SHORT).show() + stopTouch() + } + } + } + } + + private fun stopTouch() + { + binding.topLeftBtn.isEnabled = false + binding.topCenterBtn.isEnabled = false + binding.topRightBtn.isEnabled = false + binding.centerLeftBtn.isEnabled = false + binding.centerBtn.isEnabled = false + binding.centerRightBtn.isEnabled = false + binding.bottomLeftBtn.isEnabled = false + binding.bottomCenterBtn.isEnabled = false + binding.bottomRightBtn.isEnabled = false + } + + private fun autoPlay() + { + val emptyCells = ArrayList() + for (cellId in 1..9) { + if (player1.contains(cellId) || player2.contains(cellId)) + {} + else + { + emptyCells.add(cellId) + } + } + + val r = Random() + val randomIndex = r.nextInt(emptyCells.size-0)+0 + val cellId = emptyCells[randomIndex] + + val buSelect:Button? + buSelect = when(cellId) { + 1 -> binding.topLeftBtn + 2 -> binding.topCenterBtn + 3 -> binding.topRightBtn + 4 -> binding.centerLeftBtn + 5 -> binding.centerBtn + 6 -> binding.centerRightBtn + 7 -> binding.bottomLeftBtn + 8 -> binding.bottomCenterBtn + 9 -> binding.bottomRightBtn + else -> binding.topLeftBtn + } + + playGame(cellId,buSelect) + } +} diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000000..2b068d1146 --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/drawable/ic_launcher_background.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..07d5da9cbf --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/layout/activity_main.xml b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000000..d70c83505d --- /dev/null +++ b/content/espanol/android-tictactoe/resources/_gen/files/TicTacToe/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,167 @@ + + + + + + +