Sto creando un'applicazione console in C. Questo è un gioco in cui i personaggi stanno cadendo e l'utente deve premere quel tasto specifico sulla tastiera. Non so come rilevare quale tasto viene premuto dall'utente senza mettere in pausa i caratteri che cadono. Quando uso scanf, il programma attende l'input e tutto si ferma. Per favore aiutatemi presto!Ingresso tastiera continuo in C
risposta
C'è una funzione chiamata kbhit()
o _kbhit
è nella biblioteca <conio.h>
restituisce true
o false
a seconda se una chiave è stato colpito. Così si può andare con qualcosa di simile:
while (1){
if (_kbhit())
key_code = _getch();
// do stuff depending on key_code
else
continue;
Anche utilizzare getch()
o _getch
che legge un carattere direttamente dalla console e non dal buffer. Puoi leggere di più sulle funzioni conio.h
here potrebbero essere molto utili per quello che vuoi fare.
Nota: conio.h
non è una libreria standard e le implementazioni possono variare dal compilatore al compilatore.
con getch() il mio gioco è ancora in pausa e attende input. Non ho bisogno di premere il tasto Invio dopo aver inserito un carattere. Non è questo il problema! – zaingz
@zaingz è il motivo per cui devi usare 'if (kbhit())' in modo che "aspetta" solo se qualcosa è stato premuto. Ma perché era già stato premuto quando si trattava di 'key_code = getch();' legge il tasto premuto. –
Grazie mille ...Questo mi ha davvero aiutato. Un consiglio per chi usa Visual Studio dovrebbe aggiungere il carattere di sottolineatura "_" all'inizio di ogni funzione conio. vale a dire _kbhit() e _getch() – zaingz
Si può probabilmente cercare ncurses
ncurses (nuove maledizioni) è una libreria di programmazione che fornisce un'API che permette al programmatore di scrivere basati su testo interfacce utente in modo indipendente dal terminale. È un toolkit per lo sviluppo di un software applicativo "tipo GUI" che gira sotto un emulatore di terminale.
controllare anche C/C++: Capture characters from standard input without waiting for enter to be pressed
#include <conio.h>
if (kbhit()!=0) {
cout<<getch()<<endl;
}
Penso che questo potrebbe essere l'input da tastiera non bloccante che stai cercando.
void simple_keyboard_input() //win32 & conio.h
{
if (kbhit())
{
KB_code = getch();
//cout<<"KB_code = "<<KB_code<<"\n";
switch (KB_code)
{
case KB_ESCAPE:
QuitGame=true;
break;
}//switch
}//if kb
}//void
E per quanto riguarda i personaggi che cadono ... ecco qua.
Codice in materia, se siete su Windows:
/* The Matrix falling numbers */
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
using namespace std;
#define KB_UP 72
#define KB_DOWN 80
#define KB_LEFT 75
#define KB_RIGHT 77
#define KB_ESCAPE 27
#define KB_F8 66
/* Variables*/
char screen_buffer[2000]={' '};
int y_coord[2000]={0};
int x=0, y=0,dy=0;
int XMAX=77;
int YMAX=23;
int KB_code=0;
bool QuitGame=false;
int platformX=35, platformY=23;
/* function prototypes*/
void gotoxy(int x, int y);
void clrscr(void);
void setcolor(WORD color);
void simple_keyboard_input();
void draw_falling_numbers();
void draw_platform();
/* main */
int main(void)
{
/* generate random seed */
srand (time(NULL));
/* generate random number*/
for(int i=0;i<XMAX;i++) y_coord[i]= rand() % YMAX;
while(!QuitGame)
{
/* simple keyboard input */
simple_keyboard_input();
/* draw falling numbers */
draw_falling_numbers();
}
/* restore text color */
setcolor(7);
clrscr();
cout<<" \n";
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}
/* functions */
void draw_falling_numbers()
{
for(x=0;x<=XMAX;x++)
{
/* generate random number */
int MatixNumber=rand() % 2 ;
/* update falling number */
y_coord[x]=y_coord[x]+1;
if (y_coord[x]>YMAX) y_coord[x]=0;
/* draw dark color */
setcolor(2);
gotoxy(x ,y_coord[x]-1); cout<<" "<<MatixNumber<<" ";
/* draw light color */
setcolor(10);
gotoxy(x ,y_coord[x]); cout<<" "<<MatixNumber<<" ";
}
/* wait some milliseconds */
Sleep(50);
//clrscr();
}
void draw_platform()
{
setcolor(7);
gotoxy(platformX ,platformY);cout<<" ";
gotoxy(platformX ,platformY);cout<<"ÜÜÜÜÜÜ";
setcolor(7);
Sleep(5);
}
void simple_keyboard_input()
{
if (kbhit())
{
KB_code = getch();
//cout<<"KB_code = "<<KB_code<<"\n";
switch (KB_code)
{
case KB_ESCAPE:
QuitGame=true;
break;
case KB_LEFT:
//Do something
platformX=platformX-4;if(platformX<3) platformX=3;
break;
case KB_RIGHT:
//Do something
platformX=platformX+4;if(platformX>74) platformX=74;
break;
case KB_UP:
//Do something
break;
case KB_DOWN:
//Do something
break;
}
}
}
void setcolor(WORD color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
return;
}
void gotoxy(int x, int y)
{
static HANDLE hStdout = NULL;
COORD coord;
coord.X = x;
coord.Y = y;
if(!hStdout)
{
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
}
SetConsoleCursorPosition(hStdout,coord);
}
void clrscr(void)
{
static HANDLE hStdout = NULL;
static CONSOLE_SCREEN_BUFFER_INFO csbi;
const COORD startCoords = {0,0};
DWORD dummy;
if(!hStdout)
{
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hStdout,&csbi);
}
FillConsoleOutputCharacter(hStdout,
' ',
csbi.dwSize.X * csbi.dwSize.Y,
startCoords,
&dummy);
gotoxy(0,0);
}
questo è in realtà interessante .. in attesa di qualche risposta – sukhvir
http://stackoverflow.com/a/13035523/1119701 – ouah
è C'è un altro modo per farlo senza ncurses – sukhvir