Hoy vamos a ver cómo implementar el juego buscaminas en C. Pasa que por diversión quise hacerlo y quedó muy bien a mi parecer.

Se trata del juego buscaminas en donde el usuario elige una casilla para descubrir lo que hay bajo la misma. Si hay una mina, el usuario pierde. En caso de que no, se le muestra al usuario el número de minas que hay cerca a esa casilla.

Lo que haremos será mostrar el tablero de juego, solicitar al usuario la casilla, ocultar las minas de manera aleatoria y saber si el usuario gana o pierde. Todo esto será modificable dentro del código fuente.

Características del juego

Buscaminas en C – Jugando en Ubuntu

Está escrito completamente en C estándar. Compila como un encanto en Windows y Linux (probado en Windows 10 y en Ubuntu, así como en mi Android usando Termux).

Permite personalizar el número de minas, número de filas y columnas

El modo debug permite mostrar las minas, de este modo, puedes ver la ubicación de las minas al realizar pruebas de software

Ahora sí veamos el código fuente y algoritmo.

Versión de C++

Ahora también existe la versión nativa para C++. El código es distinto, pues se usa la programación orientada a objetos pero es interesante de analizar.

Explicación del algoritmo

El algoritmo es realmente sencillo. El tablero de juego será una matriz de tipo char en donde se almacenará determinado carácter. Puede haber:

  • Espacio sin descubrir
  • Espacio descubierto (aquí se dibuja la cantidad de minas que hay cerca)
  • Mina

Para que sea fácil para el usuario, la columna se pide como número, y la fila como letra. Luego, esa letra se convierte a número en donde la A es un 0, la B es un 1, etcétera.

Al dibujar el escenario, se ocultan las minas al usuario. Es decir, no se dibuja el escenario original, sino uno dependiendo del estado del juego. Si se ha ganado o perdido, se muestran las minas.

Lo demás es simplemente el recorrido de la matriz, comprobación de cada char en determinadas coordenadas, etcétera.

Dibujar tablero

Para el tablero dibujamos el encabezado, un separador por cada fila y los datos en sí. También colocamos la letra de la fila en cada paso. Todas las funciones reciben el tablero:

See the gist on github.

Si en el código notas que hay funciones o constantes que no están definidas todavía, no te preocupes, al final dejaré el código completo. Lo que hace este código es dibujar el tablero, ocultar o mostrar las minas y dibujar las minas cercanas en caso de que el usuario haya descubierto una casilla.

Colocar minas de manera aleatoria

Las minas se colocan en el tablero de manera aleatoria. Podemos cambiar el número de las mismas y así agregar dificultar al juego. Lo que se hace es obtener obtener un número aleatorio tanto para la fila como para la columna.

See the gist on github.

Abrir casilla

Esta función es la que invoca el usuario al momento de jugar. Se trata de abrir una casilla y dependiendo de lo que haya en la misma, se devuelve un estado.

Por ejemplo, si hay una mina, se indica. Si la casilla ya estaba abierta también se indica. Estos estados son capturados para saber si el usuario ha perdido o si todo ha ido bien.

See the gist on github.

Esta función recibe las coordenadas tal y como el usuario las ingresa. Convierte la letra a mayúscula, y después la convierte a índice. A la columna le resta 1, pues el usuario final no sabe que los arreglos comienzan en 0.

Por cierto, también estoy usando assert para validar que la columna y la fila son correctos; es decir, que están dentro del rango válido.

Obtener minas cercanas

Para las minas cercanas se visitan las casillas que están junto a la casilla de la coordenada indicada. No importa si está en una esquina o en un borde, esto está validado:

See the gist on github.

Saber si el usuario gana

El usuario gana cuando ya no hay espacios por descubrir. Por lo tanto lo único que hay que hacer es comprobar que ya no haya ninguna casilla con esa característica, recorriendo el tablero.

See the gist on github.

Funcionamiento del juego

Para el juego hacemos un ciclo infinito que se romperá cuando el jugador pierda o gane. En el mismo solicitamos las coordenadas e indicamos el estado. También dibujamos el tablero.

See the gist on github.

Fíjate en que el fin del juego se controla con la variable deberiaMostrarMinas que se activa cuando el jugador pierde o gana, y que ocasiona que se muestren las minas del tablero además de romper el ciclo.

Constantes

Bien, ahora veamos las constantes. Aquí se pueden configurar varios aspectos del juego como el tamaño del tablero, el modo debug (que muestra las minas) o la cantidad de minas.

See the gist on github.

Poniendo todo junto

Creo que ya he explicado lo suficiente. He aquí el código completo:

See the gist on github.

Si quieres compilarlo instala gcc u otro compilador de C (debería funcionar también en el editor Dev C++). Luego compila con:

gcc main.c

Ejecuta el archivo de salida y listo. También puedes probarlo en línea.

Por cierto, en los comentarios he colocado algunos errores esperados.

Vídeo de YouTube

En caso de que no hayas entendido algo, aquí tengo un vídeo explicando el juego y su funcionamiento:

Conclusión

Nota: el código fuente actualizado está en mi GitHub. Si vas por ahí, déjale una estrella y sígueme, que nada te cuesta.

Oh, y si te lo preguntas, lo he escrito en C para que sea sencillo portarlo a otros lenguajes de programación.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

3 días hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

4 días hace

PHP: incrustar imagen en base64

El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…

4 días hace

Plugin ESC POS – Actualización 3.4.0: imprimir HTML

El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…

5 días hace

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

2 semanas hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

2 semanas hace

Esta web usa cookies.