16,473
社区成员
发帖
与我相关
我的任务
分享
/************************************************ MineSweeper Program ********************************************
********************************************************************************************************************************/
#include"stdafx.h"
#include <windows.h>
#include <stdio.h>
#include"mineswepper.h"
#define MineNum 10
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
struct Block
{
bool ifOpened; //if the block has been clicked
bool ifMined; //if the block contains a mine
bool ifFlaged; //if user has flgged the block as a mine
int surroundedMines; //How many mines around the target block
};
static Block blocks[20][20];
int minesAround(int i,int l);
void looping(int i,int l);
static int bmX = 0;
static int bmY = 0;
static int mouseX;
static int mouseY;
static int row = 20;
static int coloum = 20;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
TCHAR szAppName[]=TEXT("Minesweeper");
TCHAR szClassName[]=TEXT("MinesweeperClassName");
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 =szClassName;
RegisterClass(&wndclass);
hwnd=CreateWindow(szClassName,TEXT("Mineswepper"), WS_OVERLAPPEDWINDOW &~ WS_SIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,nCmdShow);
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)
{
PAINTSTRUCT ps;
HDC hdc , hdcMem;
HBITMAP hBitmap;
BITMAP bm;
switch (message)
{
case WM_CREATE:
{
for(int i=0;i<row;++i)
{
for(int l=0;l<coloum;++l)
{
blocks[i][l].ifMined=false;
blocks[i][l].ifFlaged=false;
blocks[i][l].ifOpened=false;
}
}
for(int i=0;i<10;++i)
{
int x=rand()%20;
int y=rand()%20;
blocks[x][y].ifMined=true;
}
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("Blocks.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(hBitmap,sizeof(BITMAP),&bm);
bmX=bm.bmWidth;
bmY=bm.bmHeight;
return 0;
}
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
hdcMem=CreateCompatibleDC(hdc);
for(int i=0;i<row;++i)
{
for(int l=0;l<coloum;++l)
{
if(blocks[i][l].ifOpened==true)
{
if(blocks[i][l].ifMined==true)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("openMneBlk.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else
{
if(blocks[i][l].surroundedMines==0)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("mineKEYDOWN.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==1)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==2)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==3)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("3.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==4)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("4.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==5)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("5.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==6)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("6.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==7)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("7.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
else if(blocks[i][l].surroundedMines==8)
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("8.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
}
}
else
{
hBitmap=(HBITMAP)LoadImage(NULL,TEXT("Blocks.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DeleteObject(SelectObject(hdcMem,hBitmap));
}
BitBlt(hdc,(i*bmX),(l*bmY),bmX,bmY,hdcMem,0,0,SRCCOPY);
}
}
EndPaint(hwnd,&ps);
DeleteDC(hdcMem);
return 0;
}
case WM_LBUTTONUP:
{
mouseX=LOWORD(lParam);
mouseY=HIWORD(lParam);
int box_Y = (mouseX/bmX);
int box_X = (mouseY/bmY);
if( (mouseX<(coloum*bmX)) && (mouseY<(row*bmY)) )
{
if(blocks[box_Y][box_X].ifOpened==true)
{return 0;}
else
{
looping(box_Y,box_X);
InvalidateRect(hwnd,NULL,true);
return 0;
}
}
return 0;
}
case WM_CHAR:
switch(wParam)
{case 'x':
for(int i=0;i<row;++i)
{
for(int l=0;l<coloum;++l)
{
blocks[i][l].ifOpened=true;
blocks[i][l].surroundedMines=minesAround(i,l);
}
}
InvalidateRect(hwnd,NULL,true);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
int minesAround(int i,int l)
{
int MineNumCount=0; //for counting the mines around
// They are the codes for counting the mines around the block(down)
if( (i != 0) && (l != 0) )
{
if(blocks[i-1][l-1].ifMined==true) {++MineNumCount;}
}
if(i != 0)
{
if(blocks[i-1][l].ifMined==true) {++MineNumCount;}
if( l<(coloum-1) )
{if(blocks[i-1][l+1].ifMined==true) {++MineNumCount;}
}
}
if(l != 0)
{
if(blocks[i][l-1].ifMined==true) {++MineNumCount;}
if( i<(row-1) )
{if(blocks[i+1][l-1].ifMined==true) {++MineNumCount;}}
}
if( l<(coloum-1) )
{ if(blocks[i][l+1].ifMined==true) {++MineNumCount;}
if( i<(row-1) )
{if(blocks[i+1][l+1].ifMined==true) {++MineNumCount;}}
}
if( i<(row-1) )
{if(blocks[i+1][l].ifMined==true) {++MineNumCount;}}
return MineNumCount;
}
void looping(int i,int l)
{
blocks[i][l].ifOpened=true;
if(minesAround(i,l)>0)
{
blocks[i][l].surroundedMines=minesAround(i,l);
return;
}
else
{
if(blocks[i-1][l-1].ifOpened==false)
{looping((i-1),(l-1));}
if(blocks[i-1][l].ifOpened==false)
{looping((i-1),l);}
if(blocks[i][l-1].ifOpened==false)
{looping(i,(l-1));}
if(blocks[i][l+1].ifOpened==false)
{looping(i,(l+1));}
if(blocks[i+1][l-1].ifOpened==false)
{looping((i+1),(l-1));}
if(blocks[i+1][l].ifOpened==false)
{looping((i+1),l);}
if(blocks[i+1][l].ifOpened==false)
{looping((i+1),l);}
if(blocks[i+1][l+1].ifOpened==false)
{looping((i+1),(l+1));}
}
}
提示错误:“Unhandled exception at 0x0019266a in mineswepper.exe: 0xC0000005: Access violation writing location 0x00197fa0.”