sábado, 5 de marzo de 2022

Arch linux actualización a Jenkins 2.337 - java 11

 Hace poco estaba instalando jenkins de manera local en mi ArchLinux, para esto utilice los pasos en la documentación oficial.

Jenkins funcionó bien pero me alerto que estaba usando java 8 y que recomendaban utilizar java 11. Además que recomendaban utilizar una versión más reciente de Jenkins. 

Utilizando java 11

Para instalar java 11 se puede utilizar la documentación oficial de la wiki de Arch. 

Una vez instalado hay que revisar el directorio /usr/lib/jvm/java-11-openjdk/bin/
 donde debería estar instalado java, si se instalo en otra parte, hay que utilizar el directorio de la instalación. 

Ahora que establecimos el directorio de instalación de java podemos actualizar el archivo de configuración para especifijar el java a utilizar, este se encuentra en /etc/conf.d/jenkins y podemos modificarlo con el editor de tu preferencia. 

El archivo debe quedar de la siguiente manera: 





Solo debemos cambiar la primera línea en la que especifica la versión de java que utiliza la instalación. 

Actualizando Jenkins


Dentro del archivo de configuración /etc/conf.d/jenkins encontramos la siguiente línea: 



Ahora podemos descargar la actualización de jenkins desde el sitio oficial, debemos de copiar el .war  en la ruta especificada en el archivo de configuración, que en este caso es /usr/share/java/jenkins/ , importante reemplazar el archivo anterior. 

Una vez realizado esto podemos reiniciar el servicio que en mi caso va con el siguiente comando. 

sudo systemctl restart jenkins  

Y tenemos jenkins actualizado. 


viernes, 25 de febrero de 2022

Totito - Usuario vrs Computadora (java consola - sin clases - static)

A continuación voy a hacer una breve descripción de una solución para un juego de totito el cual permita jugar contra la computadora, la computadora debe realizar el tiro más inteligente posible.

Enlace al repositorio de github

Enlace a la playlist de youtube donde esta el desarrollo de la solución.

Consideraciones

Es para el curso de programación de computadoras 1 del CUNOC/USAC, el objetivo de este ejemplo es mostrar las ventajas de utilizar programación modular, por esta razón no se usaran clases. Por lo tanto la solución estará en consola.

Ejecución

Dado que es solo un archivo desde java 11 lo podemos ejecutar de la siguiente manera:

java Totito.java

Acerca del juego

El juego consiste en que se tiene una matriz de tres por tres en la que dos jugadores en cada turno pueden poner una ficha, usualmente se usa "X" y "O". El objetivo es conseguir tres figuras iguales contiguas, puede ser horizontal, vertical u oblicuo. ##titulo Juego inicial

Juego inicial

En la siguiente gráfica se muestra en verde partidas en las cuales el jugador gana, en rojo se muestran la posición de fichas que no funcionan para ganar.

Formas de ganar

Aproximación a la solución

Para solucionar este problema utilizaremos el pensamiento computacional. Para esta solución tratare de no pintar una matriz sencilla, sino trataremos de que la visualización sea un poco más elaborada a pesar que lo estamos haciendo en consola.

No describire cada parte del pensamiento computacional, me enfocaré más en la parte de la descomposición. La solución completa la dividimos de la siguiente manera:

  1. Manejar la información de la partida
    1. Pintar el tablero
    2. Pintar una casilla
    3. Pintar casillas contiguas
    4. Pintar el tablero completo
  2. Tiro del usuario
    1. Solicitar coordenadas
    2. Verficiar que el tiro sea posible
    3. Agregarlo al juego
  3. Tiro de la computadora
    1. Verificar los espacios disponibles para tirar
    2. Valorar para encontrar el mejor tiro
    3. Realizar el tiro
  4. Lógica del juego
    1. Random para los jugadores
    2. Inicializar variables
    3. Permitir que los jugadores tiren
    4. Verificar que si hay tiros posibles aún
    5. Verificar si hay un ganador

0. Manejar la información de la partida

Para pintar el tablero primero revisamos como guardar nuestra matriz para manejar la información de la partida. Utilizaremos una matriz de enteros. La información del tablero la vamos abstraer de la siguiente manera:

Esta es la representación sencilla

Juego inicial

La abstraemos de la siguiente manera

Juego abstraido

Por lo tanto la información es representada de la siguiente manera:

  • 0: representa una casilla vacía
  • 1: representa una ocupada por "X"
  • 2: representa una ocupada por "O"

1. Pintar el tablero

Ya que definimos la forma de manejar la información de la partida, ahora vamos a ver la forma de pintar el tablero de una manera más agradable que solo utilizar un carácter para representar cada parte del tablero.

Dado que tenemos casillas en blanco, x y O, vamos a tratar de pintarlo de la siguiente manera

pintando casillas

En la imagen se muestra que utilizaremos tres lineas para pintar cada una casilla, además utilizaremos cuatro caracteres por línea para presentar cada espacio. Al momento de juntar cada casilla lo veremos de la siguiente manera:

pintando matriz completa

Vamos a separar cada parte del tablero con "|" y con "-".

Para esto utilizamos los métodos en el código:

  • pintarFila: el cual recibe el tipo de casilla que se debe de pintar y retorna 4 carácteres para pintar una línea en específico de la casilla.
  • pintarTablero: recorre toda la matriz y utiliza pintarFila para poner una parte de la línea a la par de la otra hasta tener el tablero completo.

2. Tiro del usuario

Para manejar el tiro del usuario solo tenemos un método que se encarga de solicitar el lugar donde quiere hacer su siguiente jugada, revisa que realmente el espacio este vacio, de lo contrario solicita que se vuelva a pedir una posición valida.

3. Tiro de la computadora

Esta parte se vuelve un poco más compleja, y necesitamos definir un procedimiento para que la computadora pueda elegir el tiro que le convenga más. Para esto vamos a responder las siguientes preguntas y asignarle una prioridad:

  1. ¿Puedo ganar en este turno?
  2. ¿El jugador puede ganar en el siguiente turno?
  3. ¿Tengo posibilidad de ganar dos turnos adelante
  4. ¿El jugador tiene posibilidad de ganar dos turnos adelante?
  5. Un tiro que no significa nada.

Res pondiendo esto vamos a plantear el tablero como una matriz de posibilidades con la siguiente estructura:

Valor CasillaDescripción
0El tiro no es posible, la casilla esta ocupada.
1Es el peor tiro que puede hacerse, no tiene ningún beneficio.
4Significa que hay dos lugares consecutivos seguidos y una ficha del jugador rival, y si el jugador los ocupa, puede ganar en dos turnos.
5Significa que hay dos lugares vacíos consecutivos, en línea con una ficha de la computadora, quiere decir que la computadora puede ganar en dos turnos.
10Significa que la casilla esta vacía y tiene dos fichas en línea del jugador rival, el jugador rival gana en el siguiente turno.
15Significa que la casilla esta vacía, y en línea hay dos fichas que pertenecen a la computadora. En el siguiente turno gana la computadora.

Para poder llegar a tener algo de la siguiente manera:Matriz de posibilidades

Realizando esto se nos facilita la desición de ejecutar el siguiente tiro. Simplemente buscamos el valor más alto. En el caso de que tengamos varios podemos seleccionar aleatoriamente o agregarle más lógica para definir si podemos aumentar la presición de las prioridades.

En el caso de las comparaciones para definir esta matriz la lógica que se siguio fue la siguiente:

Matriz comparaciones

La imagen anterior tiene las siguientes consideraciones, 1) la única parte de del tablero es la que esta marcada en gris. 2) los cuadros extras que estan en blanco sirvieron para considerar que debiamos revisar los límites del tablero para evitar un error en tiempo de ejecución.

Si tomamos en cuenta que estamos ubicados en la posición [y][x] debemos de revisar lo siguiente:

  • Vertical: debemos revisar las posibilidades hacía arriba y abajo.
  • Horizontal: debemos revisar las posibilidades de derecha a izquierda
  • Diagonal: debemos tomar en cuenta las posibilidades en diagonal.

Lógica del juego

La lógica del juego es bastante sencilla, al inicial la partida hay un random para decidir el jugador que inicia con la partida, tambien hay una parte de estadisticas. Se encarga de revisar si hay un jugador que haya ganado a cada tiro de los jugadores.

A continuación se muestra el funcionamiento del juego

juego 1 juego 2 juego 3 juego 4 juego 5 juego 6

Arch linux actualización a Jenkins 2.337 - java 11

 Hace poco estaba instalando jenkins de manera local en mi ArchLinux, para esto utilice  los pasos en la documentación oficial. Jenkins func...