Table des matières:

Jeu de chronométrage VS compétitif à 2 joueurs : 4 étapes
Jeu de chronométrage VS compétitif à 2 joueurs : 4 étapes

Vidéo: Jeu de chronométrage VS compétitif à 2 joueurs : 4 étapes

Vidéo: Jeu de chronométrage VS compétitif à 2 joueurs : 4 étapes
Vidéo: accident de voiture en direct c'est violent 😱😱😱 #accident #crash #choc #collision #violent #voiture 2024, Novembre
Anonim
Jeu de chronométrage VS compétitif à 2 joueurs
Jeu de chronométrage VS compétitif à 2 joueurs

Tu auras besoin de:

1. Digilent Basys 3, carte FPGA (ou tout autre FPGA,)

2. Une version relativement à jour de Vivado, ou un autre environnement VHDL

3. Un ordinateur pouvant exécuter le programme mentionné.

Étape 1: le jeu lui-même

Le jeu lui-même
Le jeu lui-même

Comment le FSM interagit avec les modules.

Comment jouer

Pour commencer, vous appuyez sur le bouton du milieu. Cela entraînera l'affichage de "99", représentant la santé du joueur deux, sur l'affichage à sept segments. Ensuite, les LED s'allumeront séquentiellement de droite à gauche. Cela forme une barre d'alimentation. Une fois la barre d'alimentation pleine, elle se réinitialise. Le but du joueur 1 est de retourner son interrupteur lorsque la barre est la plus haute possible. Plus il y a de LED allumées, plus le joueur un inflige de dégâts au joueur deux. Une fois que le premier joueur a basculé son interrupteur, les dégâts infligés sont déduits de la santé du deuxième joueur. Ensuite, il passe au tour du joueur 2. Maintenant, le nombre affiché représente la santé du joueur et la barre d'alimentation se remplit de gauche à droite. Une fois que le deuxième joueur a fait son mouvement, les dégâts sont déduits et c'est à nouveau le tour du premier joueur. Cela se répète jusqu'à ce qu'un joueur atteigne 0 santé. La vidéo de ce fonctionnement est jointe.

Étape 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Ce jeu est essentiellement une grande machine à états finis, dans laquelle se déroule une logique complexe basée sur l'état dans lequel se trouve le FSM.

État 1: MenuLe premier état est l'écran de menu, qui est l'un des états les plus simples. Il comprend l'affichage à sept segments affichant le mot « JOUER » et le bouton qui fait démarrer le jeu. Le bouton, BTN, nous conduit à l'état suivant, qui est le tour du joueur.

État 2: au tour du joueur 1

Le tour du joueur un active un signal qui fait que l'affichage à sept segments affiche la santé du joueur deux. Un autre signal s'allume pour activer un registre à décalage importé d'un autre module que nous avons créé (Pone.vhd). Ce registre à décalage fait s'allumer les LED comme le ferait une jauge de puissance croissante dans d'autres jeux, et il serait ensuite remis à 0 lorsqu'il atteindrait le nombre maximum de LED qui pourraient être allumées. Il se met à jour sur le front montant de l'horloge obtenu à partir de barclock.vhd, qui est modifié à partir d'un fichier de laboratoire emprunté. Nous avons fait commencer la barre du joueur à partir de la droite et se remplir à gauche, car le commutateur du joueur est également à gauche (pour une expérience utilisateur intuitive). Une fois que l'interrupteur est basculé, l'état passe au joueur un déduire, et la quantité de LED actives est enregistrée dans un signal.

État 3: joueur un déduit Le signal avec la quantité de LED actives détermine la quantité de santé qui est déduite. Ceci est fait en ayant un autre registre à décalage (deductor1.vhd) qui plutôt que d'incrémenter les LED, les décrémente. Cela décrémente sur le front montant de l'un des modules d'horloge div que nous avons empruntés et modifiés (downcounterclock.vhd). Dès qu'une LED est éteinte, un point de santé est déduit de la santé totale du joueur deux. Si au cours de ce processus, le joueur 2 atteint 0 points de vie, nous nous arrêtons et passons immédiatement à l'état « Game over ». Sinon, une fois que le vecteur LED atteint "0000000000000000", nous passons au tour du joueur 2.

État 4: le tour du joueur 2 Le tour du joueur 2 est exactement comme le tour du joueur 1, sauf que le registre à décalage (Ptwo.bhd) va de gauche à droite et que l'interrupteur se trouve sur le côté droit du plateau. Un signal s'active pour afficher la santé du joueur 1. Une fois que le commutateur 2 est actif, cela passe au tour de déduction du joueur deux.

Étape 5: Déduction du joueur 2 Tout comme le tour du joueur 2, la déduction du joueur 2 agit un peu comme la déduction du joueur un. La principale différence est que le registre à décalage qui contrôle l'extinction de la LED va dans la direction opposée, ce qui est une modification facile à faire une fois que vous avez fait fonctionner correctement la déduction du joueur.

Étape 6: Fin du jeu Si à un moment donné l'un des joueurs atteint zéro santé, le jeu passe à cet état. Rien d'extraordinaire n'affiche. Si BTN one est enfoncé, la santé est réinitialisée à 99 et l'état revient au menu, redémarrant effectivement le jeu.

Étape 3: Modules

Modules
Modules

Diagramme de la boîte noire pour le jeu

Downcounterclock (basé sur le module clk_div.vhd de Bryan Mealy):

C'est l'horloge qui gère la synchronisation des déductrices. La constante nommée max_count est 3 fois supérieure à la constante max_count de barclock. Cela rendra les déducteurs 3 fois plus lents que la vitesse de la barre.

Barclock - (basé sur le module clk_div.vhd de Bryan Mealy):

Cette horloge gère le timing des jauges de puissance, que nous avons fait incrémenter rapidement pour ajouter de la difficulté au jeu. Ce timing peut être ajusté à votre convenance, en augmentant la vitesse en faisant de la constante max_count un nombre plus grand, ou en la diminuant en faisant de max_count un nombre plus petit. Sseg_dec - (Écrit par Bryan Mealy): Ce module prend un nombre de 8 bits en entrée, qu'il décode, convertit le nombre en son équivalent décimal, puis sort sur l'affichage à sept segments. Pour que ce fichier fonctionne, vous devez vous assurer que vos contraintes correspondent aux nôtres.

Poné:

Il s'agit d'un registre à décalage qui décale les bits vers la gauche, ajoutant un bit chaud pour donner l'impression que la jauge de puissance augmente. Lorsque tous les bits sont chauds, tous les bits sont réinitialisés à « 0 » et le cycle recommence.

Deux:

Il s'agit d'une version inversée du module P1.

Déducteur1:

Il s'agit d'une combinaison d'un registre à décalage et d'un soustracteur. Le registre à décalage va dans le sens inverse du registre à décalage de P1, indiquant une déduction. Cela soustrait également 1 à la santé du joueur 2 pour chaque cycle d'horloge, donc avec la combinaison de ces deux fonctions, il semblera que la santé de l'adversaire diminue de 1 pour chaque led de la barre de santé qui descend.

Deductor2: il s'agit d'une version inversée du module Deductor1.

PlayDecoder (emprunté et légèrement modifié de ekchen35649 son 133 instructable): Ceci est utilisé dans l'état du menu pour afficher le mot "PLAY" sur le décodeur à sept segments.

Étape 4: Tester

Ce jeu a été inspiré à l'origine par l'un des mini-jeux de Kirby. C'est un jeu simple à deux joueurs qui peut être joué sur une carte Basys 3 ou n'importe quel FPGA.

Étape 1: Matériel requis

Vous aurez besoin de: Digilent Basys 3, FPGA Board (ou tout autre) Une version relativement à jour de Vivado, ou un autre environnement vhdl Un ordinateur qui peut exécuter le programme mentionné Un cerveau

Étape 2: le jeu lui-même

Comment jouer

Pour commencer, vous appuyez sur le bouton du milieu. Cela entraînera l'affichage de "99", représentant la santé du joueur deux, sur l'affichage à sept segments. Ensuite, les LED s'allumeront séquentiellement de droite à gauche. Cela forme une barre d'alimentation. Une fois la barre d'alimentation pleine, elle se réinitialise. Le but du joueur 1 est de retourner son interrupteur lorsque la barre est la plus haute possible. Plus il y a de LED allumées, plus le joueur un inflige de dégâts au joueur deux. Une fois que le premier joueur a basculé son interrupteur, les dégâts infligés sont déduits de la santé du deuxième joueur. Ensuite, il passe au tour du joueur 2. Maintenant, le nombre affiché représente la santé du joueur et la barre d'alimentation se remplit de gauche à droite. Une fois que le deuxième joueur a fait son mouvement, les dégâts sont déduits et c'est à nouveau le tour du premier joueur. Cela se répète jusqu'à ce qu'un joueur atteigne 0 santé. La vidéo de ce fonctionnement est jointe.

Pour jouer au jeu, chargez-le sur une carte basys et appuyez sur le bouton du milieu. Essayez de basculer l'interrupteur avec autant de LED actives que possible, puis attendez et regardez pendant que le tableau déduit ces points de la santé de votre adversaire. Ensuite, passez-le à votre ami, et

Étape 3: FSM

Ce jeu est essentiellement une grande machine à états finis, dans laquelle se déroule une logique complexe basée sur l'état dans lequel se trouve le FSM.

(Diagramme d'état)

Etat 1: Menu

Le premier état est l'écran de menu, qui est l'un des états les plus simples. Il comprend l'affichage à sept segments affichant le mot « JOUER » et le bouton qui fait démarrer le jeu. Le bouton, BTN, nous mène à l'état suivant, qui est le tour du joueur.

État 2: au tour du joueur 1

Le tour du joueur un active un signal qui fait que l'affichage à sept segments affiche la santé du joueur deux. Un autre signal s'allume pour activer un registre à décalage importé d'un autre module que nous avons créé (Pone.vhd). Ce registre à décalage fait s'allumer les LED comme le ferait une jauge de puissance croissante dans d'autres jeux, et il serait ensuite remis à 0 lorsqu'il atteindrait le nombre maximum de LED qui pourraient être allumées. Il se met à jour sur le front montant de l'horloge obtenu à partir de barclock.vhd, qui est modifié à partir d'un fichier de laboratoire emprunté. Nous avons fait commencer la barre du joueur à partir de la droite et se remplir à gauche, car le commutateur du joueur est également à gauche (pour une expérience utilisateur intuitive). Une fois que l'interrupteur est basculé, l'état passe au joueur un déduire, et la quantité de LED actives est enregistrée dans un signal.

État 3: joueur un déduire

Le signal avec la quantité de LED actives détermine la quantité de santé qui est déduite. Ceci est fait en ayant un autre registre à décalage (deductor1.vhd) qui plutôt que d'incrémenter les LED, les décrémente. Cela décrémente sur le front montant de l'un des modules d'horloge div que nous avons empruntés et modifiés (downcounterclock.vhd). Dès qu'une LED est éteinte, un point de santé est déduit de la santé totale du joueur deux. Si au cours de ce processus, le joueur 2 atteint 0 points de vie, nous nous arrêtons et passons immédiatement à l'état « Game over ». Sinon, une fois que le vecteur LED atteint "0000000000000000", nous passons au tour du joueur 2.

État 4: au tour du joueur 2

Le tour du joueur deux est exactement comme celui du joueur un, sauf que le registre à décalage (Ptwo.bhd) va de gauche à droite et que l'interrupteur se trouve sur le côté droit du tableau. Un signal s'active pour afficher la santé du joueur 1. Une fois que le commutateur 2 est actif, cela passe au tour de déduction du joueur deux.

Étape 5: Déduction du joueur 2

Tout comme le tour du deuxième joueur, le deuxième joueur déduit agit un peu comme le premier joueur déduit. La principale différence est que le registre à décalage qui contrôle l'extinction de la LED va dans la direction opposée, ce qui est une modification facile à faire une fois que vous avez fait fonctionner correctement la déduction du joueur.

Étape 6: Fin du jeu Si à un moment donné l'un des joueurs atteint zéro santé, le jeu passe à cet état. Rien d'extraordinaire n'affiche. Si BTN one est enfoncé, la santé est réinitialisée à 99 et l'état revient au menu, redémarrant effectivement le jeu.

Boîte noire

Étape 4: Modules

Downcounterclock (basé sur le module clk_div.vhd de Bryan Mealy):

C'est l'horloge qui gère la synchronisation des déductrices. La constante nommée max_count est 3 fois supérieure à la constante max_count de barclock. Cela rendra les déducteurs 3 fois plus lents que la vitesse de la barre.

Barclock - (basé sur le module clk_div.vhd de Bryan Mealy): Cette horloge gère le timing des jauges de puissance, que nous avons fait incrémenter rapidement pour ajouter de la difficulté au jeu. Ce timing peut être ajusté à votre convenance, en augmentant la vitesse en faisant de la constante max_count un nombre plus grand, ou en la diminuant en faisant de max_count un nombre plus petit. Sseg_dec - (Écrit par Bryan Mealy): Ce module prend un nombre de 8 bits en entrée, qu'il décode, convertit le nombre en son équivalent décimal, puis sort sur l'affichage à sept segments. Pour que ce fichier fonctionne, vous devez vous assurer que vos contraintes correspondent aux nôtres.

Pone: il s'agit d'un registre à décalage qui décale les bits vers la gauche, en ajoutant un bit chaud pour donner l'impression que la jauge de puissance augmente. Lorsque tous les bits sont chauds, tous les bits sont réinitialisés à « 0 » et le cycle recommence.

Ptwo: il s'agit d'une version inversée du module P1.

Deductor1: Il s'agit d'une combinaison d'un registre à décalage et d'un soustracteur. Le registre à décalage va dans le sens inverse du registre à décalage de P1, indiquant une déduction. Cela soustrait également 1 à la santé du joueur 2 pour chaque cycle d'horloge, donc avec la combinaison de ces deux fonctions, il semblera que la santé de l'adversaire diminue de 1 pour chaque led de la barre de santé qui descend.

Deductor2: il s'agit d'une version inversée du module Deductor1.

PlayDecoder (emprunté et légèrement modifié de ekchen35649 son 133 instructable):

Ceci est utilisé dans l'état du menu pour afficher le mot « PLAY » sur le décodeur à sept segments.

A faire: photos, vidéo

Conseillé: