Índice:

Jogo de cronometragem VS competitivo de 2 jogadores: 4 etapas
Jogo de cronometragem VS competitivo de 2 jogadores: 4 etapas

Vídeo: Jogo de cronometragem VS competitivo de 2 jogadores: 4 etapas

Vídeo: Jogo de cronometragem VS competitivo de 2 jogadores: 4 etapas
Vídeo: TUTORIAL AVANÇADO 2#: Jogador Casual vs Jogador Competitivo 2024, Julho
Anonim
Jogo de cronometragem VS competitivo de 2 jogadores
Jogo de cronometragem VS competitivo de 2 jogadores

Você vai precisar de:

1. Digilent Basys 3, placa FPGA (ou qualquer outro FPGA)

2. Uma versão relativamente atualizada do Vivado ou algum outro ambiente VHDL

3. Um computador que pode executar o programa mencionado.

Etapa 1: o próprio jogo

O próprio jogo
O próprio jogo

Como o FSM interage com os módulos.

Como jogar

Para começar, você pressiona o botão do meio. Isso fará com que “99”, representando a saúde do jogador dois, seja exibido no visor de sete segmentos. Em seguida, os LEDs acenderão sequencialmente da direita para a esquerda. Isso forma uma barra de energia. Quando a barra de energia está cheia, ela reinicia. O objetivo do jogador um é girar o interruptor quando a barra estiver o mais alta possível. Quanto mais LEDs acendem, mais dano o jogador um causa ao jogador dois. Depois que o jogador um ativa sua chave, o dano causado é deduzido da saúde do jogador dois. Então, muda para a vez do jogador dois. Agora, o número exibido representa a saúde do jogador um, e a barra de energia é preenchida da esquerda para a direita. Uma vez que o jogador dois faz seu movimento, o dano é deduzido e volta para a vez do jogador um novamente. Isso se repete até que um jogador alcance 0 pontos de vida. Vídeo deste funcionamento está anexado.

Etapa 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Este jogo é essencialmente uma grande máquina de estado finito, em que alguma lógica complexa acontece com base no estado em que o FSM está.

Estado 1: Menu O primeiro estado é a tela do menu, que é um dos estados mais simples. Inclui o display de sete segmentos exibindo a palavra “PLAY” e o botão que inicia o jogo. O botão, BTN, nos leva ao próximo estado, que é a vez do jogador um.

Estado 2: a vez do Jogador Um

A vez do Jogador um ativa um sinal que faz com que a exibição de sete segmentos exiba a saúde do Jogador dois. Outro sinal é ativado para ativar um registrador de deslocamento importado de outro módulo que criamos (Pone.vhd). Este registro de deslocamento faz com que os LEDs se acendam como um medidor de potência crescente faria em outros jogos, e então seria redefinido para 0 quando atingir a quantidade máxima de LEDs que poderiam ser acesos. Ele é atualizado na borda ascendente do relógio obtido de barclock.vhd, que é modificado a partir de um arquivo de laboratório emprestado. Tínhamos a barra do jogador um começando da direita e enchendo à esquerda, porque a chave do jogador um também está à esquerda (para uma experiência intuitiva do usuário). Uma vez que a chave é virada, o estado passa para o jogador uma dedução, e a quantidade de LEDs ativos é salva em um sinal.

Estado 3: dedução do Jogador Um O sinal com a quantidade de LEDs ativos determina a quantidade de saúde que é deduzida. Isso é feito por meio de outro registrador de deslocamento (deductor1.vhd) que, em vez de incrementar os LEDs, os diminui. Isso diminui na borda ascendente de um dos módulos div do clock que pegamos emprestado e modificamos (downcounterclock.vhd). Assim que um LED é desligado, um ponto de saúde é deduzido da saúde total do jogador dois. Se durante este processo o jogador dois atingir 0 de saúde, paramos e passamos imediatamente para o estado de “Fim de jogo”. Caso contrário, uma vez que o vetor LED atinge “0000000000000000”, passamos para a vez do jogador dois.

Estado 4: a vez do jogador dois A vez do jogador dois é exatamente como a vez do jogador um, exceto que o registro de deslocamento para ele (Ptwo.bhd) vai da esquerda para a direita, e o interruptor está no lado direito do tabuleiro. Um sinal é ativado para exibir a saúde do Jogador 1. Uma vez que o interruptor 2 está ativo, ele segue para a vez de dedução do Jogador Dois.

Etapa 5: dedução do jogador dois Assim como na vez do jogador dois, o jogador dois deduz age de maneira muito semelhante à dedução do jogador um. A principal diferença é que o registro de deslocamento que controla o desligamento dos LEDs vai na direção oposta, o que é uma modificação fácil de fazer, uma vez que a dedução do jogador um está funcionando corretamente.

Estágio 6: Fim do Jogo Se em qualquer ponto um dos jogadores atingir zero de saúde, o jogo muda para este estado. Nada extravagante exibe. Se o BTN um for pressionado, a integridade será redefinida para 99 e o estado voltará ao menu, reiniciando o jogo efetivamente.

Etapa 3: Módulos

Módulos
Módulos

Diagrama de caixa preta para jogo

Downcounterclock (baseado no módulo clk_div.vhd de Bryan Mealy):

Este é o relógio que controla a cronometragem dos dedutores. A constante chamada max_count é 3x mais do que a constante max_count do barclock. Isso fará com que os dedutores sejam 3x mais lentos do que a velocidade da barra.

Barclock - (baseado no módulo clk_div.vhd de Bryan Mealy):

Este relógio controla o tempo dos medidores de energia, que aumentamos rapidamente para adicionar dificuldade ao jogo. Este tempo pode ser ajustado ao seu gosto, aumentando a velocidade tornando a constante max_count um número maior ou diminuindo-a tornando max_count um número menor. Sseg_dec - (Escrito por Bryan Mealy): Este módulo recebe um número de 8 bits como entrada, que ele decodifica, convertendo o número em seu equivalente decimal e, em seguida, produz no display de sete segmentos. Para que este arquivo funcione, você precisa ter certeza de que suas restrições correspondem às nossas.

Pone:

Este é um registrador de deslocamento que desloca bits para a esquerda, adicionando um bit ativo para fazer parecer que o medidor de energia está aumentando. Quando todos os bits estão quentes, todos os bits são redefinidos para '0' e o ciclo é reiniciado.

Ptwo:

Esta é uma versão invertida do módulo P1.

Deductor1:

Esta é uma combinação de um registrador de deslocamento e um subtrator. O registrador de deslocamento vai na direção oposta do registrador de deslocamento de P1, indicando uma dedução. Isso também subtrai 1 da saúde do Jogador 2 para cada ciclo do relógio, então, com a combinação dessas duas funções, parecerá que a saúde do oponente está diminuindo em 1 para cada led da barra de saúde que diminui.

Deductor2: esta é uma versão invertida do módulo Deductor1.

PlayDecoder (emprestado e ligeiramente modificado de ekchen35649 seu 133 instrutível): É usado no estado de menu para exibir a palavra “PLAY” no decodificador de sete segmentos.

Etapa 4: teste

Este jogo foi originalmente inspirado em um dos minijogos de Kirby. É um jogo simples para dois jogadores que pode ser jogado em um Basys 3 Board ou em qualquer FPGA.

Etapa 1: Materiais Necessários

Você vai precisar de: Digilent Basys 3, FPGA Board (ou qualquer outro) Uma versão relativamente atualizada do Vivado, ou algum outro ambiente vhdl Um computador que possa rodar o programa mencionado A brain

Etapa 2: o próprio jogo

Como jogar

Para começar, você pressiona o botão do meio. Isso fará com que “99”, representando a saúde do jogador dois, seja exibido no visor de sete segmentos. Em seguida, os LEDs acenderão sequencialmente da direita para a esquerda. Isso forma uma barra de energia. Assim que a barra de energia estiver cheia, ela reinicia. O objetivo do jogador um é girar o interruptor quando a barra estiver o mais alta possível. Quanto mais LEDs acendem, mais dano o jogador um causa ao jogador dois. Depois que o jogador um ativa sua chave, o dano causado é deduzido da saúde do jogador dois. Então, muda para a vez do jogador dois. Agora, o número exibido representa a saúde do jogador um, e a barra de energia é preenchida da esquerda para a direita. Uma vez que o jogador dois faz seu movimento, o dano é deduzido e volta para a vez do jogador um novamente. Isso se repete até que um jogador alcance 0 pontos de vida. Vídeo deste funcionamento está anexado.

Para jogar, carregue-o em um tabuleiro basys e pressione o botão do meio. Tente girar a chave com o máximo possível de LEDs ativos e, em seguida, espere e observe enquanto o tabuleiro deduz esses pontos da saúde do seu oponente. Em seguida, passe para o seu amigo e

Etapa 3: FSM

Este jogo é essencialmente uma grande máquina de estado finito, em que alguma lógica complexa acontece com base no estado em que o FSM está.

(Diagrama de Estado)

Estado 1: Menu

O primeiro estado é a tela do menu, que é um dos estados mais simples. Inclui o display de sete segmentos exibindo a palavra “PLAY” e o botão que inicia o jogo. O botão, BTN, nos leva ao próximo estado, que é a vez do jogador um.

Estado 2: a vez do Jogador Um

A vez do Jogador um ativa um sinal que faz com que a tela de sete segmentos exiba a saúde do Jogador dois. Outro sinal é ativado para ativar um registrador de deslocamento importado de outro módulo que criamos (Pone.vhd). Este registro de deslocamento faz com que os LEDs se acendam como um medidor de potência crescente faria em outros jogos, e então seria redefinido para 0 quando atingir a quantidade máxima de LEDs que poderiam ser acesos. Ele atualiza na borda ascendente do relógio obtido de barclock.vhd, que é modificado a partir de um arquivo de laboratório emprestado. Tínhamos a barra do jogador um começando da direita e enchendo à esquerda, porque a chave do jogador um também está à esquerda (para uma experiência intuitiva do usuário). Uma vez que a chave é virada, o estado passa para o jogador uma dedução, e a quantidade de LEDs ativos é salva em um sinal.

Estado 3: dedução do Jogador Um

O sinal com a quantidade de LEDs ativos determina a quantidade de saúde que é deduzida. Isso é feito por meio de outro registrador de deslocamento (deductor1.vhd) que, em vez de incrementar os LEDs, os diminui. Isso diminui na borda ascendente de um dos módulos div do clock que pegamos emprestado e modificamos (downcounterclock.vhd). Assim que um LED é desligado, um ponto de saúde é deduzido da saúde total do jogador dois. Se durante este processo o jogador dois atingir 0 de saúde, paramos e passamos imediatamente para o estado de “Fim de jogo”. Caso contrário, uma vez que o vetor LED atinge “0000000000000000”, passamos para a vez do jogador dois.

Estado 4: a vez do Jogador Dois

O turno do jogador dois é exatamente igual ao do jogador um, exceto que o registro de deslocamento para ele (Ptwo.bhd) vai da esquerda para a direita, e o interruptor está no lado direito do tabuleiro. Um sinal é ativado para exibir a saúde do Jogador 1. Uma vez que o interruptor 2 está ativo, ele segue para a vez de dedução do Jogador Dois.

Etapa 5: dedução do jogador dois

Assim como na vez do jogador dois, o jogador dois deduz age de maneira muito semelhante à dedução do jogador um. A principal diferença é que o registro de deslocamento que controla o desligamento dos LEDs vai na direção oposta, o que é uma modificação fácil de fazer, uma vez que a dedução do jogador está funcionando corretamente.

Estágio 6: Fim do Jogo Se em qualquer ponto um dos jogadores atingir zero de saúde, o jogo muda para este estado. Nada extravagante exibe. Se o BTN um for pressionado, a integridade será redefinida para 99 e o estado voltará ao menu, reiniciando o jogo efetivamente.

Caixa preta

Etapa 4: Módulos

Downcounterclock (baseado no módulo clk_div.vhd de Bryan Mealy):

Este é o relógio que controla a cronometragem dos dedutores. A constante chamada max_count é 3x mais do que a constante max_count do barclock. Isso tornará os dedutores 3x mais lentos do que a velocidade da barra.

Barclock - (baseado no módulo clk_div.vhd de Bryan Mealy): Este relógio controla o tempo dos medidores de energia, que aumentamos rapidamente para adicionar dificuldade ao jogo. Esse tempo pode ser ajustado ao seu gosto, aumentando a velocidade tornando a constante max_count um número maior ou diminuindo-a tornando max_count um número menor. Sseg_dec - (Escrito por Bryan Mealy): Este módulo recebe um número de 8 bits como entrada, que ele decodifica, convertendo o número em seu equivalente decimal e, em seguida, produz no display de sete segmentos. Para que esse arquivo funcione, você precisa ter certeza de que suas restrições correspondem às nossas.

Pone: Este é um registrador de deslocamento que desloca bits para a esquerda, adicionando um bit ativo para fazer parecer que o medidor de energia está aumentando. Quando todos os bits estão quentes, todos os bits são redefinidos para '0' e o ciclo é reiniciado.

Ptwo: Esta é uma versão invertida do módulo P1.

Dedutor1: Esta é uma combinação de um registrador de deslocamento e um subtrator. O registrador de deslocamento vai na direção oposta do registrador de deslocamento de P1, indicando uma dedução. Isso também subtrai 1 da saúde do Jogador 2 para cada ciclo do relógio, então, com a combinação dessas duas funções, parecerá que a saúde do oponente está diminuindo em 1 para cada led da barra de saúde que diminui.

Deductor2: esta é uma versão invertida do módulo Deductor1.

PlayDecoder (emprestado e ligeiramente modificado de ekchen35649 seu 133 instrutível):

Isso é usado no estado de menu para exibir a palavra “PLAY” no decodificador de sete segmentos.

Para fazer: fotos, vídeo

Recomendado: