M
Mariyka
Сразу к сути. Есть программа - игра "Спички".
на экране рисуем определённое кол-во спичек. Человек играет против компа. Пользователь выбирает кол-во спичек, которое следует убрать, затем "обновляем" экран, ход компа.
Проблема в том, что спички убираются СРАЗУ ЖЕ и те, которые выбрал пользователь и комп. Между этими действиями требуется сделать задержку по времени.
Использую следующую функцию таймера:
<!--shcode--><pre><code class='# CPP'>void WaitTimer(int time)
{
int period=0;
LARGE_INTEGER milsec1;
LARGE_INTEGER milsec2;
QueryPerformanceCounter(&milsec1);
LARGE_INTEGER tactInsec;
int tactInMicsec;
QueryPerformanceFrequency(&tactInsec);
tactInMicsec=tactInsec.QuadPart/1000;
while(period<time)
{
QueryPerformanceCounter(&milsec2);
period=milsec2.QuadPart/tactInMicsec-milsec1.QuadPart/tactInMicsec;
}
}[/CODE]
Но задержка не работает.
В чём кроется причина, помогите решить проблему, очень надо.. впрочем, как всегда..
кусок исходника тут:
<!--shcode--><pre><code class='# CPP'>void CSpichkiView::OnLButtonDown(UINT nFlags, CPoint point) // нажатие на левую кнопку мыши
{
CSpichkiDoc* pDoc = GetDocument(); // получение указателя на класс CDocument
ASSERT_VALID(pDoc);
CRect rc;
rc.SetRect(30,300,120,330);
if(rc.PtInRect(point)) // если нажали на первую кнопку
{
if(pDoc->numSpichek==1)
{
pDoc->numSpichek-=1;
Invalidate();
WaitTimer(1000); //таймер!!
MessageBox("You win!");
pDoc->StartNewGame();
}
else
{
pDoc->numSpichek--;
Invalidate();
WaitTimer1(1000);
if(pDoc->computerStep()==true) // шаг компьютера
{
Invalidate();
MessageBox("You lose!");
pDoc->StartNewGame();
}
else {
Invalidate();
}
}[/CODE]
кстати, если сразу после вызова функции таймера поставить MessageBox, после закрытия этого мессаджбокса таймер работает!!!
И ещё используемый метод computerStep(), на всякий случай выкладываю:
<!--shcode--><pre><code class='# CPP'>bool CSpichkiDoc::computerStep() // шаг компа
{
SetModifiedFlag(1); // взводим флаг того, что документ не сохранен - чтобы при выходе спрашивал "сохранить или нет"
int x;
if(numSpichek==1||numSpichek==2||numSpichek==3) // если осталось 3 2 или 1 спичка - комп выиграл
return true;
x=rand()%3;
if(x==0)
numSpichek--;
if(x==1)
numSpichek-=2;
if(x==2)
numSpichek-=3;
return false;
}[/CODE]
Прилагаю архив проекта без добавления таймера, указанного выше..
на экране рисуем определённое кол-во спичек. Человек играет против компа. Пользователь выбирает кол-во спичек, которое следует убрать, затем "обновляем" экран, ход компа.
Проблема в том, что спички убираются СРАЗУ ЖЕ и те, которые выбрал пользователь и комп. Между этими действиями требуется сделать задержку по времени.
Использую следующую функцию таймера:
<!--shcode--><pre><code class='# CPP'>void WaitTimer(int time)
{
int period=0;
LARGE_INTEGER milsec1;
LARGE_INTEGER milsec2;
QueryPerformanceCounter(&milsec1);
LARGE_INTEGER tactInsec;
int tactInMicsec;
QueryPerformanceFrequency(&tactInsec);
tactInMicsec=tactInsec.QuadPart/1000;
while(period<time)
{
QueryPerformanceCounter(&milsec2);
period=milsec2.QuadPart/tactInMicsec-milsec1.QuadPart/tactInMicsec;
}
}[/CODE]
Но задержка не работает.
В чём кроется причина, помогите решить проблему, очень надо.. впрочем, как всегда..
кусок исходника тут:
<!--shcode--><pre><code class='# CPP'>void CSpichkiView::OnLButtonDown(UINT nFlags, CPoint point) // нажатие на левую кнопку мыши
{
CSpichkiDoc* pDoc = GetDocument(); // получение указателя на класс CDocument
ASSERT_VALID(pDoc);
CRect rc;
rc.SetRect(30,300,120,330);
if(rc.PtInRect(point)) // если нажали на первую кнопку
{
if(pDoc->numSpichek==1)
{
pDoc->numSpichek-=1;
Invalidate();
WaitTimer(1000); //таймер!!
MessageBox("You win!");
pDoc->StartNewGame();
}
else
{
pDoc->numSpichek--;
Invalidate();
WaitTimer1(1000);
if(pDoc->computerStep()==true) // шаг компьютера
{
Invalidate();
MessageBox("You lose!");
pDoc->StartNewGame();
}
else {
Invalidate();
}
}[/CODE]
кстати, если сразу после вызова функции таймера поставить MessageBox, после закрытия этого мессаджбокса таймер работает!!!
И ещё используемый метод computerStep(), на всякий случай выкладываю:
<!--shcode--><pre><code class='# CPP'>bool CSpichkiDoc::computerStep() // шаг компа
{
SetModifiedFlag(1); // взводим флаг того, что документ не сохранен - чтобы при выходе спрашивал "сохранить или нет"
int x;
if(numSpichek==1||numSpichek==2||numSpichek==3) // если осталось 3 2 или 1 спичка - комп выиграл
return true;
x=rand()%3;
if(x==0)
numSpichek--;
if(x==1)
numSpichek-=2;
if(x==2)
numSpichek-=3;
return false;
}[/CODE]
Прилагаю архив проекта без добавления таймера, указанного выше..