juego de tarjeta de memoria Java GUI (memorizar juego)

Java Gui Memory Card Game

Producción de proyectos
En primer lugar, lo primero a considerar al hacer un programa pequeño es el diseño de la interfaz del programa, en segundo lugar, el diseño del algoritmo para lograr funciones básicas y luego se agregan otras funciones. Luego está el manejo de errores y detalles, finalmente, la producción de un sistema de desarrollo de ayuda integrado.
Uno: diseño de la interfaz
1: Ventana de inicio de sesión:

El administrador de diseño utilizado: GirdBagLayout (el administrador de diseño del grupo de cuadrícula también puede usar el administrador de Box). En esta ventana, debe configurar el monitor del mouse para iniciar el juego y salir. Si inicia el juego sin ingresar el nombre, aparecerá una ventana emergente, ingrese el nombre, inicie el juego cuando tenga un nombre y pase el nombre a la ventana principal. Complete la transferencia en la función de escucha.
2: interfaz de juego:
imagen
Esta interfaz debe considerar cómo parecerse a la página o cómo hacerlo bien. Esto requiere una comprensión profunda del diseño de Java.
Si cree que se trata de un diseño de borde y toma el medio y la parte inferior, está mal, por lo que los componentes se organizarán cerca del borde, lo que afectará la apariencia.
Recuperación de contenedores de nivel superior: cómo dejar un espacio a su alrededor, hay tres formas de solucionarlo. Primero, use el administrador de diseño de bordes. Es necesario poner todos los componentes en el medio, y el resto es Tratamiento de límites.
Método 1: agregue un nuevo JLabel ('”) a cada límite para llenar un área determinada.
Método 2: al configurar el diseño, bordelayout (int, int) establece el valor de límite que necesita. Entonces habrá líneas vacías en el borde. Sin embargo, este es el caso de dos fronteras. Para esto, debe agregar un nuevo JLabel () o un nuevo JLabel ('') a cada borde con una etiqueta vacía sin espacios. De esta manera, el límite se llama nominalmente y existe, y se satisfará el espacio entre los dos límites adyacentes de bordelayout (int, int).
Método 3: use setpreferredsize () para establecer y fijar el tamaño de cada límite.
Recomiendo el segundo tipo, que es simple y preciso.
Se retira el contenedor secundario. Una vez que se retira el contenedor, todavía quedan cartas y tres botones. Los naipes deben operarse de manera unificada y los cuatro botones deben operarse de manera unificada. El contenedor JPanel se agrega en el medio del contenedor superior. El contenedor JPanel usa el diseño del borde nuevamente, y solo las partes media e inferior se usan para separar los dos botones.
Contenedor de tres niveles: se puede agregar un Jpanel de diseño de cuadrícula a la parte central del contenedor de tercer nivel, este JPanel agrega botones. En la siguiente parte, puede agregar un Jpanel con diseño de cuadrícula o un contenedor de caja con diseño de caja. (Este programa usa un diseño de cuadrícula)
De esta manera, clasificamos las partes y el diseño del contenedor de tres capas. Puede lograr un diseño cómodo.
Dos: Implementación de algoritmos
La implementación del algoritmo del juego se divide a grandes rasgos en: diseño aleatorio y juicio de flop
Diseño aleatorio:
① Ponga ocho tarjetas y una tarjeta en la misma carpeta scr que el archivo. Utilice la matriz de cadenas para almacenar la dirección (los números deben estar ordenados para poder utilizar la matriz) y utilice la matriz imageicon / icon para almacenar las tarjetas en orden (16, la parte posterior se puede almacenar por separado). Se guarda la matriz de iconos de 16 tarjetas de 1234567812345678 en este orden.
② Empiece a implementar la colocación aleatoria de tarjetas, cree una matriz de íconos / íconos de imágenes de 16 bits y cree un conjunto de listas de tipo Entero para almacenar los números correspondientes a las imágenes aleatorias (la capacidad personal no es suficiente Vaya al ícono de comparación, por lo que la comparación de los gráficos se convierten en una comparación de% 8) y se coloca la secuencia de cartas al azar. Esta es una posición de colocación de tarjetas abstractas. Solo cuando la matriz de botones ejecuta el flop, esta matriz de iconos se llama correspondientemente. (La inicialización de la matriz de botones es la imagen en la parte posterior). el código se muestra a continuación:



|_+_|

El algoritmo mencionado anteriormente es en realidad relativamente ineficiente, porque habrá muchas veces de retroceso y habrá muchos cálculos inútiles. Existe un esquema optimizado para que cada algoritmo sea efectivo y sin desperdicio:



|_+_|

(Yo uso la segunda opción).
Se completa el diseño aleatorio, la interfaz Actionlistenner se hereda de la clase y se escribe la función de escucha. El botón en el que se hace clic corresponde a la matriz icon / imageicon ordenada aleatoriamente en la misma posición de llamar a seticon (), y se puede completar.
Juicio del fracaso:
puede crear una colección list1 para cargar todas las marcas de los botones en los que se hizo clic. Cuando el tamaño () de este conjunto es un número par, se ejecuta el juicio y hay dos resultados. Cuando las dos cartas son iguales, desaparecen y las dos cartas son diferentes. Establezca el icono en la imagen en la parte posterior de la tarjeta. Aquí, el juicio de las tarjetas utiliza el conjunto previamente almacenado de números aleatorios, y se llama a% 8 para ver si son iguales.
Situación igual: desaparecen dos cartas. Solo usa algunas propiedades del botón
jbutton [list1.get (list1.size () - 2)]. setIcon (nulo)
jbutton [list1.get (list1.size () - 2)]. setContentAreaFilled (false) // transparente
jbutton [list1.get (list1.size () - 2)]. setBorderPainted (false) // Cancelar el borde
jbutton [list1.get (list1.size () - 2)]. setFocusPainted (false) // Cancelar el enfoque
jbutton [list1.get (list1.size () - 2)]. setEnabled (false)
jbutton [list1.get (list1.size () - 1)]. setIcon (nulo)
jbutton [list1.get (list1.size () - 1)]. setContentAreaFilled (false) // transparente
jbutton [list1.get (list1.size () - 1)]. setBorderPainted (false) // Cancelar el borde
jbutton [list1.get (list1.size () - 1)]. setFocusPainted (false) // Cancelar el enfoque
jbutton [list1.get (list1.size () - 2)]. setEnabled (false)
Por supuesto, es necesario crear un número de tipo int para determinar si ha terminado. Cuando una carta desaparece, el valor del tipo int aumenta en uno. Deténgase cuando sea igual a 16.
El juicio de las dos cartas se lleva a cabo cuando se abren. Si no lo resuelve, se encontrará con una situación. Al mismo tiempo, regresó sin ver lo que se volteó. Para evitar esta situación, es necesario agregar hilos en él, de modo que si desaparece o se da vuelta, se ejecutará después de 0.3 segundos.
Tres: otras características
Las otras funciones que agregamos incluyen grabación de tiempo, grabación de partituras (i / o), función de aviso, música de fondo, evento final y reinicio.
① Registro de tiempo: mostramos el tiempo en el título, usando el control de hilo, comienza en el inicio y el hilo termina cuando desaparecen 16 cartas.
② Registro de puntuación:
Para lograr la grabación de partituras y la grabación de nombres, se requiere conocimiento de las transmisiones IO. Entre ellos, BufferedReader y BufferedWriter cumplen con los requisitos de este programa. Se establece la función io () y se llama a la puntuación una vez cada vez que se hace clic en ella. En la función Io (), primero cree un archivo para determinar si existe este archivo en el Disco D. Si no es así, cree un archivo tet en el Disco D. Primero lea el contenido del archivo, coloque cada línea en la matriz de cadenas, y luego aparecerá Mostrar información de clasificación de calificaciones. Después de leer, almacene el contenido en la matriz. (Solo lea y escriba primero, de lo contrario el archivo se vaciará)
Si el juego termina, se llamará automáticamente a io () para guardar el registro, pero no aparecerá ninguna ventana (se pueden usar controles booleanos u otros controles numéricos). Agregue (int) time + s + name al último dígito de la matriz de datos
, la clasificación aquí debe usar la segmentación de cadenas, escupir ('s'), comparar y ordenar con el tiempo efectivo anterior. No se escriben más de tres registros cuando se escribe el archivo.
③ Función de aviso: la función de aviso entrará en vigor cuando se utilice el número cardinal de veces. En el conjunto de la lista anterior, busque el número con el mismo valor% 8 y valores desiguales, y coloque uno en el botón correspondiente. El hilo lo hace desaparecer durante 0.3 segundos antes de regresar, actuando como un recordatorio.
④ Música de fondo y tono de llamada:
La adición de música de fondo es similar al icono, pero ligeramente diferente. El método de implementación de la música de fondo es el siguiente:
public AudioClip music // Música de fondo
URL url = Memorize.class.getResource ('music / fade2.wav') // fuente
{música = Applet.newAudioClip (url)}
music.play () iniciar
Si es necesario agregar el bucle:
tratar {
Hilo.sueño (40)
} captura (InterruptedException e1) {
e1.printStackTrace ()
}
music.loop ()
Además, este tipo de bucle al hacer clic en la ventana X seguirá reproduciéndose, y se debe establecer un tiempo de escucha cerrado. Implementa actionlisterner en la clase principal. Agregue la función sobrecargada
addWindowListener (new WindowAdapter () {
public void windowClosing (WindowEvent e) {
System.exit (0)}})
Tono de llamada en el que se hizo clic:
Este programa agrega dos tonos de llamada. Uno es agregar directamente el tono de llamada al evento de clic del mouse en el botón 1.play () y el otro es agregar el evento de clic del mouse al contenedor, haga clic en Cuando no hay ningún botón, se reproducirá otro tono de llamada.
⑤ Evento final: cuando las dieciséis tarjetas desaparecen, use la función removeall () en el panel donde se colocan los 16 botones, y luego cambie el diseño del panel a diseño absoluto, use el hilo 1 y el algoritmo para hacer todas las tarjetas vuela de izquierda a derecha, y el fondo del contenedor superior también parpadea y se reemplaza (el hilo de control se ralentiza lentamente) para lograr un proceso de rápido a lento. El hilo 1 termina y se ejecuta el hilo 2. Nombre + Felicitaciones por ganar. La caligrafía y la pintura se mueven de arriba hacia el medio. Cuando finaliza, el botón de reinicio y el botón de salida aparecen debajo. El hilo join () se usa aquí.
⑥ Comience de nuevo, configure la función reiniciar (), cambie el panel a la disposición de la cuadrícula nuevamente, vuelva a aleatorizar e inicialice el valor cambiado nuevamente.
Cuatro: Artículos sobre manejo de errores y detalles
Un programa pequeño no debería producir nada que pueda optimizarse mediante la optimización de errores. Los tratamientos específicos incluyen:
1: Procesamiento de íconos: La producción de un pequeño programa debe ser completamente su propio elemento, y el ícono de café JAVA debe desecharse.
imagen
El núcleo es usar la función seticonimage () al configurar el formulario.
2: Tratamiento anti-deformación: si no usa un diseño o tratamiento especial, su forma se estirará o causará fealdad y afectará su apariencia. Puede utilizar una ventana fija para no estirar. La función correspondiente es setResizable (falso)
3: Procesamiento de posición: Si un pequeño programa hace clic en el borde que aparece en la esquina superior izquierda, siempre es un poco desagradable. Puede configurar el formulario para que esté centrado, y la función correspondiente es:
setLocationRelativeTo (null) Nota: Esta función debe estar después de setsize (). Debido a que desea establecer el tamaño en el centro de todo el formulario, si establece el tamaño en la obra primero, hará que el formulario se extienda desde el punto central hacia la parte inferior derecha.
4. El rigor del control de botones. ① Hacer clic en la imagen antes de comenzar no generará un evento de clic del mouse. ② Cuando se abre la imagen, no se volverá a hacer clic en ella. Como resultado, si hace clic en una imagen dos veces seguidas, la imagen desaparecerá por sí sola. ③Cuando vuelva a juzgar que desaparece o retrocede, debe prestar atención para que el evento de clic no tenga efecto, (porque cuando vuelve a juzgar, él hizo clic en otros botones en el hilo demasiado rápido, luego los dos últimos botones que accionó cambiaron) esto Puede utilizar el valor booleano que controla el inicio para juzgar.
5: Use la función repaint () cuando haya cambios gráficos en la interfaz, incluso si la interfaz se vuelve a dibujar. De lo contrario, aparecerá una interfaz similar a 'propietario de la tarjeta'
(el resultado de reiniciar el juego sin usar la función repaint ())
6: Si usa un temporizador de hilo, no importa si simplemente cuenta regresivamente. Si es necesario utilizar este tiempo, debe controlar el hilo y controlar si agregar antes o después de la suspensión.
7: El ciclo de vida del hilo debe estar bien controlado, y las condiciones de restricción deben establecerse, y terminará cuando termine para evitar ocupar recursos innecesarios.
8: Salida de la ventana, disopose () cierra la ventana actual, system.exit (0) cierra todo, así que usa dispose () al iniciar el juego, todas las salidas usan exit (0)
9: Cuando hay demasiados botones, no use clases internas para escribir monitoreo. El código será demasiado largo. En su lugar, será mucho más conciso utilizar la interfaz de forma anónima.
Cinco: procesamiento del sistema de ayuda
③ Inserte el archivo de ayuda en el programa GUI.
Método utilizado en el Método 1: Abrir con el comando cmd
El código es el siguiente:
ayuda de vacío público ()
{
Archivo archivo = nuevo archivo ('doc / help.chm')
Tiempo de ejecución ce = Runtime.getRuntime ()
tratar {
ce.exec ('cmd / c start' + file.getAbsolutePath ())
} captura (IOException e) {
e.printStackTrace ()
}
}
Aquí, cree un archivo para establecer una ruta relativa, relativa a la carpeta interna del proyecto al compilar y relativa al programa jar al exportar. Esto, no necesita colocar el archivo doc y luego arreglar el archivo, pero puede usarlo colocándolo relativamente. Durante el proceso de compilación, el nombre de la ruta no puede incluir espacios, de lo contrario no será reconocido. Al ejecutar el archivo jar, el nombre de la carpeta no se puede cambiar. (Los archivos internos de muchos programas no se pueden cambiar).
Método utilizado en el Método 2: también se puede abrir con java.awt.desktop
El código es el siguiente:
ayuda de vacío público ()
{Archivo archivo = nuevo archivo ('doc / help.chm')
tratar {
Desktop.getDesktop (). Abrir (archivo)
} captura (IOException e) {
// TODO bloque de captura generado automáticamente
e.printStackTrace ()
}}
Este método puede identificar espacios en la ruta de clases principal para satisfacer más necesidades. Este procedimiento está optimizado de la Opción Uno a la Opción Dos.
Adjunte el código específico: Interfaz inicial:



|_+_|

interfaz del juego:

|_+_|