winmine.c
来自「应用win32编写的一个扫雷程序」· C语言 代码 · 共 857 行 · 第 1/3 页
C
857 行
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_TIMER: //处理计时
hdc=GetDC(hwnd);
countime++;
k=countime/100;
j=(countime%100)/10;
i=countime%10;
BitBlt(hdc,cxClient-34,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(i+1)*23,SRCCOPY);
BitBlt(hdc,cxClient-47,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(j+1)*23,SRCCOPY);
BitBlt(hdc,cxClient-60,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(k+1)*23,SRCCOPY);
PlaySound(TEXT("432.wav"),NULL,SND_FILENAME|SND_ASYNC);
ReleaseDC(hwnd,hdc);
return 0;
case WM_LBUTTONDOWN: //处理鼠标按下
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
ifind=0;
hdc=GetDC(hwnd);
SetRect(&rect2,10,50,10+iWidth*16,50+iHeight*16);
if(message==WM_MOUSEMOVE) //下次移动前恢复先前的砖块
{
if(doubledown==1)
{
if(NumLTBob[cxPostion][cyPostion][1]==0)
BitBlt(hdc,rect.left,rect.top,cxBitmap1,cyBitmap1,hdcMem1,0,0,SRCCOPY);
for(m=-1;m<=1;m+=2) //恢复了的情况
for(n=1;n>=-1;n-=2)
{
pt1.x=rect.left+m*cxBitmap1;pt1.y=rect.top+n*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+m][cyPostion+n][1]==0)
BitBlt(hdc, rect.left+m*cxBitmap1,rect.top+n*cyBitmap1 ,cxBitmap1,cyBitmap1,
hdcMem1,0, 16,SRCCOPY);
pt1.x=rect.left+n*cxBitmap1;pt1.y=rect.top+m*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+n][cyPostion+m][1]==0)
BitBlt(hdc, rect.left+n*cxBitmap1,rect.top+m*cyBitmap1 ,cxBitmap1,cyBitmap1,
hdcMem1,0,16,SRCCOPY);
pt1.x=rect.left-n*cxBitmap1;pt1.y=rect.top;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion-n][cyPostion][1]==0)
BitBlt(hdc, rect.left-n*cxBitmap1,rect.top,cxBitmap1,cyBitmap1,
hdcMem1,0,16,SRCCOPY);
pt1.x=rect.left;pt1.y=rect.top+n*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion][cyPostion+n][1]==0)
BitBlt(hdc, rect.left,rect.top+n*cyBitmap1 ,cxBitmap1,cyBitmap1,
hdcMem1,0, 16,SRCCOPY);
}
}
if(wParam==MK_LBUTTON)
if(NumLTBob[cxPostion][cyPostion][1]==0)
BitBlt (hdc, rect.left,rect.top ,cxBitmap1,cyBitmap1,
hdcMem1,0,16,SRCCOPY); // 当移动被按下时,贴图
}
pt.x=LOWORD(lParam); pt.y=HIWORD(lParam);
for(i=0;i<iWidth;i++)
{ for(j=0;j<iHeight;j++)
{
SetRect(&rect,10+i*cxBitmap1,50+j*cyBitmap1,10+(i+1)*cxBitmap1,50+(j+1)*cyBitmap1);
if(PtInRect(&rect,pt))
{
ifind=1; //找到区域
break;
}
cxPostion=i;cyPostion=j;
}
if(ifind==1) break; //退出循环
}
if(message==WM_LBUTTONDOWN)
{
m=s=cxPostion;n=t=cyPostion;
if(ifind==0) //雷区外点击
BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,72,SRCCOPY);//脸谱切换
else
{
if(NumLTBob[cxPostion][cyPostion][1]==0) //是否已经被按过
{
BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,72,SRCCOPY);//脸谱切换
BitBlt(hdc,rect.left,rect.top,cxBitmap1,cyBitmap1, hdcMem1,0,0,SRCCOPY);
}
SetRect(&rect1, cxClient/2-15,14,cxClient/2-15+cxBitmap5,14+cyBitmap5);
if(PtInRect(&rect1,pt))
BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,0,SRCCOPY); //判断是否已经按中脸谱
}
}
if(message==WM_RBUTTONDOWN&&wParam!=(MK_LBUTTON|MK_RBUTTON))
{
if(ifind==1&&!(NumLTBob[cxPostion][cyPostion][1]>=1&&NumLTBob[cxPostion][cyPostion][1]<=9)) //当被按下时,插旗子
{
if(NumLTBob[cxPostion][cyPostion][1]==0) //没有被作标记
{
NumLTBob[cxPostion][cyPostion][1]=-2; //插旗子
BitBlt(hdc, rect.left,rect.top ,cxBitmap6,cyBitmap6,
hdcMem6,0,16,SRCCOPY);
iCountcopy--; k=abs(iCountcopy)/100;
j=(abs(iCountcopy)%100)/10;
i=abs(iCountcopy)%10;
BitBlt(hdc,27,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(abs(j)+1)*23,SRCCOPY);
BitBlt(hdc,40,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(abs(i)+1)*23,SRCCOPY);
if(iCountcopy>=0) BitBlt(hdc,14,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(k+1)*23,SRCCOPY);
else BitBlt(hdc,14,14,cxBitmap4,cyBitmap4,hdcMem4,0,0,SRCCOPY);
}
else
{
if(NumLTBob[cxPostion][cyPostion][1]==-2)
{
NumLTBob[cxPostion][cyPostion][1]=-3; //插问号
BitBlt(hdc, rect.left,rect.top ,cxBitmap6,cyBitmap6,
hdcMem6,0,32,SRCCOPY);
iCountcopy++; k=iCountcopy/100;
j=(iCountcopy%100)/10;
i=iCountcopy%10;
BitBlt(hdc,27,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(abs(j)+1)*23,SRCCOPY);
BitBlt(hdc,40,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(abs(i)+1)*23,SRCCOPY);
if(iCountcopy>=0) BitBlt(hdc,14,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(k+1)*23,SRCCOPY);
else BitBlt(hdc,14,14,cxBitmap4,cyBitmap4,hdcMem4,0,0,SRCCOPY);
}
else
{
NumLTBob[cxPostion][cyPostion][1]=0; //原样
BitBlt(hdc, rect.left,rect.top ,cxBitmap6,cyBitmap6,
hdcMem6,0,0,SRCCOPY);
}
}
}
}
if(wParam==(MK_LBUTTON|MK_RBUTTON))
{
for(m=-1;m<=1;m+=2) //按下了左右键,则周围相连砖块同时按下
for(n=1;n>=-1;n-=2)
{
pt1.x=rect.left+m*cxBitmap1;pt1.y=rect.top+n*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+m][cyPostion+n][1]==0)
BitBlt(hdc, rect.left+m*cxBitmap1,rect.top+n*cyBitmap1,cxBitmap1,cyBitmap1,
hdcMem1,0, 0,SRCCOPY);
pt1.x=rect.left+n*cxBitmap1;pt1.y=rect.top+m*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+n][cyPostion+m][1]==0)
BitBlt(hdc, rect.left+n*cxBitmap1,rect.top+m*cyBitmap1,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY);
pt1.x=rect.left-n*cxBitmap1;pt1.y=rect.top;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion-n][cyPostion][1]==0)
BitBlt(hdc,rect.left-n*cxBitmap1,rect.top,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY);
pt1.x=rect.left;pt1.y=rect.top+n*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion][cyPostion+n][1]==0)
BitBlt(hdc,rect.left,rect.top+n*cyBitmap1,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY);
}
doubledown=1;singledown=1;
}
if(message==WM_MOUSEMOVE)
{
if(doubledown) //双键同时按下移动
{
for(m=-1;m<=1;m+=2) //按下了左右键,则周围相连砖块同时按下
for(n=1;n>=-1;n-=2)
{
pt1.x=rect.left+m*cxBitmap1;pt1.y=rect.top+n*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+m][cyPostion+n][1]==0)
BitBlt(hdc, rect.left+m*cxBitmap1,rect.top+n*cyBitmap1 ,cxBitmap1,cyBitmap1,
hdcMem1,0, 0,SRCCOPY);
pt1.x=rect.left+n*cxBitmap1;pt1.y=rect.top+m*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+n][cyPostion+m][1]==0)
BitBlt(hdc, rect.left+n*cxBitmap1,rect.top+m*cyBitmap1 ,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY);
pt1.x=rect.left-n*cxBitmap1;pt1.y=rect.top;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion-n][cyPostion][1]==0)
BitBlt(hdc, rect.left-n*cxBitmap1,rect.top,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY);
pt1.x=rect.left;pt1.y=rect.top+n*cyBitmap1;
if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion][cyPostion+n][1]==0)
BitBlt(hdc, rect.left,rect.top+n*cyBitmap1 ,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY);
}
}
if(wParam==MK_LBUTTON)
if(NumLTBob[cxPostion][cyPostion][1]==0)
BitBlt (hdc, rect.left,rect.top ,cxBitmap1,cyBitmap1,
hdcMem1,0,0,SRCCOPY); // 当移动被按下时,贴图
}
ReleaseDC(hwnd,hdc);
return 0;
case WM_RBUTTONUP:
case WM_LBUTTONUP: //fall through
hdc=GetDC(hwnd);
pt.x=LOWORD(lParam); pt.y=HIWORD(lParam);
if(doubledown==0&&(!flag)&&(message==WM_LBUTTONUP))
{
flag=1;
srand( (unsigned)time( NULL ) ); //种随机种子
i=0;j=1;
NumLTBob[cxPostion][cyPostion][0]=abs(rand())%(iCount>=((iWidth-1)*(iHeight-1)/2)?8:4); //随机产生数字
while(i<iCount)
{
Tmp1 =rand()%iWidth;
Tmp2 =rand()%iHeight;
if(Tmp1==cxPostion&&Tmp2==cyPostion)
continue; //随机调整up时的值
if(Tmp1==0&&Tmp2==0)
continue;
if(NumLTBob[Tmp1][Tmp2][0]==-1)
continue;
NumLTBob[Tmp1][Tmp2][0]=-1; //标记地雷(随机执行)
i=i+1;
}
//计算地雷周围的数字
for(i=1;i<iWidth;i++)
for(j=1;j<iHeight;j++)
if (NumLTBob[i][j][0]!=-1)
{
// if(i==cxPostion&&j==cyPostion) continue;
if(NumLTBob[i][j][0]!=-1)
{
if (NumLTBob[i-1][j][0]==-1&&(i-1>=0)&&j>=0) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i+1][j][0]==-1&&(i+1<=iWidth-1)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i][j-1][0]==-1&&(j-1>=0)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i][j+1][0]==-1&&(j+1<=iHeight-1)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i-1][j-1][0]==-1&&(i-1>=0)&&(j-1>=0)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i+1][j-1][0]==-1&&(i+1<=iWidth-1)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i-1][j+1][0]==-1&&(i-1>=0)&&(j+1<=iHeight-1)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
if (NumLTBob[i+1][j+1][0]==-1&&(i+1<=iWidth-1)&&(j+1<=iHeight-1)) NumLTBob[i][j][0]=NumLTBob[i][j][0]+1;
}
}
}
if(message==WM_LBUTTONUP)
{
upcount++;
if(ifind==1&&upcount==1) SetTimer(hwnd,ID_TIMER1,1000,NULL); //开始计时
if(singledown==1) //这种是双击时按下时,恢复
{
BitBlt(hdc,rect.left,rect.top,cxBitmap1,cyBitmap1,hdcMem1,0,16,SRCCOPY);
BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,96,SRCCOPY); //脸谱恢复
}
else
BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,96,SRCCOPY); //脸谱恢复
if(ifind==1&&doubledown!=1) //雷区点击中
{
if(NumLTBob[cxPostion][cyPostion][0]==0&&NumLTBob[cxPostion][cyPostion][1]==0)//按下了空白,翻片
{
NumLTBob[cxPostion][cyPostion][1]=9; //把空白的状态设为9;
BitBlt(hdc,rect.left,rect.top,cxBitmap6,cyBitmap6,
hdcMem6,0,240,SRCCOPY);
find(cxPostion,cyPostion,NumLTBob,hdc,hdcMem6,cxBitmap6,cyBitmap6); //递归调用找空白;
}
else
{
if((NumLTBob[cxPostion][cyPostion][0]>=1&&NumLTBob[cxPostion][cyPostion][0]<=8)
&&NumLTBob[cxPostion][cyPostion][1]==0) //数字
{
BitBlt(hdc,rect.left,rect.top,cxBitmap6,cyBitmap6,
hdcMem6,0,256-(NumLTBob[cxPostion][cyPostion][0]+1)*16,SRCCOPY);
NumLTBob[cxPostion][cyPostion][1]=NumLTBob[cxPostion][cyPostion][0];
}
else
{
if(NumLTBob[cxPostion][cyPostion][0]==-1)
{
BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,48,SRCCOPY);
PlaySound(TEXT("434.wav"),NULL,SND_FILENAME|SND_ASYNC); //爆炸
finish=1;
BitBlt(hdc,rect.left,rect.top,cxBitmap6,cyBitmap6,
hdcMem6,0,48,SRCCOPY); //显示按下的状态
NumLTBob[cxPostion][cyPostion][1]=-1;
for(i=0;i<iWidth;i++)
{
for(j=0;j<iHeight;j++)
{
if(NumLTBob[i][j][1]==-2&&NumLTBob[i][j][0]!=-1)
BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6,
hdcMem6,0,64,SRCCOPY); // 显示标记出错的旗子按钮状态
else if(NumLTBob[i][j][1]==-2&&NumLTBob[i][j][0]==-1)
BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?