Está en la página 1de 16

UNIVERSIDAD PRIVADA DEL VALLE

FACULTAD DE INFORMATICA Y ELECTRONICA


INGENIERIA DE SISTEMAS INFORMATICOS Evaluación
SEDE LA PAZ
PROGRAMACION MOVIL II (B)

JUEGO DE 3 EN RAYA

Estudiante:
Fernando Andrés Mendiola Andrade

Docente:

Rodmy Orellana

La Paz 18 de agosto del 2023


Gestión 2 – 2023
INDICE
1 INTRODUCCION........................................................................................................1

2 PROGRAMA...............................................................................................................1

3 BIBLIOGRAFIA.........................................................................................................13
1 INTRODUCCION
Los juegos han sido una parte fundamental de la historia de la humanidad,
proporcionando entretenimiento, desafíos y oportunidades para ejercitar la mente. Uno
de los juegos más icónicos y sencillos en este sentido es el "3 en raya", también
conocido como "Tres en línea" o "Tic-Tac-Toe". Este juego estratégico de tablero ha
perdurado a lo largo de los siglos y ha encontrado su camino hacia la era digital a
través de la programación. En este informe, exploraremos la implementación del juego
"3 en raya" utilizando el lenguaje de programación Kotlin.

El Juego "3 en Raya": Un Vistazo al Clásico de la Estrategia

El juego "3 en raya" es un desafío de ingenio que enfrenta a dos jugadores en un


tablero cuadrado de 3x3 casillas. Cada jugador está representado por un símbolo
distintivo, generalmente "X" u "O". El objetivo del juego es lograr ser el primero en
alinear tres de tus propios símbolos en una fila, ya sea horizontal, vertical o diagonal.
Aunque las reglas son simples, el juego requiere de una estrategia cuidadosa para
bloquear a tu oponente y buscar oportunidades de victoria.

Kotlin: El Lenguaje de Programación en Acción

Kotlin, un lenguaje de programación moderno y versátil se ha convertido en una


elección popular para el desarrollo de aplicaciones Android y más allá. En esta
implementación del juego "3 en raya", utilizaremos Kotlin para crear una experiencia
interactiva que refleje las reglas y dinámicas del juego tradicional. Desde la lógica
subyacente que controla las jugadas hasta la interfaz de usuario que permite a los
jugadores interactuar con el tablero, Kotlin se convierte en la herramienta central para
dar vida a este clásico juego.

2 PROGRAMA

1
1.2.1 Codigo

<?xml version="1.0" encoding="utf-8"?>


<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
tools:context=".MainActivity">

<LinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/imageButton2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">

<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />

<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />

<Button
android:id="@+id/btn3"
android:layout_width="match_parent"
android:layout_height="match_parent"

2
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">

<Button
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />

<Button
android:id="@+id/btn5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />

<Button
android:id="@+id/btn6"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">

<Button
android:id="@+id/btn7"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />

<Button
android:id="@+id/btn8"

3
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />

<Button
android:id="@+id/btn9"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="pressButton"
tools:ignore="SpeakableTextPresentCheck" />
</LinearLayout>
</LinearLayout>

<ImageButton
android:id="@+id/imageButton2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:onClick="startAgain"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@drawable/ic_baseline_autorenew_24"
tools:ignore="SpeakableTextPresentCheck,SpeakableTextPresentCheck"
android:minHeight="48dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Este código XML define una interfaz de usuario en Android utilizando el


lenguaje de diseño de Android XML. La interfaz está construida utilizando el
ConstraintLayout de AndroidX, que es un tipo de diseño flexible que permite
posicionar y alinear elementos de la interfaz de usuario de manera Este
código XML define una interfaz de usuario en Android utilizando el lenguaje
de diseño de Android XML. La interfaz está construida utilizando el
ConstraintLayout de AndroidX, que es un tipo de diseño flexible que permite
posicionar y alinear elementos de la interfaz de usuario de manera más
controlada y versátil. A continuación, te explicaré los componentes
principales del código:

4
<?xml version="1.0" encoding="utf-8"?>: Esta línea declara la versión del
XML y la codificación utilizada.

<androidx.constraintlayout.widget.ConstraintLayout>: Es la vista raíz que


contiene todos los elementos de la interfaz de usuario. Se utilizan atributos
para definir propiedades del layout, como su tamaño y contexto.
<LinearLayout>: Estos son contenedores para los botones dispuestos en filas
y columnas. Los botones están organizados en tres filas y tres columnas
dentro de estos LinearLayout. Cada LinearLayout tiene un atributo
layout_weight que distribuye el espacio disponible de manera equitativa entre
sus hijos.
<Button>: Cada uno de los botones tiene un ID único asignado (btn1,
btn2, ..., btn9) y comparten un atributo android:onClick que se refiere a una
función llamada pressButton (que debería estar definida en el código
Java/Kotlin correspondiente) que se ejecutará cuando se haga clic en
cualquiera de estos botones.
<ImageButton>: Este es un botón de imagen (imagen de un círculo con una
flecha) con un ID imageButton2. También tiene un atributo android:onClick
que se refiere a una función llamada startAgain. La imagen en este botón se
establece usando app:srcCompat con una imagen vectorial.
Atributos de diseño (app:layout_constraint...): Estos atributos establecen las
restricciones de diseño para los elementos, definiendo cómo se posicionan y
alinean. Por ejemplo, app:layout_constraintTop_toTopOf="parent" significa
que el elemento se alineará con la parte superior del padre.más controlada y
versátil. A continuación, te explicaré los componentes principales del código:
<?xml version="1.0" encoding="utf-8"?>: Esta línea declara la versión del
XML y la codificación utilizada.
<androidx.constraintlayout. widget.ConstraintLayout>: Es la vista raíz que
contiene todos los elementos de la interfaz de usuario. Se utilizan atributos
para definir propiedades del layout, como su tamaño y contexto.

5
<LinearLayout>: Estos son contenedores para los botones dispuestos en filas
y columnas. Los botones están organizados en tres filas y tres columnas
dentro de estos LinearLayout. Cada LinearLayout tiene un atributo
layout_weight que distribuye el espacio disponible de manera equitativa entre
sus hijos.
<Button>: Cada uno de los botones tiene un ID único asignado (btn1,
btn2, ..., btn9) y comparten un atributo android:onClick que se refiere a una
función llamada pressButton (que debería estar definida en el código
Java/Kotlin correspondiente) que Este código XML define una interfaz de
usuario en Android utilizando el lenguaje de diseño de Android XML. La
interfaz está construida utilizando el ConstraintLayout de AndroidX, que es un
tipo de diseño flexible que permite posicionar y alinear elementos de la
interfaz de usuario de manera más controlada y versátil. A continuación, te
explicaré los componentes principales del código:
<?xml version="1.0" encoding="utf-8"?>: Esta línea declara la versión del
XML y la codificación utilizada.
<androidx.constraintlayout.widget.ConstraintLayout>: Es la vista raíz que
contiene todos los elementos de la interfaz de usuario. Se utilizan atributos
para definir propiedades del layout, como su tamaño y contexto.
<LinearLayout>: Estos son contenedores para los botones dispuestos en filas
y columnas. Los botones están organizados en tres filas y tres columnas
dentro de estos LinearLayout. Cada LinearLayout tiene un atributo
layout_weight que distribuye el espacio disponible de manera equitativa entre
sus hijos.
<Button>: Cada uno de los botones tiene un ID único asignado (btn1,
btn2, ..., btn9) y comparten un atributo android:onClick que se refiere a una
función llamada pressButton (que debería estar definida en el código
Java/Kotlin correspondiente) que se ejecutará cuando se haga clic en
cualquiera de estos botones.
<ImageButton>: Este es un botón de imagen (imagen de un círculo con una
flecha) con un ID imageButton2. También tiene un atributo android:onClick

6
que se refiere a una función llamada startAgain. La imagen en este botón se
establece usando app:srcCompat con una imagen vectorial.
Atributos de diseño (app:layout_constraint...): Estos atributos establecen las
restricciones de diseño para los elementos, definiendo cómo se posicionan y
alinean. Por ejemplo, app:layout_constraintTop_toTopOf="parent" significa
que el elemento se alineará con la parte superior del padre.
se ejecutará cuando se haga clic en cualquiera de estos botones.
<ImageButton>: Este es un botón de imagen (imagen de un círculo con una
flecha) con un ID imageButton2. También tiene un atributo android:onClick
que se refiere a una función llamada startAgain. La imagen en este botón se
establece usando app:srcCompat con una imagen vectorial.
13. Atributos de diseño (app:layout_constraint...): Estos atributos establecen
las restricciones de diseño para los elementos, definiendo cómo se
posicionan y alinean. Por ejemplo,
app:layout_constraintTop_toTopOf="parent" significa que el elemento se
alineará con la parte superior del padre.

Interfaz del juego en 3 en raya

2.2.1 MainActivity
package com.example.a3enraya

7
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.example.a3enraya.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

private lateinit var binding:ActivityMainBinding


private var player:Char='X'

override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}

fun pressButton(view: View){


val button=view as Button
button.setText("$player")
button.setEnabled(false)
if(missingWinner(player)) {winnerFounded()}
player=changePlayer(player)
}

private fun changePlayer(player:Char):Char{


return when(player){
'X' -> 'O'
'O' -> 'X'
else -> 'p'
}
}

private fun missingWinner(player:Char):Boolean{


var playerStr=player.toString()
if(binding.btn1.getText().toString()==playerStr &&
binding.btn2.getText().toString()==playerStr &&
binding.btn3.getText().toString()==playerStr){
return true
}else if(binding.btn4.getText().toString()==playerStr &&
binding.btn5.getText().toString()==playerStr &&
binding.btn6.getText().toString()==playerStr){
return true
}else if(binding.btn7.getText().toString()==playerStr &&
binding.btn8.getText().toString()==playerStr &&
binding.btn9.getText().toString()==playerStr){
return true
}else if(binding.btn1.getText().toString()==playerStr &&
binding.btn5.getText().toString()==playerStr &&
binding.btn9.getText().toString()==playerStr){
return true
}else if(binding.btn3.getText().toString()==playerStr &&
binding.btn2.getText().toString()==playerStr &&
binding.btn7.getText().toString()==playerStr) {
return true

8
}else if(binding.btn1.getText().toString()==playerStr &&
binding.btn4.getText().toString()==playerStr &&
binding.btn7.getText().toString()==playerStr){
return true
}else if(binding.btn2.getText().toString()==playerStr &&
binding.btn5.getText().toString()==playerStr &&
binding.btn8.getText().toString()==playerStr){
return true
}
else if(binding.btn3.getText().toString()==playerStr &&
binding.btn6.getText().toString()==playerStr &&
binding.btn9.getText().toString()==playerStr){
return true
}
return false
}
private fun winnerFounded(){
setEnabledButtons(false)
Toast.makeText(this,"GANADOR: $player.\uD83C\
uDFC6",Toast.LENGTH_SHORT).show()
}

private fun setEnabledButtons(state:Boolean){


binding.btn1.setEnabled(state)
binding.btn2.setEnabled(state)
binding.btn3.setEnabled(state)
binding.btn4.setEnabled(state)
binding.btn5.setEnabled(state)
binding.btn6.setEnabled(state)
binding.btn7.setEnabled(state)
binding.btn8.setEnabled(state)
binding.btn9.setEnabled(state)
}

fun startAgain(view:View){
setEnabledButtons(true)

binding.btn1.setText("")
binding.btn2.setText("")
binding.btn3.setText("")
binding.btn4.setText("")
binding.btn5.setText("")
binding.btn6.setText("")
binding.btn7.setText("")
binding.btn8.setText("")
binding.btn9.setText("")
}
}

ahora lo explicaremos paso a paso:

9
package com.example.a3enraya

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.example.a3enraya.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

// Declaración de variables y atributos


private lateinit var binding: ActivityMainBinding
private var player: Char = 'X'

override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}

// Función llamada cuando un botón es presionado


fun pressButton(view: View) {
val button = view as Button
button.text = "$player" // Establece el símbolo del jugador actual en el botón
button.isEnabled = false // Deshabilita el botón después de ser presionado
if (missingWinner(player)) {
winnerFounded() // Si hay un ganador, muestra el mensaje de ganador
}
player = changePlayer(player) // Cambia al siguiente jugador
}

// Función para cambiar de jugador


private fun changePlayer(player: Char): Char {
return when (player) {
'X' -> 'O'
'O' -> 'X'
else -> 'p' // Esto nunca se ejecutará debido a la estructura anterior
}
}

// Función para verificar si un jugador ha ganado


private fun missingWinner(player: Char): Boolean {
// Verifica todas las posibles combinaciones ganadoras en el tablero
val playerStr = player.toString()
return (binding.btn1.text.toString() == playerStr && binding.btn2.text.toString() == playerStr &&
binding.btn3.text.toString() == playerStr) ||

10
(binding.btn4.text.toString() == playerStr && binding.btn5.text.toString() == playerStr &&
binding.btn6.text.toString() == playerStr) ||
// ... y así sucesivamente para todas las combinaciones
}

// Función para mostrar el mensaje del ganador y deshabilitar los botones


private fun winnerFounded() {
setEnabledButtons(false)
Toast.makeText(this, "GANADOR: $player.", Toast.LENGTH_SHORT).show()
}

// Función para habilitar o deshabilitar todos los botones


private fun setEnabledButtons(state: Boolean) {
binding.btn1.isEnabled = state
// ... Repetir para todos los botones btn2, btn3, ..., btn9
}

// Función llamada cuando se presiona el botón "Volver a empezar"


fun startAgain(view: View) {
setEnabledButtons(true) // Habilita todos los botones

// Borra el texto de todos los botones


binding.btn1.text = ""
// ... Repetir para todos los botones btn2, btn3, ..., btn9
}
}

• La actividad se inicia definiendo la clase MainActivity, que hereda de


AppCompatActivity, que es la base para las actividades en Android.
• Se utiliza el enlace de datos (binding) para acceder a los elementos de la
interfaz de usuario definidos en el archivo XML (activity_main.xml). Esto se
logra mediante la declaración private lateinit var binding: ActivityMainBinding.
• En el método onCreate, se configura el enlace de datos y se establece el
contenido de la vista mediante setContentView(binding.root).
• Cuando un botón es presionado, se llama a la función pressButton. Esta
función actualiza el texto del botón con el símbolo del jugador actual,
deshabilita el botón para evitar más movimientos y verifica si ese movimiento
resulta en una victoria.
• La función changePlayer cambia el jugador actual del juego. Si el jugador
actual es 'X', se cambia a 'O', y viceversa.

11
• La función missingWinner verifica si un jugador ha ganado revisando
todas las posibles combinaciones ganadoras en el tablero. Si se encuentra
una combinación ganadora, la función devuelve true.
• La función winnerFounded muestra un mensaje emergente (Toast)
anunciando al ganador y deshabilita todos los botones para evitar más
movimientos.
• La función setEnabledButtons habilita o deshabilita todos los botones en
función del estado proporcionado como argumento.
• La función startAgain se llama cuando se presiona el botón "Volver a
empezar". Esta función habilita todos los botones y borra el texto de todos los
botones para reiniciar el juego.

12
3 BIBLIOGRAFIA

Detectar quien gana en 3 en Raya con Kotlin. (s/f). Stack Overflow en español.

Recuperado el 18 de agosto de 2023, de

https://es.stackoverflow.com/questions/531595/detectar-quien-gana-en-3-en-

raya-con-kotlin

Cómo crear y usar funciones en Kotlin. (s/f). Android Developers. Recuperado el 18 de

agosto de 2023, de https://developer.android.com/codelabs/basic-android-

kotlin-compose-functions?hl=es-419

Facialix. (2022, julio 30). Udemy Gratis: Juego de tres en raya en Kotlin, estudio de

desarrollo de aplicaciones para Android. Facialix.

https://blog.facialix.com/udemy-gratis-juego-de-tres-en-raya-en-kotlin-estudio-

de-desarrollo-de-aplicaciones-para-android/

13

También podría gustarte