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 + -
显示快捷键?