我正在尝试制作一个可以继续运行直到按下某个键的游戏,然后它应该将其拿进去并对其进行操作,然后继续正常运行。我该怎么做呢?
我在使用MAC,因此即使遇到了一个名为conio.h的Windows库,该库可以使用kbhit()和getch()来处理此问题,但我无法使其正常工作...
//
// main.c
// conioTesting
//
//
#include <stdio.h>
#include "myconio_mac.h"
int main(int argc, const char * argv[]) {
int counter = 0;
while (counter < 2) {
if (kbhit()) {
char key = getch();
printf("\n Key is %c \n", key);
printf("Keyboard hit detected \n");
} else {
printf("Nothing. \n");
}
}
printf("Passed!!!!!!!!!! \n");
}
在MAC上,您需要弄乱终端设置以关闭线路缓冲。(您也可以关闭echo。)正确设置了终端之后,就可以用来read
从键盘上获取单个字符。
在下面的示例代码中,该kbsetup
功能负责终端设置。该getkey
功能检查是否有按键按下,并返回按键(如果有)或未'\0'
读取任何按键。该main
函数具有一个循环,该循环每秒打印一次时间,并打印用户按下的任何键。按'q'
退出程序。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <termios.h>
#include <unistd.h>
static struct termios oldSettings;
void kbcleanup( void )
{
tcsetattr( 0, TCSAFLUSH, &oldSettings ); /* restore old settings */
}
void kbsetup( void )
{
tcgetattr( 0, &oldSettings );
struct termios newSettings = oldSettings;
newSettings.c_lflag &= ~ICANON; /* disable line-at-a-time input */
newSettings.c_lflag &= ~ECHO; /* disable echo */
newSettings.c_cc[VMIN] = 0; /* don't wait for characters */
newSettings.c_cc[VTIME] = 0; /* no minimum wait time */
if ( tcsetattr( 0, TCSAFLUSH, &newSettings ) == 0 ){
atexit( kbcleanup ); /* restore the terminal settings when the program exits */
} else {
fprintf( stderr, "Unable to set terminal mode\n" );
exit( 1 );
}
}
int getkey( void )
{
char c;
if ( read( STDIN_FILENO, &c, 1 ) == 0 )
return '\0';
else
return c;
}
int main( void )
{
int c;
kbsetup();
time_t start = time( NULL );
time_t previous = start;
for (;;)
{
usleep( 1000 );
time_t current = time( NULL );
if ( current != previous )
{
fprintf( stderr, "tick %3ld\r", current - start );
previous = current;
}
else if ( (c = getkey()) != '\0' )
{
if ( c == 'q' || c == 'Q' )
break;
printf( "\ngot char: 0x%02x", c );
if ( isprint( c ) )
printf( " '%c'", c );
printf( "\n" );
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句