关于VC6.0绘图,循环N次后崩溃的问题。
我在编写一个俄罗斯方块游戏。用到了循环绘图。在程序循环到几十次之后,出现问题,导致程序崩溃.我想是不是myPaint2()中内存溢出的问题.请各位高手指点一下,万分感谢.
我的程序循环部分是这样的:
// Main message loop:消息循环
while (msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GameMain(); //游戏循环主函数
}
}
//********************************************************
void GameMain()//游戏主循环函数体
{
tNow=GetTickCount(); //取当前时间
if((tNow-tPre)>=20)//当当前时间和前一次绘图是所去取时间tPre的差值大于等于所设的速度时
{
QingChu(); //调用清除满行函数
SorceJiSuan(); //计算分数
myPaint2(hdc);
XiaLuoSign++;//一个信号量,作用是,实现每循环SPEED次,方块下落一格.
tPre=GetTickCount();
}
if(XiaLuoSign==SPEED)
{
if(XiaLuo()) //调用下落函数,并判断下落是否成功
{
myPaint2(hdc);//下落成功,绘图
XiaLuoSign=0;
}
else
{
RebuildDaDiTu(); //不成功,重新设置大地图
if(m!=2)
{
if(NewFall()) //新设方块,并判断是否成功
SaveSorce(); //不成功,调用分数保存函数。并显示游戏结束
m=2;
TextOut(hdc,280,180,"游戏结束!",strlen("游戏结束!"));
}
}
myPaint2(hdc);
XiaLuoSign=0;
}
}
}
//绘图函数
void myPaint2(HDC hdc)
{
HDC bufdc;//用于消除闪烁的缓存
HBITMAP bufmap;
char str[30]="";//用于保存输出分数的字符串
bufdc=CreateCompatibleDC(hdc);
bufmap=CreateCompatibleBitmap(hdc,450,450);
SelectObject(bufdc,bufmap);
hBru1=CreateSolidBrush(RGB(255,255,255));
SelectObject(bufdc,hBru1);
Rectangle(bufdc,0,0,450,450);
//显示游戏状态,是两个文字输出函数
if(m==0)
TextOut(bufdc,280,180,"准备游戏!",strlen("准备游戏!"));
else if(m==1)
TextOut(bufdc,280,180,"正在游戏!",strlen("正在游戏!"));
else
TextOut(bufdc,280,180,"游戏结束!",strlen("游戏结束!"));
hBru1=CreateSolidBrush(RGB(255,255,255));
SelectObject(bufdc,hBru1);
for(int i=1;i<=14;i++)
{
for(int j=3;j<=12;j++)
{
if(DaDiTu[i][j]==0)
{
Rectangle(bufdc,40+20*(j-3),40+20*(i),60+20*(j-3),60+20*(i));
}
}
}
for(i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(XiaoHeZiNext[i][j]==0)
Rectangle(bufdc,280+j*20,40+i*20,300+j*20,60+i*20);
}
}
hBru1=CreateSolidBrush(RGB(72,118,225));
SelectObject(bufdc,hBru1);
for( i=1;i<=14;i++)
{
for(int j=3;j<=12;j++)
{
if(DaDiTu[i][j]==1)
{
Rectangle(bufdc,41+20*(j-3),41+20*(i),59+20*(j-3),59+20*(i));
}
}
}
hBru1=CreateSolidBrush(RGB(255,48,48));
SelectObject(bufdc,hBru1);
for(i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(XiaoHeZiNext[i][j]==1)
Rectangle(bufdc,281+j*20,41+i*20,299+j*20,59+i*20);
}
}
hBru1=CreateSolidBrush(RGB(72,118,225));
for(i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(XiaoHeZiNow[i][j]==1)
{
SelectObject(bufdc,hBru1);
Rectangle(bufdc,41+(DangQianY-3)*20+20*j,41+(DangQianX+i)*20,59+(DangQianY-3)*20+20*j,59+(DangQianX+i)*20);
}
}
}
sprintf(str,"最好成绩:%d ",BestSorce);
TextOut(bufdc,280,200,str,strlen(str));
sprintf(str,"本次成绩:%d ",SorceNow);
TextOut(bufdc,280,280,str,strlen(str));
BitBlt(hdc,0,0,450,450,bufdc,0,0,SRCCOPY);
DeleteDC(bufdc);
DeleteObject(bufmap);
}