1

ユーザーが一定時間内に文字列を入力する必要がある場合、コンソール ゲームを作成するにはどうすればよいですか? (関数を使用しようとしましたSleepが、画面が一定時間フリーズします。これは望ましくありません

例:ポップクイズ

4

2 に答える 2

1

これはマルチスレッドなしで実行できると思います(タイマーの非常に単純なバージョン)

次のようなものを書き、必要に応じて変更してみてください。

コードは完全ではないことに注意してください。ニーズに合わせて編集する必要があります。ただし、これでアイデアが得られるはずです。

int main() 
{   
   time_t begin, end;
   char input;
   bool flag = true;
   begin = time();
   while (flag) 
   {
      if(kbhit()) 
         ch = getch();
      end = time();
      if(difftime(end, begin) > NEEDED_TIME_IN_SECONDS) 
        flag = false;  //The user didn't enter it in within the wanted period of time
    }
}

いくつかのドキュメント:

  • double difftime(time_t time2, time_t time1) 2 つの時刻の差を返す time1 と time2 の差を秒単位で計算します。
  • getch()ユーザーに文字を押すように促しますが、その文字は画面に表示されません。
  • kbhit()キーがキーボード バッファにある場合、ゼロ以外の整数を返します。キーが押されるのを待ちません。
于 2012-11-24T12:24:38.987 に答える
0

Windows を使用している場合は、次のコードを試してください。

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#include <string>
#include <iostream>
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
#define KB_ENTER 13

unsigned int x_hours=0;
unsigned int x_minutes=0;
unsigned int x_seconds=0;
unsigned int x_milliseconds=0;
unsigned int totaltime=0,count_down_time_in_secs=0,time_left=0;
clock_t x_startTime,x_countTime;
int KeyBoard_code,input_count=0;
int caret_x=0,caret_y=0;
char keyboard_buffer[100]={' '};
char answer_buffer[100]={' '};
char correct_answer[ ]="foo bar";

int is_from_keyboard(int ch);
void  start_timer();
void  delta_time_update_timer();
void gotoxy(int x, int y);
void clrscr(void);
void setcolor(WORD color); 
void keyboard_input();

int main ()
{

    count_down_time_in_secs= 4;  // 1 minute is 60sec (60x1min), 1 hour is 3600 (60x60min)

    start_timer();
    delta_time_update_timer();

    gotoxy(1 , 2);  
    printf( "\nWhat is the answer to the  bla bla of bla bla?  ");
    gotoxy(1,5);printf( "Answer? >");


    while (time_left>0) 
    {
        keyboard_input();
        delta_time_update_timer();
    }

    gotoxy(1 , 12);
    printf( "\n\n\nTime's out\n\n\n");

return 0;
}



void  start_timer()
{
    x_startTime=clock();  // start clock
}

void  delta_time_update_timer()
{
    x_countTime=clock(); // update timer difference
    x_milliseconds=x_countTime-x_startTime;
    x_seconds=(x_milliseconds/(CLOCKS_PER_SEC))-(x_minutes*60);
    x_minutes=(x_milliseconds/(CLOCKS_PER_SEC))/60;
    x_hours=x_minutes/60;
    time_left=count_down_time_in_secs-x_seconds;   // update timer


        gotoxy(1 , 1);
        printf( "\nYou have %d seconds left  ",time_left,count_down_time_in_secs);
        gotoxy(1,5);

}


void keyboard_input()
{
    if (kbhit())
      {
            KeyBoard_code = getch();

            caret_x++;
            gotoxy(10+caret_x,5+caret_y);
            printf( "%c",KeyBoard_code);
            input_count++;
            keyboard_buffer[input_count]=(char)KeyBoard_code;


            switch (KeyBoard_code)
            {

                case KB_ESCAPE:


                break;

                case KB_ENTER:

                    memcpy(answer_buffer, keyboard_buffer,sizeof(keyboard_buffer));

                    gotoxy(1 ,7);
                    printf( "Your answer is  %s ",answer_buffer);   


                    gotoxy(1,5);printf( "Answer? >              ");
                    gotoxy(1 ,9);
                    printf( "The correct answer is %s ", correct_answer);
                    caret_x=0;
                    input_count=0;
                    start_timer();
                    count_down_time_in_secs= 7;
                    delta_time_update_timer();
                    memset(keyboard_buffer,32,sizeof(keyboard_buffer));
                    memset(answer_buffer,32,sizeof(answer_buffer));

                break;

                case KB_LEFT:

                break;



                case KB_RIGHT:

                  break;

                case KB_UP:

                break;

                case KB_DOWN:

                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);
}



int is_from_keyboard(int ch)
{

    if ( ch>=31 && ch<128) return 1;
    else return -1;

}
于 2012-11-24T14:35:19.760 に答える