#include <windows.h>
#include<stdio.h>
#include<math.h>
#include<time.h>#define MineS_MX 40//宽//
#define MineS_MY 30//高,个数//
#define MineS_SIZE 20LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int Change(int);//坐标转换//
void DrawGrid(HDC);//画格子//
void DrawSquare(HDC);//显示分数//
void DrawTip(HDC,HWND);
void Recursion(int,int);//递归搜索相邻//UINT g_uTimer;
POINT MineS_Mouse;//鼠标位置//
int MineS[MineS_MX+2][MineS_MY+2];//底//
int MineS_YN[MineS_MX+2][MineS_MY+2];//遮挡//
int MineS_Num=100;//雷数//
int MineS_Nu=0;//已挖出的方块数//int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("MineSweeper!");
HWND hwnd;
MSG msg;WNDCLASS wndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This Program Requires WindowsNT!"),szAppName,MB_ICONERROR);
return 0;
}hwnd=CreateWindow(szAppName,
  TEXT("MineSweeper"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  MineS_SIZE*MineS_MX+40, 
  MineS_SIZE*MineS_MY+60,
  NULL,
  NULL,
  hInstance,
  NULL);ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT pt;
RECT rect,winxy;
int i,j,x,y,n=0,m;
HDC hdcMem;
HBITMAP hbmpMem;
HBRUSH hBrushBK;switch(message)
{
case WM_CREATE:
g_uTimer=SetTimer(hwnd,1,10,NULL);
srand((unsigned)time(NULL));//随机数发生器的初始化函数//
for(i=1;i<=MineS_MX;i++)//初始化方块矩阵//
for(j=1;i<=MineS_MY;j++)
{
MineS[i][j]=0;
MineS_YN[i][j]=1;
} for(i=0;i<=MineS_MX+1;i++)
{
MineS[i][0]=11;
MineS[i][MineS_MY+1]=11;
} for(i=0;i<=MineS_MY+1;i++)
{
MineS[0][i]=11;
MineS[MineS_MX+1][i]=11;
}
m=MineS_Num; while(m)//布雷//
{
x=rand()%MineS_MX+1;
y=rand()%MineS_MY+1;

if(MineS[x][y]!=10)
{
MineS[x][y]=10;
m--;
}
}
for(i=1;i<=MineS_MX;i++)//初始化数字//
for(j=1;j<=MineS_MY;j++)
{
if(MineS[i][j]!=10)
{
MineS[i][j]+=(MineS[i-1][j-1]==10);
MineS[i][j]+=(MineS[i-1][j]==10);
MineS[i][j]+=(MineS[i-1][j+1]==10);
MineS[i][j]+=(MineS[i][j-1]==10);
MineS[i][j]+=(MineS[i][j+1]==10);
MineS[i][j]+=(MineS[i+1][j-1]==10);
MineS[i][j]+=(MineS[i+1][j]==10);
MineS[i][j]+=(MineS[i+1][j+1]==10);

}
}
return 0;
case WM_KEYDOWN:
if(wParam=='O')
{
g_uTimer=SetTimer(hwnd,1,10,NULL);
}
if(wParam=='P')
{
KillTimer(hwnd,g_uTimer);
}
return 0;
case WM_KEYUP:
return 0;
case WM_LBUTTONDOWN:
GetCursorPos(&MineS_Mouse);
GetWindowRect(hwnd,&winxy); x=(MineS_Mouse.x-winxy.left-20)/MineS_SIZE+1;
y=(MineS_Mouse.y-winxy.top-40)/MineS_SIZE+1;
if(x>=1&&x<=MineS_MX&&y>=1&&y<=MineS_MY)
{
if(MineS[x][y]>0&&MineS[x][y]||MineS[x][y]==11)
{
if(MineS_YN==0)
MineS_YN[x][y]=0;
MineS_Nu++;
}
}
if(MineS[x][y]==0)
{
Recursion(x,y);
}
if(MineS[x][y]==10)
{
MessageBox(hwnd,"over","over",MB_OK);
KillTimer(hwnd,g_uTimer);
exit(0);
}
return 0;
case WM_RBUTTONDOWN:
return 0;
case WM_TIMER:
GetClientRect(hwnd,&rect);
InvalidateRect(hwnd,&rect,FALSE);
return 0;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&pt);
GetClientRect(hwnd,&rect);
hdcMem=CreateCompatibleDC(hdc);
hbmpMem=CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
SelectObject(hdcMem,hbmpMem);
hBrushBK=CreateSolidBrush(RGB(255,255,255));
FillRect(hdcMem,&rect,hBrushBK);
DeleteObject(hBrushBK); DrawGrid(hdcMem);
DrawSquare(hdcMem);
DrawTip(hdcMem,hwnd); if((MineS_Nu+MineS_Num)==MineS_MX*MineS_MY)
{
KillTimer(hwnd,g_uTimer);
MessageBox(hwnd,"ok","ok",MB_OK);
exit(0);
}
    EndPaint(hwnd,&pt);


}
return 0;
case WM_MOUSEMOVE:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;}
return DefWindowProc(hwnd,message,wParam,lParam);}
int Change(int n)
{
return (n-1)*MineS_SIZE+10;}
void DrawGrid(HDC hdc)
{
int i;
Rectangle(hdc,10,10,10+MineS_MX*MineS_SIZE+1,10+MineS_MY*MineS_SIZE+1);for(i=10;i<10+MineS_MY*MineS_SIZE;i+=MineS_SIZE)
{
MoveToEx(hdc,i,10,NULL);
LineTo(hdc,i,MineS_MY*MineS_SIZE+10);}
for(i=10;i<10+MineS_MY*MineS_SIZE;i+=MineS_SIZE)
{
MoveToEx(hdc,10,i,NULL);
LineTo(hdc,MineS_MX*MineS_SIZE+10,i);
}
}
void DrawSquare(HDC hdc)
{
int i,j;
RECT rc;
TCHAR tip[2];
for(i=1;i<=MineS_MX;i++)
for(j=1;j<=MineS_MY;j++)
{
if(MineS_YN[i][j])
{
Rectangle(hdc,Change(i)+1,Change(j)+1,Change(i)+MineS_SIZE-1,Change(j)+MineS_SIZE-1);
Rectangle(hdc,Change(i)+3,Change(j)+3,Change(i)+MineS_SIZE-2,Change(j)+MineS_SIZE-2);
Rectangle(hdc,Change(i)+5,Change(j)+5,Change(i)+MineS_SIZE-3,Change(j)+MineS_SIZE-3);
}
else
{
if(MineS[i][j]>0&&MineS[i][j]<9)
{
sprintf(tip,"%d",MineS[i][j]);
rc.left=Change(i);
rc.top=Change(j)+1;
rc.right=rc.left+MineS_SIZE;
rc.bottom=rc.top+MineS_SIZE;
DrawText(hdc,tip,-1,&rc,DT_CENTER);
Rectangle(hdc,Change(i)+2,Change(j)+2,Change(i)+MineS_SIZE-1,Change(j)+MineS_SIZE-1);
}
if(MineS[i][j]==10)
{
Rectangle(hdc,Change(i)+2,Change(j)+2,Change(i)+MineS_SIZE-1,Change(j)+MineS_SIZE-1);
Rectangle(hdc,Change(i)+3,Change(j)+3,Change(i)+MineS_SIZE-2,Change(j)+MineS_SIZE-2);
Rectangle(hdc,Change(i)+4,Change(j)+4,Change(i)+MineS_SIZE-3,Change(j)+MineS_SIZE-3);
    Rectangle(hdc,Change(i)+5,Change(j)+5,Change(i)+MineS_SIZE-4,Change(j)+MineS_SIZE-4);
}
}
}
}
void DrawTip(HDC hdc,HWND hwnd)
{
RECT rc,winxy;
TCHAR szTip[255];
int x,y;GetCursorPos(&MineS_Mouse);
GetWindowRect(hwnd,&winxy);x=(MineS_Mouse.x-winxy.left-20)/MineS_SIZE+1;
y=(MineS_Mouse.y-winxy.top-40)/MineS_SIZE+1;sprintf(szTip,"分数:%d,d%",x,MineS_Nu);
rc.left=500;
rc.top=200;
rc.right=600;
rc.bottom=240;DrawText(hdc,szTip,-1,&rc,DT_BOTTOM|DT_LEFT);
}void Recursion(int x,int y)
{
if(x>0&&x<=MineS_MX&&y>0&&y<=MineS_MY)
{
if(MineS_YN[x][y]==1)
{
MineS_YN[x][y]=0;
MineS_Nu++;}
if(MineS[x][y]==0)
{
MineS[x][y]=11;
Recursion(x-1,y-1);
Recursion(x-1,y);
Recursion(x-1,y+1);
Recursion(x,y-1);
Recursion(x,y+1);
Recursion(x+1,y-1);
Recursion(x+1,y);
Recursion(x+1,y+1);
}
}
}

解决方案 »

  1.   

    第一个case for循环里面有错,i换成j,不过还有其他问题。放断点一步步调试吧
      

  2.   

    for(i=1;i<=MineS_MX;i++)//初始化方块矩阵//
    for(j=1;i<=MineS_MY;j++){
    MineS[i][j]=0;
    MineS_YN[i][j]=1;
    }看看这个就能明白了不过显示都是空白!!!
      

  3.   

    //共修改两处,就能显示
    1。
       for(i=1;i<=MineS_MX;i++)//初始化方块矩阵//
    for(j=1;j<=MineS_MY;j++) //问题一i应为j
    {
    MineS[i][j]=0;
    MineS_YN[i][j]=1;
    }
    2。显示图像
    hdc=BeginPaint(hwnd,&pt);
    GetClientRect(hwnd,&rect);




    hdcMem=CreateCompatibleDC(hdc);
    hbmpMem=CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
    SelectObject(hdcMem,hbmpMem);


    hBrushBK=CreateSolidBrush(RGB(255,0,0));
    FillRect(hdcMem,&rect,hBrushBK);
    DeleteObject(hBrushBK);

    DrawGrid(hdcMem);
    DrawSquare(hdcMem);
    DrawTip(hdcMem,hwnd);

    if((MineS_Nu+MineS_Num)==MineS_MX*MineS_MY)
    {
    KillTimer(hwnd,g_uTimer);
    MessageBox(hwnd,"ok","ok",MB_OK);
    exit(0);
    }
    //问题二
    //最终显示画的图像
    BitBlt(hdc,0,0,rect.right - rect.left,rect.bottom-rect.top,hdcMem,0,0,SRCCOPY);
    DeleteDC(hdcMem);
    DeleteObject(hbmpMem);
    EndPaint(hwnd,&pt);