Artículos sobre programación

¡Bienvenido a "Blog Con Clase"!

Desde aquí hay acceso a pequeños artículos sobre programación, algoritmos, teoría, programación de dispositivos, multimedia, juegos, etc.

Esta sección funciona como un blog, y está abierta para cualquiera que quiera colaborar.

Por supuesto, siempre agradeceremos tu colaboración, ya sea como alumno, como autor de programas, como articulista o como colaborador en la lista de correo.

Artículos

Resolución de sudokus (15)

Bugs

Por desgracia ni nuestros algoritmos ni nuestro código está a salvo de errores. Lamentablemente, en algunos de los procedimientos que hemos visto he cometido algunos bastante serios.

Resolución de sudokus (14)

Hilo de cometa y rectángulos eludibles

Hilo de cometa Este método probablemente sea más sencillo de aplicar y más intuitivo que otros que hemos visto, como es rascacielos o incluso que XY-Wing. No he encontrado ningún sudoku en el que se pueda aplicar éste método que aporte información que no hayan aportado alguno de los métodos que ya hemos visto. Pero como estos patrones pueden ser más fácil de detectar que otros, lo procesaremos antes que ellos.

Resolución de sudokus (13)

Rectángulos vacíos

Esta técnica consiste en encontrar una caja k, en las que un candidato solo aparezca en una fila y una columna. A continuación hay que localizar una fila en la que el candidato solo aparezca en dos casillas, un una de esas casillas coincida con la columna de candidatos de la caja k. En la casilla que esté en la intersección de la columna de la otra casilla y en la fila de la caja k se podrá eliminar el valor como candidato.

Resolución de sudokus (12)

Sashimi y rascacielos

Para comprender esta técnica hay que verla como un X-Wing con alas en el que falta el candidato en la casilla que tiene el o las alas.

Resolución de sudokus (11)

XYZ-Wing.

La idea de este método es relativamente sencilla, si comprendemos correctamente cómo funciona un patrón XY-Wing.

Resolución de sudokus (10)

Patrones de solución única.

Volvamos a este sudoku que nos quedó al aplicar el patrón X-Wing. Este tablero tiene una característica muy interesante: todas las casillas vacías tienen dos candidatos, excepto una que tiene tres.

Resolución de sudokus (9)

Pez espada.

Este método es una generalización del X-Wing. Consiste en encontrar tres filas o columnas en las que solo aparezca un candidato en tres casillas de esas tres filas y columnas en las mismas columnas o filas.

Resolución de sudokus (8)

X-Wing y X-Wing con alas.

Aún existen situaciones en las que ninguna de las técnicas anteriores nos puede ayudar a resolver el sudoku. Veamos ahora otra técnica que podemos probar.

Resolución de sudokus (7)

XY-Wing.

La idea de este método es sencilla, aunque localizar dónde aplicarla en un sudoku puede que no sea tan intuitivo.

Resolución de sudokus (6)

Parejas, trios y cuartetos ocultos.

Si hay que llegar a este punto para resolver un sudoku ya podemos considerarlo como difícil. El criterio es que hasta ahora hemos trabajado con bloques: filas, columnas y cajas, pero a partir de ahora tenemos que trabajar con casillas individuales de todo el tablero. La diferencia puede parecer sutil, pero se necesita más concentración y mas tiempo para localizar las relaciones entre casillas con los métodos que veremos a partir de ahora. Y eso irá en aumento a medida que tengamos que recurrir a métodos más complejos.

Resolución de sudokus (5)

Marcas de lápiz y parejas y trios punteros.

A partir de aquí será necesario hacer todas las marcas de lápiz en todas las casillas. Una vez hecho eso podemos volver a aplicar algunos métodos conocidos, como el de parejas desnudas, ya que puede que aparezcan algunas que no se habían revelado con los métodos anteriores.

Resolución de sudokus (4)

Parejas desnudas.

Veamos otro sudoku parcialmente solucionado con las técnicas que hemos incorporado hasta ahora, y fijémonos en la segunda fila.

Resolución de sudokus (3)

Candidatos únicos y solitarios.

Otra técnica que podemos considerar básica es localizar filas, columnas o cajas con un único candidato posible.

Fijémonos en la tercera columna, en la que sólo hay una casilla libre, y el único valor que falta es el 9. Esto nos proporciona algunos valores adicionales.

Resolución de sudokus (2)

Criba de casillas.

Empecemos a implementar algunos métodos de resolución.

El primero se conoce como "tres en raya" o "tic-tac-toe". Trabajaremos con filas y columnas, pero de cajas. Para cada una de esas filas y columnas buscaremos valores que estén presentes en dos de las cajas.

Resolución de sudokus

Reglas y Sudokus válidos

El sudoku es un juego, o pasatiempo, que se ha hecho muy popular. A mucha gente, yo incluido, le resulta muy entretenido.

Programando SNAKE en c++

El cuerpo de la serpiente esta constituido por varias partes, cada una con distintas coordenadas, por lo que debemos plantearnos la idea de que necesitaremos de una matriz para guardar las coordenadas de cada parte de la serpiente.

Esperar a que terminen los hilos

La solución que hemos usado para asegurarnos de que los hilos han terminado antes de salir no es demasiado elegante. Sólo esperamos dos segundos, y damos por supuesto que en ese tiempo los hilos han tenido tiempo de sobra para terminar, lo cual es cierto, al menos en este ejemplo. Pero puede que en otros usos de hilos esto no sea tan simple, y de todos modos, no parece que esperar un tiempo fijo antes de cerrar sea la mejor forma de terminar un programa.

Hilos

Esto es una primera aproximación al uso de hilos en Windows. El tema es mucho más extenso y complejo de lo que se explica aquí, pero daremos algunas nociones para poder usarlos en nuestros programas y más concretamente, en juegos para la consola de Windows.

Gestión de recursos

A lo largo del programa necesitaremos usar a algunos recursos. Ya hemos resuelto los referentes a los gráficos de los naipes, máscaras, icono, cursor... Pero necesitaremos algunos otros, que incorporaremos a nuestro fichero de recursos.

Dificultades

A la hora de implementar el juego e interactuar con el usuario tenemos varias opciones.

La forma más simple de capturar las jugadas es que el usuario señale el naipe que quiere mover con el ratón, marcarla de alguna manera, ya sea con video inverso o mediante un marco, esperar a que el usuario marque la columna de destino, y realizar el movimiento.

Gráficos

Esta clase es la encargada de actualizar la ventana para que refleje el estado del tapete.

Necesitamos almacenar varios datos:

Movimiento

Cada vez que el jugador realice un movimiento, el programa lo almacenará en una pila. Esto nos permitirá implementar una opción de deshacer.

Cada movimiento necesita almacenar dos valores:

origen:
Identificador de la pila de origen del Naipe.
destino:
Identificador de la pila de destino del Naipe.

Análisis del juego

Pero volvamos al papel. Vamos a diseñar un programa orientado a objetos. Lo primero es, por supuesto, identificar los objetos.

Algunos de ellos son obvios: el naipe, la baraja, el tapete (donde colocaremos las cartas) En principio, para hacer solitarios no necesitamos mucho más.

Cómo usar DLL de gráficos en nuestros programas

Para este ejemplo desarrollaremos un juego de cartas, y tomaremos prestada la baraja de Microsoft, que está incluida en una DLL de recursos llamada "Cards.dll". Esto nos ahorrará gran parte del trabajo de diseño gráfico.

Un juego solitario de cartas

Como ya vimos con el juego de la serpiente, el diseño de un juego, como el de cualquier aplicación, requiere cierto trabajo de análisis. De hecho esta fase suele ser la más importante y la más difícil.

Clase CJuego

La clase CJuego es la encargada de crear y destruir todos los objetos que se necesitan a lo largo del juego. Además, actualiza los menús y los procesa.

También mueve la serpiente y actualiza los extras.

Clase CComida

De nuevo se trata de una clase sencilla, definida por completo en el fichero de cabecera, "comida.h":

Clase CGraficos

La clase CGráficos se encargará de todo lo relacionado con la visualización de elementos en pantalla.

Fichero de cabecera "graficos.h":

Programación

Lo primero que haremos será crear un proyecto Windows App usando Dev-C++, para crear una aplicación Windows GUI, con el nombre "Serpiente". Para crear este programa he usado la versión 4.9.6.0 de Dev-C++, que aún no es definitiva, es posible que existan algunos problemas si se intenta compilar con otras versiones, sobre todo si son más antiguas. Cuando exista una versión 5 definitiva se revisará este artículo.

Algoritmos

Partiremos de un laberinto que puede ser vacío y que el usuario podrá elegir en función de la dificultad, asignaremos a la serpiente una posición de salida y colocaremos comida en un punto del laberinto determinado.

Definición de Objetos

Para la serpiente necesitamos mantener varios valores importantes, que nos permiten saber en cada instante dónde se encuentra cada una de sus partes, en qué dirección se mueve, si está creciendo, y qué longitud le queda por crecer.

El Juego de la Serpiente

El objetivo de este artículo es ilustrar por una parte el modo en que se diseña una aplicación orientada a objetos, y por otra el uso del API de Windows.

El código del Mastermind

En este documento pretendo explicar y resaltar algunas partes del código para su mejor comprensión, ya que, aún en el mismo lenguaje, cada persona programa a su manera.