2015-12-10 12 views
1

J'ai besoin d'un moyen d'utiliser les fonctionnalités kbhit et getch d'une manière portable. Je suis en train de développer un jeu Ascii simple et j'ai besoin de détecter si une touche est pressée. Si c'est le cas, j'ai besoin de le lire et si ce n'est pas le cas, je dois continuer sans attendre d'entrée. Je préférerais ne pas faire écho, mais je ne vais pas être difficile à ce sujet. Je pense que kbhit et getch seraient parfaits pour cela, MAIS je suis seulement autorisé à utiliser du code entièrement portable (enfin au moins du code pour Linux, Mac et PC, pas beaucoup d'autres systèmes d'exploitation ne me viennent à l'esprit). Si je comprends bien, les bibliothèques termios, malédictions et conio ne sont pas complètement implémentées sur les trois OS dont j'ai besoin. Je suis à perte. Chaque solution que j'ai trouvée utilise du code non portable. Est-ce que je peux écrire des fonctions portables pour moi-même? J'inclus actuellement stdio.h, stdlib.h et time.h. J'ai également besoin d'un moyen portable pour effacer l'écran car j'utilise system ("cls") et system ("clear") qui doivent aussi être changés chaque fois que je change le système d'exploitation, ou est la façon dont je pourrais faire un if-else et détecte le système d'exploitation sur lequel s'exécute le code pour basculer entre ces deux instructions. Voici un segment de code qui a ces fonctions:alternative portable à kbhit() et getch() et le système ("cls")

char key = ' '; 
    while(1) 
    { 
     system("cls"); 
     if (_kbhit()) 
     { 
      key =_getch(); 
      printf("output: %c", key); 
     }  
     else 
      printf("output:"); 
    } 

C'est essentiellement ce que la fonctionnalité dont j'ai besoin dans mon code, mais je ne peux pas trouver un moyen portable de le faire, et mon professeur exige le code travailler sous Linux, mac et pc en utilisant les bibliothèques standards c et standard. S'il vous plaît aider! Et pas de C++ s'il vous plaît, nous utilisons c.

EDIT: Je ne pense pas que ncurses n'était pas tout à fait ce que je cherchais. Quelqu'un m'a recommandé d'utiliser #ifdef pour les implémenter au moment de la compilation. J'aime cette solution, mais j'ai besoin d'aide pour comprendre comment faire cela sur Linux et Mac car je ne peux tester que sur Windows avec ma configuration actuelle. J'espère avoir bientôt Linux sur mon autre machine pour tester, mais OSX a un gros prix, donc j'apprécierais l'aide. Voici le code actuel:

//libraries 
#include <stdio.h>  //used for i/o 
#include <stdlib.h>  //used for clearing the screen 
#include <time.h>  //used to get time for random number generator 

//check OS and include necessary libraries 
#ifdef _WIN32 
    //code for Windows (32-bit and 64-bit, this part is common) 
    #include <conio.h> 
    #define CLEARSCREEN system("cls") 
    #define CHECKKEY _kbhit() 
    #define NBGETCHAR getch() 

#elif __APPLE__ 
    //code for mac 
    #define CLEARSCREEN system("clear") 
    #define CHECKKEY 
    #define NBGETCHAR 

#elif __linux__ 
    //code for linux 
    #define CLEARSCREEN system("clear") 
    #define CHECKKEY 
    #define NBGETCHAR 

#else 
# error "Unknown compiler" 
#endif 

int main() 
{ 
    char key = ' '; 
    while(1) 
    { 
     CLEARSCREEN; 
     if (CHECKKEY) 
     { 
      key=NBGETCHAR; 
      printf("output: %c", key); 
     }  
     else 
      printf("output:"); 
    } 
} 
+2

Une solution consiste à utiliser # ifdef pour sélectionner (au moment de la compilation) le code correct pour le système d'exploitation. Le code portable ne signifie pas "compiler une fois, courir partout". Cela signifie compiler sur chaque système d'exploitation, avec autant de dépendances que nécessaire. – user3386109

+1

Il n'y a pas de façon portable de faire cela. Le plus proche, vous pouvez venir est une sorte de bibliothèque tierce qui gère les problèmes de portabilité pour vous. Les malédictions viennent probablement le plus près de faire cela. Sinon, vous devez écrire vos propres fonctions clear(), kbhit() et getch(), avec des versions séparées de chaque pour chaque système d'exploitation. –

+0

POURQUOI n'y a-t-il pas de moyen portable de faire cela? – Dmitry

Répondre

2

Vous devriez regarder dans la bibliothèque ncurses portable. En plus de nombreux autres outils pour dessiner dans le terminal, il fournit un keyboard interface qui comprend une fonction getch().

+0

Ce n'est pas la solution. ncurses prend en charge votre écran et n'est pas compatible avec les programmes de console existants. Une fois que vous allez malédictions, vous devez convertir votre programme en sorts pour être cohérent. ncurses efface également votre écran, ce qui effraie généralement un utilisateur habitué à exécuter uniquement des programmes qui défilent uniquement. – Dmitry