求助各位!!!一个简单的windows api程序问题!!!!

yuh0001 2012-10-31 11:39:49
初学api,在写这个扫雷游戏,提示错误啊啊啊啊啊!!!请问哪位能帮我看看问题在哪里啊?实在感谢!!!




下面是代码,谢谢!!!
/************************************************  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.”
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgstudyvc 2012-10-31
  • 打赏
  • 举报
回复
f5跟踪
Eleven 2012-10-31
  • 打赏
  • 举报
回复
Debug下调试一下,看看哪里函数返回失败了?
若风09 2012-10-31
  • 打赏
  • 举报
回复
好长。。。
Ginie 2012-10-31
  • 打赏
  • 举报
回复
调试运行,然后查看堆栈,看错误具体指向哪里
yuh0001 2012-10-31
  • 打赏
  • 举报
回复
谢谢……第一次写程序……代码资源风格什么的一塌糊涂……现在遇到这问题不知所措了……
傻X 2012-10-31
  • 打赏
  • 举报
回复
N多资源文件没有,本来帮你调试了。

根据错误来看,应该是内存操作问题。踩内存了。

崩溃后用callstack查看崩溃地点来定位。这里只能提供解决的思路。

细致定位需要一定环境条件。楼主加油
yuh0001 2012-10-31
  • 打赏
  • 举报
回复
提示说是looping函数的第一句话错了,但实在不知道哪里不对……

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧