.. note::
Bonjour et bienvenue dans la communauté Facebook des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.
**Pourquoi rejoindre ?**
- **Support d'experts** : Résolvez vos problèmes techniques et après-vente avec l'aide de notre communauté et de notre équipe.
- **Apprendre et Partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits.
- **Réductions spéciales** : Bénéficiez de réductions exclusives sur nos nouveaux produits.
- **Promotions festives et concours** : Participez à des concours et promotions pendant les fêtes.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
3.1.12 JEU - Devinez le nombre
==================================
Introduction
----------------
« Devinez le Nombre » est un jeu amusant où vous et vos amis tour à tour entrez
un nombre (0~99). La plage de nombres possibles se réduit progressivement jusqu'à
ce qu'un joueur devine le bon chiffre. Celui qui trouve le bon nombre perd et subit
une pénalité. Par exemple, si le nombre secret est 51 (invisible pour les joueurs)
et que le joueur ① entre 50, la plage passe à 50~99 ; si le joueur ② entre 70, la
plage se réduit à 50~70 ; si le joueur ③ entre 51, ce joueur est le perdant. Ici,
nous utilisons un clavier pour saisir les nombres et un écran LCD pour afficher les résultats.
Composants
-----------------
.. image:: img/list_GAME_Guess_Number.png
:align: center
Schéma de câblage
--------------------
============ ======== ======== =======
T-Board Name physical wiringPi BCM
GPIO18 Pin 12 1 18
GPIO23 Pin 16 4 23
GPIO24 Pin 18 5 24
GPIO25 Pin 22 6 25
SPIMOSI Pin 19 12 10
GPIO22 Pin 15 3 22
GPIO27 Pin 13 2 27
GPIO17 Pin 11 0 17
SDA1 Pin 3 SDA1(8) SDA1(2)
SCL1 Pin 5 SCL1(9) SDA1(3)
============ ======== ======== =======
.. image:: img/Schematic_three_one12.png
:align: center
Procédures expérimentales
------------------------------
**Étape 1 :** Construire le circuit.
.. image:: img/image273.png
:width: 800
**Étape 2 :** Configurer I2C (voir l'Annexe. Si I2C est déjà configuré, passez cette étape.)
**Étape 3 :** Changer de répertoire.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.12/
**Étape 4 :** Compiler.
.. raw:: html
.. code-block::
gcc 3.1.12_GAME_GuessNumber.c -lwiringPi
**Étape 5 :** Exécuter.
.. raw:: html
.. code-block::
sudo ./a.out
Lorsque le programme démarre, la page initiale s'affiche sur le LCD :
.. code-block::
Welcome!
Press A to go!
Appuyez sur 'A' et le jeu commence. La page de jeu apparaît alors sur l’écran LCD.
.. code-block::
Enter number:
0 ‹point‹ 99
.. note::
Si cela ne fonctionne pas après l'exécution, ou s'il y a un message d'erreur: \"wiringPi.h: Aucun fichier ou répertoire de ce type", veuillez vous référer à :ref:`faq_c_nowork`.
Un nombre aléatoire « **point** » est généré mais n'est pas affiché sur le
LCD au début du jeu. Votre objectif est de le deviner. Le nombre que vous
saisissez s'affiche en bas de la première ligne jusqu'à la fin du calcul.
(Appuyez sur 'D' pour lancer la comparaison. Si le nombre saisi est supérieur
à **10**, la comparaison automatique commence.)
La plage de nombres de « point » s'affiche sur la deuxième ligne. Vous devez
entrer un nombre dans cette plage. À chaque saisie, la plage se réduit ; si
vous devinez le nombre secret, le message « Vous avez gagné ! » apparaîtra.
**Explication du code**
La première partie du code contient les fonctions essentielles pour le **clavier**
et le **LCD1602 I2C**. Vous pouvez consulter les sections :ref:`1.1.7_i2c_lcd_c_pi5` et
**2.1.5 Keypad** pour plus de détails.
Voici ce que nous devons savoir :
.. code-block:: c
/****************************************/
//Début du programme
/****************************************/
void init(void){
fd = wiringPiI2CSetup(LCDAddr);
lcd_init();
lcd_clear();
for(int i=0 ; i<4 ; i++) {
pinMode(rowPins[i], OUTPUT);
pinMode(colPins[i], INPUT);
}
lcd_clear();
write(0, 0, "Welcome!");
write(0, 1, "Press A to go!");
}
Cette fonction est utilisée pour définir initialement le **LCD1602 I2C** et le **clavier**, et pour afficher « Bienvenue ! » et « Appuyez sur A ! ».
.. code-block:: c
void init_new_value(void){
srand(time(0));
pointValue = rand()%100;
upper = 99;
lower = 0;
count = 0;
printf("point is %d\n",pointValue);
}
Cette fonction génère un nombre aléatoire nommé « **point** » et réinitialise la plage d'affichage.
.. code-block:: c
bool detect_point(void){
if(count > pointValue){
if(count < upper){
upper = count;
}
}
else if(count < pointValue){
if(count > lower){
lower = count;
}
}
else if(count = pointValue){
count = 0;
return 1;
}
count = 0;
return 0;
}
La fonction detect_point() compare le nombre saisi avec le nombre secret « point ».
Si les valeurs ne correspondent pas, **count** ajuste les valeurs de **upper** et
**lower** et renvoie « **0** » ; sinon, si elles correspondent, la fonction retourne « **1** ».
.. code-block:: c
void lcd_show_input(bool result){
char *str=NULL;
str =(char*)malloc(sizeof(char)*3);
lcd_clear();
if (result == 1){
write(0,1,"You've got it!");
delay(5000);
init_new_value();
lcd_show_input(0);
return;
}
write(0,0,"Enter number:");
Int2Str(str,count);
write(13,0,str);
Int2Str(str,lower);
write(0,1,str);
write(3,1,"='0' && pressed_keys[0] <= '9'){
count = count * 10;
count = count + (pressed_keys[0] - 48);
if (count>=10){
result = detect_point();
}
lcd_show_input(result);
}
}
keyCopy(last_key_pressed, pressed_keys);
}
delay(100);
}
return 0;
}
**main()** contient l'ensemble du processus du programme, comme décrit ci-dessous :
1) Initialiser le **LCD1602 I2C** et le **clavier**.
2) Utiliser **init_new_value()** pour générer un nombre aléatoire compris entre **0 et 99**.
3) Détecter si un bouton est pressé et lire l'entrée du clavier.
4) Si le bouton '**A**' est pressé, un nombre aléatoire compris entre **0 et 99** est
généré et le jeu commence.
5) Si le bouton '**D**' est détecté, le programme entre dans la phase de jugement et
affiche le résultat sur le LCD. Cette étape permet de juger le résultat même si un
seul chiffre est entré, puis le bouton '**D**' est pressé.
6) Si un bouton entre **0 et 9** est pressé, la valeur de **count** est modifiée ; si
**count** est supérieur à **10**, le jugement est déclenché.
7) Les changements du jeu et les valeurs associées sont affichés sur le **LCD1602**.