2012-08-22 3 views
2

생명의 게임을 시뮬레이트하는 프로그램을 작성했습니다. 기본적으로 세계는 bool의 2 차원 std :: vector로 구현됩니다. bool이 true이면 셀은 활성 상태이고 false이면 셀이 종료됩니다. 이 프로그램의 출력은 완전히 ASCII 코드로, 각 시간 단계에서 시스템 :터미널에서 C++ 출력 속도가 느려짐

[ ][0][ ] 
[ ][ ][0] 
[0][0][0] 

문제는 프로그램이 분명히 빠른 실행 때마다 단계가 너무 빨리 인쇄되어 있다는 것입니다 : 내가 볼 수없는 방법 시스템이 진화합니다. 출력 (또는 직접 프로그램) 속도를 늦출 수있는 트릭이 있습니까?

편집 : Mac OS X 10.7입니다. 제 컴파일러는 GCC 4.7입니다.

+5

에 담기는 과정을 시각화 할 수 있습니다. 수면은 사용중인 OS에 따라 다릅니다. – mathematician1975

+0

결국 출력물을 그래픽 화면의 '뚱뚱한'픽셀로 전개 할 수 있습니다. 그래픽 작업을 수행하는 데 좋은 연습을하는 것 외에도 시각적으로 진화를 볼 수 있습니다. 때로는 기관총 생명 모델과 같은 환상적인 그래픽을 만들어내는 경우도 있습니다. 뚱뚱한 화소 BTW는 당신의 격자에 단 하나 실재물을 대표하는 화소의 4x4 산출 같이이다. 뚱뚱한 픽셀 후에는 스프라이트를 시도해 볼 수 있습니다. 이제는 번창하거나 죽어 사라지는 노화 생물을줍니다. :) –

답변

2

당신은 표준 C++ (C++ 11)를 사용할 수 있습니다. OS X에는 Grand Central Dispatch (a.k.a. libdispatch)가 있습니다. GCD를 사용하면 지정한 주파수로 그리기 기능을 호출하는 디스패치 타이머 소스를 만들 수 있습니다. 연속 업데이트 사이에 sleep 명령에

dispatch_source_t timer = dispatch_source_create(
    DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); 

dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 
    duration_cast<nanoseconds>(milliseconds(20)).count(), 
    duration_cast<nanoseconds>(milliseconds(5)).count()); 
// the API is defined to use nanoseconds, but I'd rather work in milliseconds 
// so I use std::chrono to do the conversion above 

dispatch_source_set_event_handler(timer, 
    []{ your_draw_function(); }); 
// I'm not sure if GCC 4.7 actually supports converting C++11 lambdas to 
// Apple's C blocks, or if it even supports blocks. Clang supports this. 

dispatch_resume(timer); 

dispatch_main(); 

libdispatch reference

+0

C++ 표준 라이브러리의 첫 번째 옵션을 좋아합니다. 고맙습니다. –

1

사용중인 시스템에 관계없이 지정된 시간 동안 프로그램을 일시 중단시키는 수면 기능이 있습니다. 당신은 어떤 OS를 사용 하는지를 지정하지 않으므로 정확한 세부 정보는 제공하지 않지만 찾고자하는 접근 방식처럼 들립니다.

이미지의 각 업데이트를 그린 후 특정 시간 동안 절전 모드를 호출하면 프로그램이 그 시간 동안 잠자기 상태가되어 다음 업데이트를 다시 시작하고 그림을 그립니다. 이

+0

저는 Mac OS X 10을 사용합니다.7 –

+0

Max OS X를 사용하지는 않지만이 링크는 도움이 될 것입니다. http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/sleep.3.html – mathematician1975

+0

명령으로 사용했습니다. 줄을 'sleep 5'로, 프롬프트는 5 초 동안 사라졌다. C++ 프로그램에서 어떻게 사용합니까? –

0

1.You는

int tmp; std::cin >> tmp; 

사용할 수 있습니다 실제로 변경

더 높은 해상도 시간 수면은 nanosleepusleep 볼 수 있습니다 원하는 경우를 참조 할 수있는 기회를 제공해야하며, 프로그램은 전에 요청합니다 더 나아가 야지.

2. 일부 계산에서 루프를 사용할 수 있습니다. Like

double Tmp[1000000]; 
for(int i = 0; i < 1000000; i++) 
    Tmp[i] = i; 
for(int i = 0; i < 1000000; i++) 
    Tmp[i] = sin(sin(sin(Tmp[i]))); 

3. 사용할 수있는 지연 기능을 확인할 수 있습니다. 예 : "절전 (n 초)"here

4. 시스템 시간을 저장하고 확인할 수 있습니다. 마찬가지로 :

#include <thread> 
#include <chrono> 
#include <iostream> 

int main() { 
    while (true) { 
     // draw loop 
     std::this_thread::sleep_for(std::chrono::milliseconds(20)); 
    } 
} 

또는 당신이 당신의 그리기 함수를 호출하는 시점의 간격을 지정할 수 있습니다 라이브러리를 사용할 수 있습니다

while (time() < time_end){}; 
관련 문제