⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmine.c

📁 应用win32编写的一个扫雷程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <windows.h>
#include <time.h>
#include <stdlib.h> 
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <commctrl.h>
#include "Htmlhelp.h"
#include "resource.h"

#define WM_CUSTOM  WM_USER+100                                  //自定义消息
#define ID_TIMER1   100  

/* *********************************************************************
// 插旗子的状态---------------- -2         插问号的状态---------------- -3
// 空白-----------------------0         地雷的状态----------------- -1
// 数字--------- 1,2 ,3,4,5,6,7,8表示地雷数
************************************************************** */
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL    CALLBACK CustomDlgProc(HWND,UINT,WPARAM,LPARAM);

int     ilevel=IDM_BEGINNER;                                    //保存信息,以用做初始化自定义对话框
int     iWidth=9,iHeight=9,iCount=10;                                   //保存对话框传来的大小数据  
int     upcount=0,countime1=0;                               //作为计时器和up记数
 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName [] = TEXT ("winmine") ;
	 HACCEL       hAccel;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS  ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, szAppName) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH) ;
     wndclass.lpszMenuName  = szAppName ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName, TEXT ("扫雷"), 
                          WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX&~WS_THICKFRAME , 
						  200, 200,
                          170, 258,
                          NULL, NULL, hInstance, NULL) ;

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
    
	 hAccel=LoadAccelerators(hInstance,szAppName);
     while (GetMessage (&msg, NULL, 0, 0))
     {
         if(!TranslateAccelerator(hwnd,hAccel,&msg)) 
		 TranslateMessage (&msg) ;
         DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

void  initialBob(int iNumLTBob[100][100][2],int iwidth,int iheight) //初始化数组
 {
	 int i,j;
	 for(i=0;i<=iwidth-1;i++)
		 for(j=0;j<=iheight-1;j++)
         {
              iNumLTBob[i][j][0]=0;
			  iNumLTBob[i][j][1]=0;
		 }

}

 find(int i,int j,int iNumLTBob[100][100][2],HDC hdc,HDC memhdc,int cxBit,int cyBit)  // 递归调用找空白
 {
	 if((i<0)||(j<0)||(iNumLTBob[i][j][0]==-1)) return 0;
	 else
	 {
        if(iNumLTBob[i][j][0]<=8&&iNumLTBob[i][j][0]>=0) 
		  {
			  if(iNumLTBob[i][j][1]==0&&iNumLTBob[i][j][0]<=8&&iNumLTBob[i][j][0]>=1)
			  {
                iNumLTBob[i][j][1]=iNumLTBob[i][j][0];
                BitBlt(hdc,10+i*cxBit,50+j*cyBit,cxBit,cyBit, 
                       memhdc,0,256-(iNumLTBob[i][j][0]+1)*16,SRCCOPY);
			  }
			 if(iNumLTBob[i][j][0]==0&&iNumLTBob[i][j][1]==0) 
			 {
				 BitBlt(hdc,10+i*cxBit,50+j*cyBit,cxBit,cyBit, 
                       memhdc,0,240,SRCCOPY);
				 iNumLTBob[i][j][1]=9;
			 }
		
		}
	    find(i-1,j-1,iNumLTBob,hdc,memhdc,cxBit,cyBit);
		find(i-1,j+1,iNumLTBob,hdc,memhdc,cxBit,cyBit);
		find(i,j+1,iNumLTBob,hdc,memhdc,cxBit,cyBit);
        find(i,j-1,iNumLTBob,hdc,memhdc,cxBit,cyBit);
		find(i+1,j-1,iNumLTBob,hdc,memhdc,cxBit,cyBit);
		find(i+1,j,iNumLTBob,hdc,memhdc,cxBit,cyBit);
		find(i+1,j+1,iNumLTBob,hdc,memhdc,cxBit,cyBit);
		find(i-1,j,iNumLTBob,hdc,memhdc,cxBit,cyBit);
	   	   
	 }
	 
}

BOOL   CALLBACK CustomDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	 TCHAR          str[5];            
     
     switch(message)
	 {
	   case WM_INITDIALOG:
		    
		  if(ilevel==IDM_BEGINNER)
			{
			 
				SetDlgItemText(hDlg,IDC_HEIGHT_CUSTOM,"9");
				SetDlgItemText(hDlg,IDC_WIDTH_CUSTOM,"9");
				SetDlgItemText(hDlg,IDC_COUNT_CUSTOM,"10");
			}
			else 
			{
				if (ilevel==IDM_INTERMEDIATE)
				{	
				   SetDlgItemText(hDlg,IDC_HEIGHT_CUSTOM,"16");
				   SetDlgItemText(hDlg,IDC_WIDTH_CUSTOM,"16");
				   SetDlgItemText(hDlg,IDC_COUNT_CUSTOM,"40");

				}
				else
				{
					 if(ilevel==IDM_ADVANCED)
					 {
					    SetDlgItemText(hDlg,IDC_HEIGHT_CUSTOM,"16");
				        SetDlgItemText(hDlg,IDC_WIDTH_CUSTOM,"30");
				        SetDlgItemText(hDlg,IDC_COUNT_CUSTOM,"99");
					 }
					 else 
					 {
                       itoa(iHeight,str,10);                              //把整数转化为字符串
                       SetDlgItemText(hDlg,IDC_HEIGHT_CUSTOM,str);
                       itoa(iWidth,str,10);
				       SetDlgItemText(hDlg,IDC_WIDTH_CUSTOM,str);
                       itoa(iCount,str,10);
				       SetDlgItemText(hDlg,IDC_COUNT_CUSTOM,str);
					 }
				}
			}
			return TRUE ;

	   case WM_COMMAND:
		   
		    switch(LOWORD(wParam))
			{
			case IDOK:
				
				EndDialog(hDlg,TRUE);
				if(iHeight<9) iHeight=9;
				if(iWidth<9)  iWidth=9;
				if(iCount<10) iCount=10;
				if(iCount>=((iHeight-1)*(iWidth-1))) iCount=(iHeight-1)*(iWidth-1);
				SendMessage(GetParent(hDlg),WM_CUSTOM,iCount,MAKELONG(iHeight,iWidth));
			    KillTimer(GetParent(hDlg),ID_TIMER1);
		        return TRUE;
            
			case IDCANCEL:
				 
				 EndDialog(hDlg,FALSE);
                 return TRUE;

            case IDC_HEIGHT_CUSTOM:
                   
				 GetDlgItemText(hDlg,IDC_HEIGHT_CUSTOM,str,5);
				 iHeight=atoi(str);
                 return TRUE;

            case IDC_WIDTH_CUSTOM:
				
				 GetDlgItemText(hDlg,IDC_WIDTH_CUSTOM,str,5);
				 iWidth=atoi(str);
                 return TRUE;

            case IDC_COUNT_CUSTOM:

				 GetDlgItemText(hDlg,IDC_COUNT_CUSTOM,str,5);
				 iCount=atoi(str);
                 return TRUE;

			}
	 }
	 return TRUE;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static HBITMAP hBitmap1,hBitmap2,hBitmap3,hBitmap4,hBitmap5,hBitmap6;
     static HDC     hdcMem1,hdcMem2 ,hdcMem3,hdcMem4,hdcMem5,hdcMem6;
	 HDC            hdc;
	 BITMAP         bitmap1,bitmap2,bitmap3,bitmap4,bitmap5,bitmap6;
	 static HINSTANCE      hInstance;
	 HINSTANCE			  hLib;						              //shell32.dll 实例句柄
	 static	FARPROC		fpAbout;					               //ShellAbout 函数入口
	 static	HICON		hIcon;	
     static int     cxBitmap1, cyBitmap1, cxBitmap2,cyBitmap2,cxBitmap3,cyBitmap3,
		            cxBitmap4, cyBitmap4, cxBitmap5,cyBitmap5,cxBitmap6,cyBitmap6,cxClient, cyClient;
	 static int     cxPostion=-1,cyPostion=-1;                         //保存哪个位置上的砖块被翻
	 static int     count,iCountcopy=10;                                      //作为计数器计数 
	 TCHAR			lpAnonymity[255];		                   	//临时变量           
     HMENU          hMenu;
     PAINTSTRUCT    ps;
	 POINT          pt,pt1;
	 int             x,y;
     static RECT    rect,rect1,rect2;  
     static int           NumLTBob[100][100][2];                //用于记录地雷的数目和雷的位置,
	 static int	    ifind=0,numofBob;     //判断是否按中雷区                                        //以及用于记录按钮显示的状况      
     int           Tmp1, Tmp2,j,i;                        //临时变量  
	 static int     m,n,k,s=0,t=0;                           
     static int           flag=0,flag1,finish;                             //判断是不是应该重新布雷的标志
     static int      doubledown,singledown,countup;                      //判断是否双键按下 
	 static countime;                                              //作为计时器和up记数
	
	 switch (message)
     {
     case WM_CREATE:                                            //游戏开始时的界面(默认为初级)
          
		  hdc = GetDC (hwnd) ;
		  hInstance=((LPCREATESTRUCT)lParam)->hInstance; 
          hdcMem1  = CreateCompatibleDC (hdc) ;
		  hdcMem2  = CreateCompatibleDC (hdc) ;
		  hdcMem3  = CreateCompatibleDC (hdc) ;
		  hdcMem4  = CreateCompatibleDC (hdc) ;
		  hdcMem5  = CreateCompatibleDC (hdc) ;
		  hdcMem6  = CreateCompatibleDC (hdc) ;
          hBitmap1 =LoadBitmap(hInstance,TEXT("field"));
		  hBitmap2 =LoadBitmap(hInstance,TEXT("frame"));
		  hBitmap3 =LoadBitmap(hInstance,TEXT("smallfra"));
		  hBitmap4 =LoadBitmap(hInstance,MAKEINTRESOURCE(420));
		  hBitmap5 =LoadBitmap(hInstance,MAKEINTRESOURCE(430));
		  hBitmap6 =LoadBitmap(hInstance,MAKEINTRESOURCE(410));
          ReleaseDC (hwnd, hdc) ;
          GetObject(hBitmap1,sizeof(BITMAP),&bitmap1);
		  GetObject(hBitmap2,sizeof(BITMAP),&bitmap2);
		  GetObject(hBitmap3,sizeof(BITMAP),&bitmap3);
		  GetObject(hBitmap4,sizeof(BITMAP),&bitmap4);
		  GetObject(hBitmap5,sizeof(BITMAP),&bitmap5);
		  GetObject(hBitmap6,sizeof(BITMAP),&bitmap6);
		  cxBitmap1=bitmap1.bmWidth;
		  cyBitmap1=bitmap1.bmHeight/2;
		  cxBitmap2=bitmap2.bmWidth;
		  cyBitmap2=bitmap2.bmHeight;
		  cxBitmap3=bitmap3.bmWidth;
		  cyBitmap3=bitmap3.bmHeight;
		  cxBitmap4=bitmap4.bmWidth;
		  cyBitmap4=bitmap4.bmHeight/12;
		  cxBitmap5=bitmap5.bmWidth;
		  cyBitmap5=bitmap5.bmHeight/5;
		  cxBitmap6=bitmap6.bmWidth;
		  cyBitmap6=bitmap6.bmHeight/16;
		  SelectObject (hdcMem1, hBitmap1);
          SelectObject (hdcMem2, hBitmap2);
		  SelectObject (hdcMem3, hBitmap3);
		  SelectObject (hdcMem4, hBitmap4);
		  SelectObject (hdcMem5, hBitmap5);
		  SelectObject (hdcMem6, hBitmap6);
		 /*/////////////////////////////////////////////////////////
		//调入Windows自带的 shell32.dll,为调用"关于"(ShellAbout)做准备
		*//////////////////////////////////////////////////////////
		hLib=LoadLibrary("shell32.dll");
		if (hLib)
		{
			fpAbout=GetProcAddress(hLib,"ShellAboutW");
		}
		hIcon=LoadIcon(hInstance,TEXT("ico100")) ;
		return 0;
         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -