2013-11-09 27 views
10

Tôi đang tạo ứng dụng bảng điều khiển trong C. Đây là trò chơi trong đó các ký tự rơi xuống và người dùng phải bấm phím cụ thể đó trên bàn phím. Tôi không biết làm thế nào để phát hiện những phím được nhấn bởi người sử dụng mà không cần tạm dừng các ký tự rơi xuống. Khi tôi sử dụng scanf chương trình chờ đợi cho đầu vào và tất cả mọi thứ tạm dừng. Xin hãy giúp tôi sớm!Nhập bàn phím liên tục trong C

+0

này thực sự thú vị .. mong một số câu trả lời – sukhvir

+0

http://stackoverflow.com/a/13035523/1119701 – ouah

+0

Is có cách nào khác để làm điều này mà không cần ncurses – sukhvir

Trả lời

6

Có một chức năng gọi là kbhit() hoặc _kbhit đó là trong thư viện <conio.h> nó trả true hoặc false tùy dù một phím được nhấn. Vì vậy, bạn có thể đi với một cái gì đó như thế này:

while (1){ 
    if (_kbhit()) 
     key_code = _getch(); 
     // do stuff depending on key_code 
    else 
     continue; 

Cũng sử dụng getch() hoặc _getch mà đọc một nhân vật trực tiếp từ giao diện điều khiển và không phải từ bộ đệm. Bạn có thể đọc thêm về các chức năng conio.hhere chúng có thể rất hữu ích cho những gì bạn muốn làm.

Lưu ý: conio.h không phải là thư viện chuẩn và việc triển khai có thể thay đổi từ trình biên dịch sang trình biên dịch.

+0

với getch() trò chơi của tôi vẫn tạm dừng và đợi cho đầu vào. Tôi chỉ không cần nhấn phím enter sau khi nhập char. Đó không phải là vấn đề! – zaingz

+1

@zaingz đó là lý do bạn phải sử dụng 'if (kbhit())' để nó "chờ" chỉ khi có điều gì đó được nhấn. Nhưng bởi vì nó đã được nhấn khi nói đến 'key_code = getch();' nó đọc chìa khóa đã được nhấn. –

+0

Cảm ơn rất nhiều ...Điều này thực sự đã giúp tôi. Một mẹo cho những người sử dụng Visual studio nên thêm dấu gạch dưới "_" vào đầu mỗi chức năng conio. tức là: _kbhit() và _getch() – zaingz

4

Bạn có thể tìm kiếm ncurses

ncurses (lời nguyền mới) là một thư viện lập trình cung cấp một API cho phép các lập trình viên để viết giao diện người dùng dựa trên văn bản một cách terminal độc lập. Nó là một bộ công cụ để phát triển phần mềm ứng dụng "GUI-like" chạy dưới trình giả lập thiết bị đầu cuối.

Ngoài ra kiểm tra C/C++: Capture characters from standard input without waiting for enter to be pressed

#include <conio.h> 

if (kbhit()!=0) { 
    cout<<getch()<<endl; 
} 
+0

nó có thể được thực hiện mà không cần ncurses không? – sukhvir

+0

Không chắc chắn lắm nhưng nếu nó đã được cho việc thực hiện đồ họa sau đó nó có thể được thực hiện bằng cách sử dụng SDL –

+0

ncurses là không khả thi. Không có bất kỳ điều gì trong thư viện windows.h? – zaingz

1

Tôi nghĩ đây có thể là đầu vào bàn phím không chặn mà bạn đang tìm kiếm.

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 

Và đối với các ký tự rơi xuống .. ở đây bạn đi.

The Matrix falling numbers

Mã vì nếu bạn đang ở trên 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); 
} 
Các vấn đề liên quan