Tabla de contenido:

Minesweeper-Raspberry-Pi-Edition: 7 pasos (con imágenes)
Minesweeper-Raspberry-Pi-Edition: 7 pasos (con imágenes)

Video: Minesweeper-Raspberry-Pi-Edition: 7 pasos (con imágenes)

Video: Minesweeper-Raspberry-Pi-Edition: 7 pasos (con imágenes)
Video: Hacking Minesweeper 2024, Mes de julio
Anonim
Buscaminas-Raspberry-Pi-Edition
Buscaminas-Raspberry-Pi-Edition
Buscaminas-Raspberry-Pi-Edition
Buscaminas-Raspberry-Pi-Edition

Mi proyecto final para la serie CSC 130 en Louisiana Tech University es Minesweeper Raspberry Pi Edition. En este proyecto, busqué recrear el clásico juego de buscaminas utilizando la biblioteca Tkinter del lenguaje de programación Python. La cuadrícula que abarca el juego buscaminas es de ocho fichas de ancho y cinco fichas de altura. El formateo del proyecto se ha adaptado y perfeccionado para el uso de una Raspberry Pi instalada con Python 2.7.

El código y las imágenes para el proyecto final de Minesweeper Raspberry Pi Edition se pueden descargar en el siguiente enlace:

Buscaminas-Raspberry-Pi-Edition

Suministros

x1 frambuesa Pi

Python 2.7 instalado en Raspberry Pi

Microsoft Powerpoint (u otro software para crear imágenes para botones)

Paso 1: crear imágenes de botones

Crear imágenes de botones
Crear imágenes de botones

EXPLICACIÓN:

Deberá crearse cada botón que forma la GUI. Para esta tarea, utilicé Microsoft Powerpoint para crear las imágenes que necesitaba mostrar en los botones.

Primero, creé los diez botones de mosaico necesarios para hacer la cuadrícula del buscaminas (en blanco, bob, cero, uno, dos, tres, cuatro, cinco, seis, siete y ocho) usando Microsoft Powerpoint.

En segundo lugar, hice las cuatro imágenes necesarias para la pantalla del menú (visualización del menú, botón de dificultad fácil, botón de dificultad media y botón de dificultad difícil) usando Microsoft Powerpoint.

En tercer lugar, creé la imagen necesaria para el botón de reinicio y las imágenes necesarias para los otros botones de visualización diferentes (una pantalla de "juego terminado", una pantalla de "tú ganas" y una pantalla de "reglas") usando Microsoft Powerpoint.

En cuarto lugar, tendrá que cambiar el tamaño de sus imágenes para que quepan en su pantalla. Para mi Rasberry Pi, utilicé las siguientes dimensiones para la ventana (en referencia a píxeles de largo y ancho): 432x576.

Paso 2: formatear el programa

Programa de formato
Programa de formato

EXPLICACIÓN:

Antes de que pueda llevarse a cabo cualquier programación real, debemos importar las bibliotecas que necesitamos y escribir la parte principal de nuestro programa.

Primero, necesitaremos importar * desde la biblioteca Tkinter y mezclar desde la biblioteca aleatoria. En segundo lugar, tendremos que completar los siguientes pasos en código dentro de la parte principal del programa: crear la ventana, configurar la ventana de título, generar la GUI, mostrar la GUI y esperar la interacción del usuario. Este código está escrito en el formato adecuado con respecto a la biblioteca Tkinter (mire el código dado en el instructivo para ver el formato adecuado).

Paso 3: Cree la GUI (menú y cuadrícula del buscaminas)

Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)
Crear la GUI (menú y cuadrícula del buscaminas)

EXPLICACIÓN:

Tras el inicio del programa, se iniciará la pantalla del menú. Después de seleccionar la dificultad (haciendo clic en uno de los botones de dificultad en la pantalla del menú), la GUI se actualizará con la cuadrícula del buscaminas, una pantalla y un botón de reinicio. Ya que recién está comenzando a trabajar en la GUI, solo necesitaremos que el menú se inicie, que los botones de dificultad del menú estén operativos y que la GUI se actualice a la pantalla del juego con la cuadrícula del buscaminas.

Primero, podemos hacer que la pantalla del menú se muestre al iniciar el programa llamando al método "setupMenu" dentro del constructor de la clase MainGUI.

En segundo lugar, podemos hacer que cada uno de los botones de dificultad del menú ejecute ciertas líneas de código cada vez que se haga clic agregando un método de "proceso" (también tendrá que agregar el comando lambda: self.process ("returnButtonName") dentro de los parámetros de la función del botón utilizada en la creación de cada botón de dificultad). Se crearán tres sentencias if-else en el método "proceso" y se ejecutarán otros métodos y líneas de código adicional dependiendo de lo que sea el botón (botón es igual al nombre del botón que se registró por última vez).

En tercer lugar, mientras la pantalla del menú está activada y si el usuario hace clic en uno de los botones de dificultad, el programa guardará un cierto valor en la variable "dificultad" (la dificultad equivale a "fácil", "media" o "difícil"). qué botón de dificultad se hace clic). Este clic de un botón sabe qué declaración if-else seguir en función del nombre del botón que se registró por última vez (qué botón es igual). Además, para reasignar la variable "dificultad", primero tendremos que crear una instancia fuera de la clase, por lo que estableceremos la variable "dificultad" como una cadena vacía antes de que se cree la clase "MainGUI".

Cuarto, borre la GUI de los botones creados por el método "setupMenu" haciendo un método "clearMenu" (usando la función button.destroy () en varias instancias) y llamando al método "clearMenu" en el método "process" (en cada uno de los botones de dificultad se registra después de la asignación de la variable de dificultad).

En quinto lugar, actualice la GUI haciendo un método "setSLASHresetGUI" (los botones se hacen de la misma manera que en el método "setupMenu") y llamando al método "setSLASHresetGUI" en el método "process" (debajo de cada uno de los registros de botón de dificultad después de la asignación de variables de dificultad y llamando al método "clearMenu").

Además, antes de que todos los botones sean asignados dentro del método "setSLASHresetGUI" debemos configurar las filas y columnas dentro de la cuadrícula y después de que todos los botones estén asignados dentro del método "setSLASHresetGUI" debemos empaquetar todo el contenido dentro de la cuadrícula (mira el código dado en el instructable para ver el formato adecuado).

Paso 4: haz que los botones de la pantalla del juego estén operativos

Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego
Hacer operativos los botones de la pantalla del juego

EXPLICACIÓN:

Para hacer que los botones ejecuten ciertas líneas de código al hacer clic, tendremos que ejecutar métodos dentro del método "proceso". Para esta tarea, tendremos que crear varios métodos, variables y listas nuevos.

Primero, haremos dos listas. Habrá una lista llamada "cuadrícula". Esta lista de "cuadrícula" constará únicamente de los números enteros 9 y 0. En esta lista, los nueves representarán bombas y los ceros representarán no bombas. Así es como el programa distinguirá si una ficha es una bomba o no. Se creará una segunda lista y se llamará "estado". Esta lista de "estado" consta de una sola cadena de caracteres ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). En esta lista, cada cadena de caracteres corresponderá a una imagen determinada. Así es como el programa sabrá qué imagen mostrar en cada botón de la cuadrícula del buscaminas. Cada botón de la cuadrícula del buscaminas tendrá un índice correspondiente en cada lista según su ubicación en la cuadrícula. El índice correspondiente se asignará mediante el siguiente procedimiento (botón número - 1). Por ejemplo, el índice correspondiente del botón uno en cada lista es el índice cero. Por último, estas dos listas se ejecutarán antes de que se ejecute la clase "MainGUI" y se crearán fuera de la clase "MainGUI". La clase "cuadrícula" se creará como una lista vacía (cuadrícula = ) y la lista de "estado" se creará mediante una función de rango (agregando cuarenta cadenas de caracteres individuales de "n" a la lista de "estado").

En segundo lugar, crearemos varios métodos que pueden detectar la cantidad de minas que lo rodean y que se pueden utilizar cuando se hace clic en un botón (la decisión de qué método se debe ejecutar estará determinada por la ubicación del botón). Estos mismos métodos se llamarán nuestros analizadores de minas. Estos métodos incrementarán un contador llamado "NumOfMines" y usarán ciertos índices dentro de la lista de "cuadrículas" para determinar cuántas bombas rodean el mosaico. La cadena que se almacenará dentro de la variable "NumOfMines" se utilizará para reemplazar el mismo índice correspondiente en la lista de "estado". Ahora, puede preguntarse cómo el programa sabrá qué índice usar. Cuando un botón se registra en el método "proceso", se creará / reasignará un "índice" variable a un determinado número entero (según la cadena que registre el botón). Uno de los métodos creados utilizará ese índice asignado para conocer la ubicación del mosaico y los índices de los mosaicos que lo rodean (el algoritmo dentro del método lo resolverá). Además, para reasignar la variable "índice", primero necesitaremos instanciarla fuera de la clase. Así que preestableceremos la variable "índice" como el entero cero antes de que se cree la clase "MainGUI".

En tercer lugar, se crearán métodos de "operación". Se ejecutará un método de "operación" cada vez que se registre un botón. Estos métodos de "operación" se ejecutarán en el método de "proceso". En el método de "proceso", varias declaraciones if-else determinarán en qué botón se hizo clic (en función de lo que equivale al botón). Aquí es donde se llamará a un cierto método de "operación" (en las instrucciones if-else).

En cuarto lugar, veremos cómo se vuelven operativos los botones. Como se indicó anteriormente, múltiples sentencias if-else están ubicadas en el método "proceso" y ejecutan ciertos otros métodos y líneas de código adicional dependiendo de lo que sea igual al botón (el botón es igual a la cadena que se registró por última vez). Dentro de estas declaraciones if-else, ocurrirá lo siguiente en orden: el índice se asignará globalmente, el índice correspondiente en la lista de "estado" se reasignará a la cadena "b" (si el índice correspondiente de la lista de "cuadrícula" es igual a el entero nueve), se ejecutará un método de "operación" correspondiente (si el índice correspondiente de la lista de "cuadrícula" es igual al número entero cero), ese índice correspondiente en la lista de "estado" se reasignará a una cadena que sea igual a la variable "NumOfMines" (si el índice correspondiente de la lista "grid" es igual al entero cero), y la GUI se actualizará llamando al método "setSLASHresetGUI".

Paso 5: método "setDifficulty" y método "reiniciar"

Imagen
Imagen
Imagen
Imagen

EXPLICACIÓN:

A continuación, será necesario crear un método "setDifficulty" y el botón de reinicio ubicado en la parte inferior de la pantalla del juego deberá volverse operativo (creando un método de "reinicio" para que se ejecute cuando el usuario haga clic en él).

Primero, el método "setDifficulty" deberá implementarse en las declaraciones if-else de los botones de dificultad en el método "process" y en el método "restart". Las líneas de código y los métodos ejecutados en este método son bastante simples. En el método "setDifficulty", agregaremos una cierta cantidad de ceros (no bombas) y nueves (bombas) a la lista de "cuadrícula" (a través de dos funciones de rango dentro de cada instrucción if-else), y luego mezclaremos el Lista "cuadrícula" (con la función aleatoria de la biblioteca aleatoria) dentro del método "setDifficulty" (después de que se ejecuten las instrucciones if-else). La relación de ceros a nueves estará determinada por la cadena en la que se establezca la variable "dificultad" ("fácil": 34-6, "medio": 28-12, "difícil": 16-24).

En segundo lugar, en el método "reiniciar", estableceremos las variables "índice" y "NumOfMinesLEFT" a cero globalmente, vaciaremos las listas de "estado" y "cuadrícula" globalmente, restableceremos la lista de "estado" con una función de rango (agregando cuarenta cadenas de un solo carácter de "n" a la lista de "estado"), e invocar el método "setDifficulty".

Paso 6: Escenarios de finalización del juego

Escenarios de final de juego
Escenarios de final de juego
Escenarios de finalización del juego
Escenarios de finalización del juego
Escenarios de final de juego
Escenarios de final de juego
Escenarios de final de juego
Escenarios de final de juego

EXPLICACIÓN:

Cada juego de buscaminas tiene dos escenarios de final de juego: ganar y perder. Dentro de este programa, implementaremos estos dos escenarios de finalización del juego con dos métodos nuevos: un método "You_A_Winner_Son" y un método "GameOver". Antes de que la GUI se actualice dentro del método de "proceso" y en función de los índices modificados por los dos métodos de escenario de finalización del juego, el botón de visualización se cambiará para representar correctamente el resultado.

Primero, cuando el usuario hace clic en el último mosaico oculto que no es una bomba, se debe ejecutar el método "You_A_Winner_Son". Completaremos esta tarea invocando el método "You_A_Winner_Son" cada vez que se haga clic en un mosaico y se encuentre que el mosaico es un mosaico que no es una bomba (dentro de los métodos de "operación" ejecutados en el método "proceso"). Si se cumplen las condiciones ganadoras, se ejecutarán dos declaraciones if-else dentro del método "You_A_Winner_Son". La primera instrucción if-else siempre se ejecutará independientemente de si el jugador ganó o no cuando se invoca este método. En base a lo que es la variable "dificultad", un algoritmo determinado determinará cuántas minas / bombas quedan ocultas. El entero encontrado por este algoritmo se guardará en la variable "NumOfMinesLEFT". A continuación, entre las dos sentencias if-else, se ejecutará otro algoritmo para encontrar el número de mosaicos iniciales que quedan (mosaicos sin hacer clic). El entero encontrado por este algoritmo se guardará en la variable "NumOfStartingTilesLEFT". La segunda instrucción if-else siempre se ejecutará independientemente de si el jugador ganó o no cuando se invoca este método. Con base en lo que es igual a la variable "dificultad", se puede ejecutar una de las tres sentencias if-else si se cumplen sus condiciones. Las condiciones se basarán en lo que sean las dos variables "NumOfMinesLEFT" y "NumOfStartingTilesLEFT". Dentro de estas tres declaraciones if-else, se ejecutará un algoritmo que inutilizará cada botón (el juego ha terminado).

En segundo lugar, cuando el usuario hace clic en uno de los mosaicos de bombas ocultas, se debe ejecutar el método "GameOver". Completaremos esta tarea invocando el método "GameOver" cada vez que se haga clic en un mosaico y se encuentre que el mosaico es un mosaico de bomba (dentro de los métodos de "operación" ejecutados en el método "proceso"). Cuando se invoca el método "GameOver", se ejecutará un algoritmo que inutilizará cada ficha inicial (el juego ha terminado) y se revelarán las fichas de bombas ocultas (según los índices correspondientes dentro de la "lista de cuadrículas, ciertos índices en la lista de "estado" se reasignará a la cadena de un solo carácter "b").

En tercer lugar, la visualización de la pantalla del juego se actualizará cada vez que se actualice la GUI realizando muy pocas ediciones menores en el método "setSLASHresetGUI". Una vez configurada la cuadrícula de la GUI, colocaremos tres declaraciones if-else donde se coloca la asignación actual del botón de visualización. Una de las tres sentencias if-else se ejecutará en función de lo que sean las siguientes variables: "GameOverDETECTOR", "dificultad," NumOfMinesLEFT "y" NumOfStartingTilesLEFT ". Como te estarás preguntando, la variable" GameOverDETECTOR "es una nueva variable. Esta variable se creará justo antes de que se ejecuten las sentencias if-else dentro del método "setSLASHresetGUI". La variable "GameOverDETECTOR" será igual al número entero que se encuentre utilizando un algoritmo que encuentre cuántos índices dentro de la "cuadrícula" list se han reasignado al entero noventa y nueve (cómo los botones se vuelven inútiles) En función de las condiciones de la instrucción if-else se cumplen, se producirá una reasignación correspondiente a la pantalla.

Paso 7: Hacer operativo el botón de reinicio

Cómo hacer operativo el botón de reinicio
Cómo hacer operativo el botón de reinicio

EXPLICACIÓN:

Este paso resulta ser el más corto. La mayor parte del trabajo para este paso ya se ha realizado. Todo lo que tendremos que hacer ahora es ejecutar el método "reiniciar" cada vez que el usuario haga clic en el botón de reinicio.

Primero y por último, ejecutaremos el método "reiniciar" en el método "proceso" con una instrucción if-else. Si la cadena "!" está registrado, entonces se ejecutará el método de "reinicio". También tendremos que crear un botón llamado reiniciar al final del método "setSLASHresetGUI" antes de que los contenidos de la cuadrícula se empaqueten juntos. Este botón de reinicio procesará la cadena "!" (comando lambda: self.process ("!")) y ejecute el método "reiniciar" correspondiente dentro del método "proceso".

Recomendado: