2015-06-08 2 views
1

В настоящее время я делаю игру на C++. У меня есть ниже функции таймера:Реализация таймера в C++

void timer(int &s , int &m , bool a) 
{ 
    while (a) 
    { 
     Sleep(1000); 
     if (s%60) 
     m+=1; 
     s+=1; 
    } 
} 

Вот функция для игры:

void game() 
{ 
    int s = 0 , m = 0; 
    char a[]="Computers"; 
    char b[10]; 
    timer(s,m,true); 
    while (strcmpi(a,b)!=0) 
    { 
     cout<<"Guess the word:"; 
     gets(b); 
    } 
    timer(s,m,false); 
    cout<<"You got it correct!\n"; 
    cout<<"Time taken : "<<m<<':'<<s<<endl; 
} 

Когда я запускаю программу, ничего не происходит. Я предполагаю, что таймер работает и не разрешает выполнение цикла while в game().

Так что в основном я пытаюсь выяснить время, которое пользователь предпринимает, чтобы правильно угадать слово.

Как я могу решить эту проблему?

Заранее спасибо :)

+1

'while (true)' ??? – Bastien

+0

Ваше предположение верно: таймер работает и не разрешает выполнение цикла while в игре(). –

+1

Когда вы говорите 'таймер в C++', люди ожидают' std :: chrono' и все. – iammilind

ответ

3

Если все, что вы хотите, это время, сделайте таймер. Спросите, в какое время это время, когда пользователь запускает, сохраняет его и вычитает время начала с момента завершения пользователем.

void game() 
{ 
    int s = 0 , m = 0; 
    char a[]="Computers"; 
    char b[10]; 
    time_t start = time(NULL); <<<< Modification here 
    while (strcmpi(a,b)!=0) 
    { 
     cout<<"Guess the word:"; 
     gets(b); 
    } 
    cout<<"You got it correct!\n"; 
    time _t taken = time(NULL) - start; 
    m = taken/60; <<<< Modification here 
    s = taken % 60; <<<< Modification here 
    cout<<"Time taken : "<< m <<':'<<s<<endl; 
} 

Если разрешено заданием, рассмотреть вопрос о замене char S A и B с string S A и B. Пользователь не может переполнять строку и накладывать хаос на вашу программу так, как они могут, с массивами символов и gets.

void game() 
{ 
    int s = 0 , m = 0; 
    std::string a ="Computers"; <<<< Modification here 
    std::string b; <<<< Modification here 
    time_t start = time(NULL); 
    do 
    { 
     cout<<"Guess the word:"; 
     cin>> b; <<<< Modification here 
    } while (a != b); <<<< Modification here. No sense testing b before you read b 
    cout<<"You got it correct!\n"; 
    time _t taken = time(NULL) - start; 
    m = taken/60; 
    s = taken % 60; 
    cout<<"Time taken : "<< m <<':'<<s<<endl; 
} 
+0

Спасибо большое :) Пробовал это раньше, но я не мог заставить его работать! –

+0

Не могли бы вы объяснить, почему вы передаете параметр NULL во времени() –

+0

Личные предпочтения. Вы получаете то же время с указателем или возвращаетесь. С возвращенным значением я могу сразу использовать время в вычислениях и не иметь временную переменную, зависающую вокруг. – user4581301

3

Ваш код будет блокировать на while(true). Пожалуйста, подумайте об использовании std::chrono.

void game() 
{ 
    int s = 0 , m = 0; 
    char a[]="Computers"; 
    char b[10]; 
    auto start = chrono::steady_clock::now(); 
    while (strcmpi(a,b)!=0) 
    { 
     cout<<"Guess the word:"; 
     gets(b); 
    } 
    auto time_elapsed = chrono::steady_clock::now() - start; 
    cout<<"You got it correct!\n"; 
    cout<<"Time taken : " << std::chrono::duration_cast<std::chrono::seconds> 
         (time_elapsed).count() << " s"<<endl; 
} 
+0

ОК? так как я могу реализовать потоки? –

+0

@MohitBhasi см. Мое редактирование – Bastien

+0

Спасибо большое, но я все еще новичок в C++ –

1

Вы можете использовать файл заголовка time.h для измерения временного кода elapsed.Your можно б так:

#include<time.h> 
void game() 
{ 
int s = 0 , m = 0; 
char a[]="Computers"; 
char b[10]; 
clock_t start, end; 
double time_used; 
// timer(s,m,true); comment out this line 
start = clock(); 
while (strcmpi(a,b)!=0) 
    { 
    cout<<"Guess the word:"; 
    gets(b); 
    } 
    end = clock(); 
time_used = ((double) (end - start))/CLOCKS_PER_SEC; 
timer(s,m,false); 
cout<<"You got it correct!\n"; 
cout<<"Time taken : "<<time_used<<" seconds"<<endl; 

}

Для получения дополнительной информации о time.h файле заголовка см это link

+1

Спасибо большое :) –

3

Вы можете использовать функции Chrono:

#include <chrono> 

using namespace chrono; 

auto a = high_resolution_clock::now(); 

... what you want to measure ... 

auto b = high_resolution_clock::now(); 

cout << "took " << duration_cast<seconds>(b - a).count() << << " seconds" << endl; 
+0

Спасибо, но я все еще новичок на C++, поэтому хотел бы придерживаться основ –

+0

Тем более, что вы новичок, вы должны использовать простые в использовании средства, такие как хронограф, они более высокого уровня, более безопасны и более мощный. –

Смежные вопросы