GNU/Linux >> Tutoriels Linux >  >> Linux

Écrire un jeu de devinettes dans ncurses sous Linux

Dans mon dernier article, j'ai donné une brève introduction à l'utilisation de ncurses bibliothèque pour écrire des applications interactives en mode texte en C. Avec ncurses , nous pouvons contrôler où et comment le texte est affiché sur le terminal. Si vous explorez les ncurses fonctions de la bibliothèque en lisant les pages de manuel, vous découvrirez qu'il existe une tonne de façons différentes d'afficher du texte, y compris du texte en gras, des couleurs, du texte clignotant, des fenêtres, des bordures, des caractères graphiques et d'autres fonctionnalités pour faire ressortir votre application.

Programmation et développement

  • Blog des développeurs Red Hat
  • Fiches de triche de programmation
  • Essayez gratuitement :Red Hat Learning Subscription
  • eBook :Une introduction à la programmation avec Bash
  • Aide-mémoire pour les scripts de shell bash
  • eBook :Modernisation de Java d'entreprise

Si vous souhaitez explorer un programme plus avancé qui démontre quelques-unes de ces fonctionnalités intéressantes, voici un jeu simple "devinez le nombre", mis à jour pour utiliser ncurses . Le programme choisit un nombre aléatoire dans une plage, puis demande à l'utilisateur de faire des suppositions répétées jusqu'à ce qu'il trouve le nombre secret. Au fur et à mesure que l'utilisateur fait sa supposition, le programme lui fait savoir si la supposition était trop faible ou trop élevée.

Notez que ce programme limite les nombres possibles de 0 à 7. Garder les valeurs à une plage limitée de nombres à un chiffre facilite l'utilisation de getch() pour lire un seul numéro de l'utilisateur. J'ai aussi utilisé le getrandom appel système du noyau pour générer des bits aléatoires, masqués par le nombre 7 pour choisir un nombre aléatoire de 0 (binaire 0000) à 7 (binaire 0111).

#include <curses.h>
#include <string.h>          /* for strlen */
#include <sys/random.h>      /* for getrandom */

int
random0_7()
{
   int num;
   getrandom(&num, sizeof(int), GRND_NONBLOCK);
   return (num & 7); /* from 0000 to 0111 */
}

int
read_guess()
{
  int ch;

  do {
    ch = getch();
  } while ((ch < '0') || (ch > '7'));

  return (ch - '0'); /* turn into a number */
}

En utilisant ncurses , nous pouvons ajouter un intérêt visuel. Ajoutons des fonctions pour afficher le texte important en haut de l'écran et une ligne de message pour afficher les informations d'état en bas de l'écran.

void
print_header(const char *text)
{
  move(0, 0);
  clrtoeol();

  attron(A_BOLD);
  mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text);
  attroff(A_BOLD);
  refresh();
}

void
print_status(const char *text)
{
  move(LINES - 1, 0);
  clrtoeol();
 
  attron(A_REVERSE);
  mvaddstr(LINES - 1, 0, text);
  attroff(A_REVERSE);
  refresh();
}

Avec ces fonctions, nous pouvons construire la partie principale de notre jeu de devinettes. Tout d'abord, le programme configure le terminal pour ncurses , puis choisit un nombre aléatoire de 0 à 7. Après avoir affiché une échelle de nombres, le programme entre alors dans une boucle pour demander à l'utilisateur de deviner.

Au fur et à mesure que l'utilisateur fait sa supposition, le programme fournit un retour visuel. Si l'estimation est trop faible, le programme imprime un crochet gauche sous le nombre à l'écran. Si l'estimation est trop élevée, le jeu imprime un crochet droit. Cela aide l'utilisateur à affiner son choix jusqu'à ce qu'il devine le bon nombre.

int
main()
{
  int number, guess;

  initscr();
  cbreak();
  noecho();

  number = random0_7();
  mvprintw(1, COLS - 1, "%d", number); /* debugging */

  print_header("Guess the number 0-7");

  mvaddstr(9, (COLS / 2) - 7, "0 1 2 3 4 5 6 7");

  print_status("Make a guess...");

  do {
    guess = read_guess();

    move(10, (COLS / 2) - 7 + (guess * 2));

    if (guess < number) {
      addch('[');
      print_status("Too low");
    }

    else if (guess > number) {
      addch(']');
      print_status("Too high");
    }

    else {
      addch('^');
    }
  } while (guess != number);

  print_header("That's right!");
  print_status("Press any key to quit");
  getch();

  endwin();

  return 0;
}

Copiez ce programme et compilez-le vous-même pour l'essayer. N'oubliez pas que vous devez dire à GCC de se lier avec le ncurses bibliothèque :

$ gcc -o guess guess.c -lncurses

J'ai laissé la ligne de débogage ici, afin que vous puissiez voir le numéro secret près du coin supérieur droit de l'écran :

Allez-y avec ncurses

Ce programme utilise un tas d'autres fonctionnalités de ncurses que vous pouvez utiliser comme point de départ. Par exemple, la fonction print_header imprime un message en texte gras centré en haut de l'écran, et la fonction print_status imprime un message en texte inversé en bas à gauche de l'écran. Utilisez ceci pour vous aider à démarrer avec ncurses programmation.


Linux
  1. Comment augmenter la limite du nombre de fichiers ouverts sous Linux

  2. Comment écrire un fichier avec C sous Linux ?

  3. De quoi ai-je besoin pour écrire un petit jeu sous Linux ?

  4. O_DIRECT contre O_SYNC sous Linux/FreeBSD

  5. Afficher le nombre de messages dans la file d'attente de messagerie Linux

Comment copier un grand nombre de fichiers sous Linux

Comment envoyer un ping à un numéro de port sous Linux

Compter le nombre de fichiers dans un répertoire sous Linux

Un guide sur la commande atop sous Linux

Comment écrire et exécuter un programme C sous Linux

commande d'écriture sous Linux avec des exemples