2010-12-08 45 views
0

Je suis en train d'écrire un programme en C++ très similaire au programme classique "snake" avec quelques changements. Je l'écris de sorte qu'il mettra à jour l'écran cinq fois par seconde, basé sur ctime, peut-être plus s'il peut être manipulé. Une chose que je voudrais faire est de faire en sorte que le programme ait une variable dans le fichier .h "currkeypressed". Cette variable contiendra la clé que l'utilisateur maintient actuellement et la tête du serpent ira dans cette direction. Chaque nœud dans le serpent sera un objet séparé de sorte que le currkeypressed affectera seulement la tête. Les données directionnelles et de localisation seront transmises par le serpent d'un nœud à l'autre à chaque mise à jour.Comment accepter les saisies au clavier en direct?

Ma question est: comment puis-je obtenir le programme de garder ces données en permanence, plutôt que de mettre à jour seulement avec cin lorsque la touche est enfoncée ou à un certain intervalle? Je sais que je peux accepter la valeur ASCII pour les touches fléchées dans une sorte de boucle for, mais cela ne semble pas fonctionner si la touche est maintenue enfoncée et si la boucle est très longue, elle peut manquer une pression. Est-ce que quelqu'un sait comment faire cela?

EDIT: J'utilise un système d'exploitation Linux, Ubuntu pour être plus précis

Répondre

1

La méthode la plus simple consiste à utiliser la bibliothèque ncurse.

Cependant, si vous préférez la programmation linux « brut », vous pouvez utiliser select et getchar:

#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() { 
     fd_set readfs; 
     struct timeval timeout; 
     int res, key; 

     while (1) { 
     /* .. do something else .. */ 

     FD_SET(0, &readfs); /* 0 is STDIN */ 
     timeout.tv_usec = 10; /* milliseconds */ 
     timeout.tv_sec = 0; /* seconds */ 
     res = select(maxfd, &readfs, NULL, NULL, &timeout); 
     if (res) { 
      /* key pressed */ 
      key = getchar(); 
      if (key == 'A') { /* blar */ } 
     } 
     } 
} 
+0

Je suis assez sûr que usec signifie microseconde (pas milliseconde). Je dis cela à cause de la page de manuel pour le sommeil. –

+0

erreur: 'maxfd' non déclaré (première utilisation dans cette fonction) –

1

Une fois que vous êtes à la recherche au-delà de simple ligne orientée ou caractère entrée orient, vous êtes dans les détails du dispositif d'entrée utilisateur. Chaque système d'exploitation a un mécanisme particulier pour notifier un programme d'événements comme le keydown et le keyup.

Pour obtenir une réponse, ajoutez une balise pour quel environnement de programmation que vous êtes: MSWindows, Linux, Android, MacOS, etc.

+0

modifié. Système d'exploitation Linux –

+0

S'agit-il de XWindows, de Gnome ou d'une fenêtre de terminal standard? – wallyk

+0

Terminal. J'ai écrit l'algorithme de sorte que la "nourriture" du serpent apparaisse sur l'écran en tant que périodes, la tête du serpent est un @, et le corps est un groupe de o (s). –

-1

Le plus simple (mais vraiment pas aussi simple que cela) façon serait d'avoir un fil pour capturer l'entrée de l'utilisateur, puis avoir une sorte de système piloté par les événements qui peut alerter la tête du serpent ou le serpent peut interroger la clé actuelle.

0

Vous pouvez utiliser la bibliothèque conio.h et vous pouvez utiliser la fonction _getch() dans une boucle pour obtenir en direct entrée sans aucune restriction.

#include<conio.h> 
#include<iostream> 
using namespace std; 
int main() 
{ 
    char n='a';//Just for initialization 
    while(n!='e') 
    { 
     n=_getch(); 
    } 
    return 0; 
} 
+0

si ma méthode a fonctionné pour vous s'il vous plaît voter pour elle et laissez-moi maintenant s'il y a un autre problème :) – Weaboo