Tabla de contenido:

Competitivo de 2 jugadores vs.Juego de tiempo: 4 pasos
Competitivo de 2 jugadores vs.Juego de tiempo: 4 pasos

Video: Competitivo de 2 jugadores vs.Juego de tiempo: 4 pasos

Video: Competitivo de 2 jugadores vs.Juego de tiempo: 4 pasos
Video: Los Verdaderos Profesionales De Left 4 Dead 2 Competitivo | Mejores Jugadas Torneo América 2022 | 2024, Noviembre
Anonim
Juego de tiempo competitivo VS para 2 jugadores
Juego de tiempo competitivo VS para 2 jugadores

Necesitará:

1. Digilent Basys 3, placa FPGA (o cualquier otra FPGA)

2. Una versión relativamente actualizada de Vivado o algún otro entorno VHDL

3. Una computadora que pueda ejecutar el programa mencionado.

Paso 1: el juego en sí

El juego en sí
El juego en sí

Cómo interactúa el FSM con los módulos.

Cómo jugar

Para comenzar, presionas el botón central. Esto hará que “99”, que representa la salud del jugador dos, se muestre en la pantalla de siete segmentos. Luego, los LED se iluminarán secuencialmente de derecha a izquierda. Esto forma una barra de poder. Una vez que la barra de energía está llena, se reinicia. El objetivo del jugador uno es activar su interruptor cuando la barra está lo más alta posible. Cuantos más LED se enciendan, más daño le hará el jugador uno al jugador dos. Después de que el jugador uno acciona su interruptor, el daño infligido se deduce de la salud del jugador dos. Luego, cambia al turno del jugador dos. Ahora, el número que se muestra representa la salud del jugador uno y la barra de energía se llena de izquierda a derecha. Una vez que el jugador dos hace su movimiento, el daño se deduce y es el turno del jugador uno nuevamente. Esto se repite hasta que un jugador llega a 0 de salud. Se adjunta video de este funcionamiento.

Paso 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Este juego es esencialmente una gran máquina de estados finitos, en la que se produce una lógica compleja basada en el estado en el que se encuentra el FSM.

Estado 1: Menú El primer estado es la pantalla del menú, que es uno de los estados más simples. Incluye la pantalla de siete segmentos que muestra la palabra "JUGAR" y el botón que hace que el juego comience. El botón, BTN, nos lleva al siguiente estado, que es el turno del jugador uno.

Estado 2: turno del jugador uno

El turno del jugador uno activa una señal que hace que la pantalla de siete segmentos muestre la salud del jugador dos. Se enciende otra señal para activar un registro de desplazamiento importado de otro módulo que creamos (Pone.vhd). Este registro de desplazamiento hace que los LED se enciendan como lo haría un indicador de potencia en aumento en otros juegos, y luego se restablecería a 0 cuando alcance la cantidad máxima de LED que podrían encenderse. Se actualiza en el flanco ascendente del reloj obtenido de barclock.vhd, que se modifica a partir de un archivo de laboratorio prestado. Hicimos que la barra del jugador uno comenzara desde la derecha y se llenara hacia la izquierda, porque el interruptor del jugador uno también está a la izquierda (para una experiencia de usuario intuitiva). Una vez que se activa el interruptor, el estado pasa a la deducción del jugador uno, y la cantidad de LED activos se guarda en una señal.

Estado 3: el jugador uno deduce La señal con la cantidad de LED activos determina la cantidad de salud que se deduce. Esto se hace teniendo otro registro de desplazamiento (deductor1.vhd) que en lugar de incrementar los LED, los reduce. Esto disminuye en el flanco ascendente de uno de los módulos div de reloj que tomamos prestados y modificamos (downcounterclock.vhd). Justo cuando se apaga un LED, se deduce un punto de salud de la salud total del jugador dos. Si durante este proceso el jugador dos llega a 0 de salud, nos detenemos y pasamos inmediatamente al estado de "Fin del juego". De lo contrario, una vez que el vector LED llega a "0000000000000000", pasamos al turno del jugador dos.

Estado 4: Turno del jugador dos El turno del jugador dos es exactamente como el turno del jugador uno, excepto que el registro de desplazamiento (Ptwo.bhd) va de izquierda a derecha, y el interruptor está en el lado derecho del tablero. Se activa una señal para mostrar la salud del Jugador 1. Una vez que el interruptor 2 está activo, pasa al turno de deducción del Jugador Dos.

Etapa 5: Deducción del jugador dos Al igual que el turno del jugador dos, la deducción del jugador dos actúa de manera muy similar a la deducción del jugador uno. La principal diferencia es que el registro de desplazamiento que controla el apagado del LED va en la dirección opuesta, lo cual es una modificación fácil de hacer una vez que la deducción del jugador funciona correctamente.

Etapa 6: Fin del juego Si en algún momento alguno de los jugadores llega a cero, el juego cambia a este estado. Nada de exhibiciones extravagantes. Si se presiona BTN uno, entonces la salud se restablece a 99 y el estado vuelve al menú, comenzando efectivamente el juego.

Paso 3: módulos

Módulos
Módulos

Diagrama de caja negra para el juego

Downcounterclock (basado en el módulo clk_div.vhd de Bryan Mealy):

Este es el reloj que maneja el tiempo de los deductores. La constante denominada max_count es 3 veces más que la constante max_count de barclock. Esto hará que los deductores sean 3 veces más lentos que la velocidad de la barra.

Barclock - (basado en el módulo clk_div.vhd de Bryan Mealy):

Este reloj maneja el tiempo de los medidores de potencia, que incrementamos rápidamente para agregar dificultad al juego. Este tiempo se puede ajustar a su gusto, aumentando la velocidad haciendo que la constante max_count sea un número mayor, o disminuyéndola haciendo que max_count sea un número menor. Sseg_dec - (Escrito por Bryan Mealy): este módulo toma un número de 8 bits como entrada, que decodifica, convierte el número en su equivalente decimal y luego lo envía a la pantalla de siete segmentos. Para que este archivo funcione, debe asegurarse de que sus restricciones coincidan con las nuestras.

Pan de maíz:

Este es un registro de desplazamiento que desplaza bits a la izquierda, agregando un bit activo para que parezca que el indicador de potencia está aumentando. Cuando todos los bits están calientes, todos los bits se restablecen a "0" y el ciclo comienza de nuevo.

Ptwo:

Esta es una versión invertida del módulo P1.

Deductor1:

Esta es una combinación de un registro de desplazamiento y un resta. El registro de desplazamiento va en la dirección opuesta al registro de desplazamiento de P1, lo que indica una deducción. Esto también resta 1 de la salud del jugador 2 por cada ciclo de reloj, por lo que con la combinación de estas dos funciones, parecerá que la salud del oponente disminuye en 1 por cada led de la barra de salud que baja.

Deductor2: esta es una versión invertida del módulo Deductor1.

PlayDecoder (prestado y ligeramente modificado de ekchen35649 su 133 instructable): se utiliza en el estado del menú para mostrar la palabra "PLAY" en el decodificador de siete segmentos.

Paso 4: prueba

Este juego se inspiró originalmente en uno de los minijuegos de Kirby. Es un juego simple para dos jugadores que se puede jugar en un tablero Basys 3 o en cualquier FPGA.

Paso 1: Materiales necesarios

Necesitará: Digilent Basys 3, placa FPGA (o cualquier otra) Una versión relativamente actualizada de Vivado o algún otro entorno vhdl Una computadora que pueda ejecutar el programa mencionado Un cerebro

Paso 2: el juego en sí

Cómo jugar

Para comenzar, presionas el botón central. Esto hará que “99”, que representa la salud del jugador dos, se muestre en la pantalla de siete segmentos. Luego, los LED se iluminarán secuencialmente de derecha a izquierda. Esto forma una barra de poder. Una vez que la barra de energía está llena, se reinicia. El objetivo del jugador uno es activar su interruptor cuando la barra está lo más alta posible. Cuantos más LED se enciendan, más daño le hará el jugador uno al jugador dos. Después de que el jugador uno acciona su interruptor, el daño infligido se deduce de la salud del jugador dos. Luego, cambia al turno del jugador dos. Ahora, el número que se muestra representa la salud del jugador uno y la barra de energía se llena de izquierda a derecha. Una vez que el jugador dos hace su movimiento, el daño se deduce y es el turno del jugador uno nuevamente. Esto se repite hasta que un jugador llega a 0 de salud. Se adjunta video de este funcionamiento.

Para jugar, cárguelo en un tablero basys y presione el botón central. Intente activar el interruptor con tantos LED activos como sea posible, y luego espere y observe cómo el tablero deduce esos puntos de la salud de su oponente. Luego, dáselo a tu amigo y

Paso 3: FSM

Este juego es esencialmente una gran máquina de estados finitos, en la que se produce una lógica compleja basada en el estado en el que se encuentra el FSM.

(Diagrama de estado)

Estado 1: Menú

El primer estado es la pantalla del menú, que es uno de los estados más simples. Incluye la pantalla de siete segmentos que muestra la palabra "JUGAR" y el botón que hace que el juego comience. El botón, BTN, nos lleva al siguiente estado, que es el turno del jugador uno.

Estado 2: turno del jugador uno

El turno del jugador uno activa una señal que hace que la pantalla de siete segmentos muestre la salud del jugador dos. Se enciende otra señal para activar un registro de desplazamiento importado de otro módulo que creamos (Pone.vhd). Este registro de desplazamiento hace que los LED se enciendan como lo haría un indicador de potencia en aumento en otros juegos, y luego se restablecería a 0 cuando alcance la cantidad máxima de LED que podrían encenderse. Se actualiza en el flanco ascendente del reloj obtenido de barclock.vhd, que se modifica a partir de un archivo de laboratorio prestado. Hicimos que la barra del jugador uno comenzara desde la derecha y se llenara hacia la izquierda, porque el interruptor del jugador uno también está a la izquierda (para una experiencia de usuario intuitiva). Una vez que se activa el interruptor, el estado pasa a la deducción del jugador uno, y la cantidad de LED activos se guarda en una señal.

Estado 3: Deducción del jugador uno

La señal con la cantidad de LED activos determina la cantidad de salud que se deduce. Esto se hace teniendo otro registro de desplazamiento (deductor1.vhd) que en lugar de incrementar los LED, los reduce. Esto disminuye en el flanco ascendente de uno de los módulos div de reloj que tomamos prestados y modificamos (downcounterclock.vhd). Justo cuando se apaga un LED, se deduce un punto de salud de la salud total del jugador dos. Si durante este proceso el jugador dos llega a 0 de salud, nos detenemos y pasamos inmediatamente al estado de "Fin del juego". De lo contrario, una vez que el vector LED llega a "0000000000000000", pasamos al turno del jugador dos.

Estado 4: turno del jugador dos

El turno del jugador dos es exactamente como el turno del jugador uno, excepto que el registro de desplazamiento (Ptwo.bhd) va de izquierda a derecha, y el interruptor está en el lado derecho del tablero. Se activa una señal para mostrar la salud del Jugador 1. Una vez que el interruptor 2 está activo, pasa al turno de deducción del Jugador Dos.

Etapa 5: Deducción del jugador dos

Al igual que el turno del jugador dos, la deducción del jugador dos actúa de manera muy similar a la deducción del jugador uno. La principal diferencia es que el registro de desplazamiento que controla el apagado del LED va en la dirección opuesta, lo cual es una modificación fácil de hacer una vez que la deducción del jugador funciona correctamente.

Etapa 6: Fin del juego Si en algún momento alguno de los jugadores llega a cero, el juego cambia a este estado. Nada de exhibiciones extravagantes. Si se presiona BTN uno, entonces la salud se restablece a 99 y el estado vuelve al menú, comenzando efectivamente el juego.

Caja negra

Paso 4: módulos

Downcounterclock (basado en el módulo clk_div.vhd de Bryan Mealy):

Este es el reloj que maneja el tiempo de los deductores. La constante denominada max_count es 3 veces más que la constante max_count de barclock. Esto hará que los deductores sean 3 veces más lentos que la velocidad de la barra.

Barclock - (basado en el módulo clk_div.vhd de Bryan Mealy): este reloj maneja la sincronización de los indicadores de potencia, los cuales incrementamos rápidamente para agregar dificultad al juego. Este tiempo se puede ajustar a su gusto, aumentando la velocidad haciendo que la constante max_count sea un número mayor, o disminuyéndola haciendo que max_count sea un número menor. Sseg_dec - (Escrito por Bryan Mealy): este módulo toma un número de 8 bits como entrada, que decodifica, convierte el número en su equivalente decimal y luego lo envía a la pantalla de siete segmentos. Para que este archivo funcione, debe asegurarse de que sus restricciones coincidan con las nuestras.

Pone: este es un registro de desplazamiento que desplaza bits hacia la izquierda, agregando un bit activo para que parezca que el indicador de potencia está aumentando. Cuando todos los bits están calientes, todos los bits se restablecen a "0" y el ciclo comienza de nuevo.

Ptwo: esta es una versión invertida del módulo P1.

Deductor1: esta es una combinación de un registro de desplazamiento y un resta. El registro de desplazamiento va en la dirección opuesta al registro de desplazamiento de P1, lo que indica una deducción. Esto también resta 1 de la salud del jugador 2 por cada ciclo de reloj, por lo que con la combinación de estas dos funciones, parecerá que la salud del oponente disminuye en 1 por cada led de la barra de salud que baja.

Deductor2: esta es una versión invertida del módulo Deductor1.

PlayDecoder (prestado y ligeramente modificado de ekchen35649 su 133 instructable):

Se utiliza en el estado del menú para mostrar la palabra "PLAY" en el decodificador de siete segmentos.

Para hacer: fotos, video

Recomendado: