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

yuh0001 yuh0001 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
初学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.”
...全文

相关推荐

Win32纯API实现的简单画图程序

完美封装winmain接口,画直线、矩形、圆、多边形,并实现放大、缩小、移动、删除等编辑功能,并能保存、读取图形信息,画笔颜色和粗细也可以选择

Claude16888

用API编写简单的Windows程序

(1) 建立工程的类型(Win32 Application)及需要包含的头文件(Windows.h) (2) WinMain函数的使用(Win32下程序的入口) (3) 完成Windows窗口产生的四个步骤: A.设计窗口类,即WNDCLASS结构体的填充, 其中注意窗口 函数的指定和类名的命名 B.注册窗口类,即RegisterClass(…) 函数的使用 C.创建窗口,即CreateWindow(…) 函数的使用 D.显示及更新窗口,即ShowWindow(…) 及UpdateWindow(…) 的使用 (4) 进行消息循环,用GetMessage(…) 取出消息,分别用TranslateMessage(…) 和DispatchMessage(…) 进行消息的转换和分发。注意消息的格式(MSG结构体) (5) 对窗口函数进行编写(窗口函数是一个回调(CALLBACK)函数,操作系统会自动调用该函数对窗口的消息进行处理),用一个switch…case语句对从消息队列中取出的消息进行处理,注意各个消息在switch中都要找到归宿,否则程序无法结束。

zxc12345678zxc

一个适合初学windows编程的简单程序

这是我高防一本书上的一个windows简单程序,虽然程序比较简单,但是包含了windows编程的具体框架。

wreckage2009

用C语言做一个简单的窗口程序

用C语言做一个简单的窗口程序

u010553678

一个简单的截图工具,使用windows API编写的。

一个简单的截图工具,使用windows API编写的。使用简单,非常适合新手学习。基本制作的和QQ截图的功能一样,欢迎大家下载

zzbarry
评论 7
收藏 已收藏
分享
返回顶部
yuh0001
VC/MFC 16,550 成员 421,606 内容