Sommario:

Gioco competitivo VS a tempo per 2 giocatori: 4 passaggi
Gioco competitivo VS a tempo per 2 giocatori: 4 passaggi

Video: Gioco competitivo VS a tempo per 2 giocatori: 4 passaggi

Video: Gioco competitivo VS a tempo per 2 giocatori: 4 passaggi
Video: QUESTA MECCANICA TI RENDERA' INVINCIBILE su FC24! || *TUTORIAL CONTROLLED BOOST* 2024, Novembre
Anonim
Gioco competitivo VS a tempo per 2 giocatori
Gioco competitivo VS a tempo per 2 giocatori

Avrai bisogno:

1. Digilent Basys 3, scheda FPGA (o qualsiasi altro FPGA,)

2. Una versione relativamente aggiornata di Vivado, o qualche altro ambiente VHDL

3. Un computer in grado di eseguire il programma menzionato.

Passaggio 1: il gioco stesso

Il gioco stesso
Il gioco stesso

Come l'FSM interagisce con i moduli.

Come giocare

Per iniziare, premi il pulsante centrale. Questo farà sì che "99", che rappresenta la salute del giocatore due, venga visualizzato sul display a sette segmenti. Quindi, i LED si accenderanno in sequenza da destra a sinistra. Questo forma una barra di potenza. Una volta che la barra di alimentazione è piena, si ripristina. L'obiettivo del giocatore uno è quello di girare il proprio interruttore quando la barra è il più in alto possibile. Più LED si accendono, più danni il giocatore uno fa al giocatore due. Dopo che il giocatore uno gira il suo interruttore, il danno inflitto viene sottratto dalla salute del giocatore due. Quindi, passa al turno del giocatore due. Ora, il numero visualizzato rappresenta la salute del giocatore e la barra della potenza si riempie da sinistra a destra. Una volta che il giocatore due fa la sua mossa, il danno viene detratto e torna di nuovo il turno del giocatore uno. Questo si ripete finché un giocatore non raggiunge 0 punti salute. In allegato il video di questo funzionamento.

Passaggio 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Questo gioco è essenzialmente una grande macchina a stati finiti, in cui si verifica una logica complessa basata sullo stato in cui si trova l'FSM.

Stato 1: MenuIl primo stato è la schermata del menu, che è uno degli stati più semplici. Include il display a sette segmenti che mostra la parola "PLAY" e il pulsante che fa iniziare il gioco. Il pulsante, BTN, ci porta allo stato successivo, che è il turno del giocatore.

Stato 2: il turno del giocatore uno

Il turno del giocatore uno attiva un segnale che fa sì che il display a sette segmenti mostri la salute del giocatore due. Un altro segnale si accende per attivare un registro a scorrimento importato da un altro modulo che abbiamo creato (Pone.vhd). Questo registro a scorrimento fa illuminare i LED come farebbe un indicatore di potenza crescente in altri giochi, quindi si ripristina a 0 quando raggiunge la quantità massima di LED che potrebbero essere accesi. Si aggiorna sul fronte di salita dell'orologio ottenuto da barclock.vhd, che viene modificato da un file di laboratorio preso in prestito. Avevamo la barra del giocatore uno che iniziava da destra e si riempiva verso sinistra, perché anche l'interruttore del giocatore uno è a sinistra (per un'esperienza utente intuitiva). Una volta che l'interruttore viene attivato, lo stato passa al giocatore una detrazione e la quantità di LED attivi viene salvata in un segnale.

Stato 3: detrazione giocatore uno Il segnale con la quantità di LED attivi determina la quantità di salute che viene detratta. Questo viene fatto avendo un altro registro a scorrimento (deductor1.vhd) che invece di incrementare i LED, li decrementa. Questo diminuisce sul fronte di salita di uno dei moduli div clock che abbiamo preso in prestito e modificato (downcounterclock.vhd). Non appena un LED viene spento, viene sottratto un punto di salute dalla salute totale del giocatore due. Se durante questo processo il giocatore due raggiunge 0 punti salute, ci fermiamo e passiamo immediatamente allo stato "Game over". Altrimenti, una volta che il vettore LED raggiunge "0000000000000000", si passa al turno del giocatore due.

Stato 4: Turno del giocatore due Il turno del giocatore due è esattamente come il turno del giocatore uno, tranne per il fatto che il registro a scorrimento (Ptwo.bhd) va da sinistra a destra e l'interruttore si trova sul lato destro del tabellone. Si attiva un segnale per visualizzare la salute del giocatore 1. Una volta che l'interruttore 2 è attivo, si passa al turno di detrazione del giocatore 2.

Fase 5: detrazione del giocatore due Proprio come il turno del giocatore due, la detrazione del giocatore due agisce in modo simile alla detrazione del giocatore uno. La differenza principale è che il registro a scorrimento che controlla lo spegnimento del LED va nella direzione opposta, che è una modifica facile da apportare una volta che la detrazione del giocatore uno funziona correttamente.

Fase 6: Game Over Se in qualsiasi momento uno dei giocatori raggiunge lo zero di salute, il gioco passa a questo stato. Niente spettacoli di fantasia. Se viene premuto BTN uno, la salute viene ripristinata a 99 e lo stato torna al menu, ricominciando effettivamente il gioco.

Passaggio 3: moduli

Moduli
Moduli

Diagramma della scatola nera per il gioco

Downcounterclock (basato sul modulo clk_div.vhd di Bryan Mealy):

Questo è l'orologio che gestisce i tempi dei deduttori. La costante denominata max_count è 3 volte superiore alla costante max_count di barclock. Questo renderà i detrattori 3 volte più lenti della velocità della barra.

Barclock - (basato sul modulo clk_div.vhd di Bryan Mealy):

Questo orologio gestisce i tempi degli indicatori di potenza, che abbiamo incrementato rapidamente per aggiungere difficoltà al gioco. Questa tempistica può essere regolata a proprio piacimento, aumentando la velocità aumentando la costante max_count o diminuendola rendendo max_count un numero inferiore. Sseg_dec - (Scritto da Bryan Mealy): Questo modulo prende un numero a 8 bit come input, che decodifica, converte il numero nel suo equivalente decimale, e poi emette sul display a sette segmenti. Affinché questo file funzioni, devi assicurarti che i tuoi vincoli corrispondano ai nostri.

Pone:

Questo è un registro a scorrimento che sposta i bit a sinistra, aggiungendo un bit caldo per far sembrare che l'indicatore di potenza stia aumentando. Quando tutti i bit sono caldi, tutti i bit vengono reimpostati a "0" e il ciclo ricomincia.

Pdue:

Questa è una versione capovolta del modulo P1.

Deduttore1:

Questa è una combinazione di un registro a scorrimento e un sottrattore. Il registro a scorrimento va nella direzione opposta al registro a scorrimento di P1, indicando una detrazione. Questo sottrae anche 1 dalla salute del giocatore 2 per ogni ciclo di clock, quindi con la combinazione di queste due funzioni, sembrerà che la salute dell'avversario diminuisca di 1 per ogni led della barra della salute che scende.

Deductor2: questa è una versione capovolta del modulo Deductor1.

PlayDecoder (preso in prestito e leggermente modificato da ekchen35649 his 133 istruibile): Questo viene utilizzato nello stato del menu per visualizzare la parola "PLAY" sul decoder a sette segmenti.

Passaggio 4: prova

Questo gioco è stato originariamente ispirato da uno dei minigiochi di Kirby. È un semplice gioco a due giocatori che può essere giocato su una Basys 3 Board o su qualsiasi FPGA.

Passaggio 1: materiali necessari

Avrai bisogno di: Digilent Basys 3, scheda FPGA (o qualsiasi altra) Una versione relativamente aggiornata di Vivado, o qualche altro ambiente vhdl Un computer in grado di eseguire il programma menzionato Un cervello

Passaggio 2: il gioco stesso

Come giocare

Per iniziare, premi il pulsante centrale. Questo farà sì che "99", che rappresenta la salute del giocatore due, venga visualizzato sul display a sette segmenti. Quindi, i LED si accenderanno in sequenza da destra a sinistra. Questo forma una barra di potenza. Una volta che la barra di alimentazione è piena, si ripristina. L'obiettivo del giocatore uno è quello di girare il proprio interruttore quando la barra è il più in alto possibile. Più LED si accendono, più danni il giocatore uno fa al giocatore due. Dopo che il giocatore uno gira il suo interruttore, il danno inflitto viene sottratto dalla salute del giocatore due. Quindi, passa al turno del giocatore due. Ora, il numero visualizzato rappresenta la salute del giocatore e la barra della potenza si riempie da sinistra a destra. Una volta che il giocatore due fa la sua mossa, il danno viene detratto e torna di nuovo il turno del giocatore uno. Questo si ripete finché un giocatore non raggiunge 0 punti salute. In allegato il video di questo funzionamento.

Per giocare, caricalo su una basys board e premi il pulsante centrale. Prova a capovolgere l'interruttore con il maggior numero possibile di LED attivi, quindi attendi e osserva mentre il tabellone sottrae quei punti dalla salute del tuo avversario. Poi passalo al tuo amico e

Passaggio 3: FSM

Questo gioco è essenzialmente una grande macchina a stati finiti, in cui si verifica una logica complessa basata sullo stato in cui si trova l'FSM.

(diagramma di stato)

Stato 1: Menu

Il primo stato è la schermata del menu, che è uno degli stati più semplici. Include il display a sette segmenti che mostra la parola "PLAY" e il pulsante che fa iniziare il gioco. Il pulsante, BTN, ci porta allo stato successivo, che è il turno del giocatore.

Stato 2: il turno del giocatore uno

Il turno del giocatore uno attiva un segnale che fa sì che il display a sette segmenti mostri la salute del giocatore due. Un altro segnale si accende per attivare un registro a scorrimento importato da un altro modulo che abbiamo creato (Pone.vhd). Questo registro a scorrimento fa illuminare i LED come farebbe un indicatore di potenza crescente in altri giochi, quindi si ripristina a 0 quando raggiunge la quantità massima di LED che potrebbero essere accesi. Si aggiorna sul fronte di salita dell'orologio ottenuto da barclock.vhd, che viene modificato da un file di laboratorio preso in prestito. Avevamo la barra del giocatore uno che iniziava da destra e si riempiva fino a sinistra, perché anche l'interruttore del giocatore uno è a sinistra (per un'esperienza utente intuitiva). Una volta che l'interruttore viene attivato, lo stato passa al giocatore una detrazione e la quantità di LED attivi viene salvata in un segnale.

Stato 3: detrazione del giocatore uno

Il segnale con la quantità di LED attivi determina la quantità di salute che viene detratta. Questo viene fatto avendo un altro registro a scorrimento (deductor1.vhd) che invece di incrementare i LED, li decrementa. Questo diminuisce sul fronte di salita di uno dei moduli div di clock che abbiamo preso in prestito e modificato (downcounterclock.vhd). Non appena un LED viene spento, viene sottratto un punto di salute dalla salute totale del giocatore due. Se durante questo processo il giocatore due raggiunge 0 punti salute, ci fermiamo e passiamo immediatamente allo stato "Game over". Altrimenti, una volta che il vettore LED raggiunge "0000000000000000", si passa al turno del giocatore due.

Stato 4: turno del giocatore due

Il turno del giocatore due è esattamente come il turno del giocatore uno, tranne per il fatto che il registro a scorrimento (Ptwo.bhd) va da sinistra a destra e l'interruttore si trova sul lato destro del tabellone. Si attiva un segnale per visualizzare la salute del giocatore 1. Una volta che l'interruttore 2 è attivo, si passa al turno di detrazione del giocatore 2.

Fase 5: detrazione del giocatore due

Proprio come il turno del giocatore due, la detrazione del giocatore due agisce in modo molto simile alla detrazione del giocatore uno. La differenza principale è che il registro a scorrimento che controlla lo spegnimento del LED va nella direzione opposta, che è una modifica facile da apportare una volta che la detrazione del giocatore uno funziona correttamente.

Fase 6: Game Over Se in qualsiasi momento uno dei giocatori raggiunge lo zero di salute, il gioco passa a questo stato. Niente spettacoli di fantasia. Se viene premuto BTN uno, la salute viene ripristinata a 99 e lo stato torna al menu, ricominciando effettivamente il gioco.

Scatola nera

Passaggio 4: moduli

Downcounterclock (basato sul modulo clk_div.vhd di Bryan Mealy):

Questo è l'orologio che gestisce i tempi dei deduttori. La costante denominata max_count è 3 volte superiore alla costante max_count di barclock. Questo renderà i detrattori 3 volte più lenti della velocità della barra.

Barclock - (basato sul modulo clk_div.vhd di Bryan Mealy): questo orologio gestisce i tempi degli indicatori di potenza, che abbiamo incrementato rapidamente per aggiungere difficoltà al gioco. Questa tempistica può essere regolata a proprio piacimento, aumentando la velocità aumentando la costante max_count o diminuendola rendendo max_count un numero inferiore. Sseg_dec - (Scritto da Bryan Mealy): Questo modulo prende un numero a 8 bit come input, che decodifica, converte il numero nel suo equivalente decimale, e poi emette sul display a sette segmenti. Affinché questo file funzioni, devi assicurarti che i tuoi vincoli corrispondano ai nostri.

Pone: questo è un registro a scorrimento che sposta i bit a sinistra, aggiungendo un bit caldo per far sembrare che l'indicatore di potenza stia aumentando. Quando tutti i bit sono caldi, tutti i bit vengono reimpostati su "0" e il ciclo ricomincia.

Ptwo: Questa è una versione capovolta del modulo P1.

Deductor1: questa è una combinazione di un registro a scorrimento e un sottrattore. Il registro a scorrimento va nella direzione opposta al registro a scorrimento di P1, indicando una detrazione. Questo sottrae anche 1 dalla salute del giocatore 2 per ogni ciclo di clock, quindi con la combinazione di queste due funzioni, sembrerà che la salute dell'avversario diminuisca di 1 per ogni led della barra della salute che scende.

Deductor2: questa è una versione capovolta del modulo Deductor1.

PlayDecoder (preso in prestito e leggermente modificato da ekchen35649 suo 133 istruibile):

Viene utilizzato nello stato del menu per visualizzare la parola “PLAY” sul decoder a sette segmenti.

Da fare: immagini, video

Consigliato: