代码出现中断不知道哪出现问题提示 0x00382239 处有未经处理的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突

一只懵 2017-12-27 09:27:12
#pragma once //预处理!!
#include <windows.h>
#include <stdlib.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 700

typedef struct Node //子弹 敌机 自己的飞机
{
int x;
int y;
struct Node* pnext;
}Node;

HDC g_hdc, g_memdc, g_bufdc;
HBITMAP g_back,g_mine,g_bellut,g_enemy; //背景图片
int g_backoffset = 0; //背景的偏移量
Node* pEnemy = NULL; //敌机
Node* pBellut = NULL; //子弹
Node* pMine = NULL; //自己的飞机
DWORD g_tBellutCreatePre, g_tBellutCreateNow; //
DWORD g_tEnemyCreatePre, g_tEnemyCreateNow;
DWORD g_tBellutMovePre, g_tBellutMoveNow; //
DWORD g_tEnemyMovePre, g_tEnemyMoveNow;
DWORD g_tnow, g_tpre;

void Move(Node* P, int n);
void CreateList();
void Shoot(HWND hwnd);
void AddNode(Node* P, int n);
VOID GamePaint(HWND);
BOOL GameInit(HWND hwnd);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prehInstance, LPSTR lpCmdLine, int nShowCmd) //主函数
{
//做一个窗口!!
//1.需要什么样子的窗口
WNDCLASSEX wnd = { 0 }; //定义一个窗口
wnd.cbSize = sizeof(WNDCLASSEX); //窗口应该占用内存
wnd.hInstance = hInstance; //程序的当前实例句柄
wnd.style = CS_HREDRAW | CS_VREDRAW; //窗体可以改变水平和垂直方向
wnd.hbrBackground = (HBRUSH)5; //背景颜色
wnd.hCursor = NULL; //鼠标样式
wnd.hIcon = NULL;//LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); //程序的图标
wnd.cbClsExtra = 0; //程序的附加内存
wnd.cbWndExtra = 0; //窗口的附加内存
wnd.lpszMenuName = NULL; //菜单
//wnd.lpszClassName = L"FOR OUR DREAMS"; //窗口的类名称
wnd.lpfnWndProc = WndProc; //窗口的过程函数

//2.注册窗口
RegisterClassEx(&wnd); //检查窗口是否可用

//3.创建
HWND hWnd = CreateWindow("FOR OUR DREAMS", "PlaneDemo",
WS_OVERLAPPEDWINDOW, 300, 200, WINDOW_WIDTH, WINDOW_HEIGHT,
NULL, NULL, hInstance, NULL);

//4.显示和更新
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);

PlaySound("./res/The Mass.wav",NULL,SND_LOOP|SND_FILENAME|SND_ASYNC);
if (!GameInit(hWnd))
return -1;

//消息循环
MSG msg = { 0 };
while (msg.message != WM_QUIT) //只要客户发出退出程序的指令
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))//消息队列去获得消息
{
//栈在哪里用?代码块 队列在哪里用啊? 打游戏
TranslateMessage(&msg); //翻译消息 虚拟键值--->字符消息
DispatchMessage(&msg); //发送消息 发送给系统
}
else
{
g_tBellutMoveNow = GetTickCount();
if (g_tBellutMoveNow - g_tBellutMovePre >= 5)
{
Move(pBellut, 1);
g_tBellutMovePre = g_tBellutMoveNow;
}

g_tEnemyMoveNow = GetTickCount();
if (g_tEnemyMoveNow - g_tEnemyMovePre >= 5)
{
Move(pEnemy, 2);
g_tEnemyMovePre = g_tEnemyMoveNow;
}

g_tnow = GetTickCount();
if (g_tnow - g_tpre >= 40)
{
GamePaint(hWnd);
}
Shoot(hWnd);
}
}
//【6】窗口类的注销
UnregisterClass("感恩节快乐", wnd.hInstance); //程序准备结束,注销窗口类
return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
CreateList();
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_LEFT:
pMine->x -= 10;
break;
case VK_RIGHT:
pMine->x += 10;
break;
case VK_UP:
pMine->y -= 10;
break;
case VK_DOWN:
pMine->y += 10;
break;
}
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}

//游戏的初始化函数
BOOL GameInit(HWND hwnd)
{
HBITMAP bmp; //画布
g_hdc = GetDC(hwnd);
g_memdc = CreateCompatibleDC(g_hdc);
g_bufdc = CreateCompatibleDC(g_hdc);
bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
g_back = (HBITMAP)LoadImage(NULL, "./res/BG2.bmp", IMAGE_BITMAP, 800, 2408, LR_LOADFROMFILE);
g_mine = (HBITMAP)LoadImage(NULL, "./res/ZIJI600X300.bmp", IMAGE_BITMAP, 200, 100, LR_LOADFROMFILE);
g_bellut = (HBITMAP)LoadImage(NULL, "./res/ZIDAN_120X25 .bmp", IMAGE_BITMAP, 120, 25, LR_LOADFROMFILE);
g_enemy = (HBITMAP)LoadImage(NULL, "./res/DIJI_230X80.bmp", IMAGE_BITMAP, 100, 34, LR_LOADFROMFILE);

//1.bmp-->g_memdc
SelectObject(g_memdc, bmp);

return TRUE;
}

//游戏的绘制
VOID GamePaint(HWND hwnd)
{
//2.g_back-->g_bufdc
SelectObject(g_bufdc,g_back); //没有东西!
//3.g_bufdc->g_memdc
BitBlt(g_memdc, 0, 0, WINDOW_WIDTH, g_backoffset, g_bufdc, 0, 2408 - g_backoffset, SRCCOPY);
BitBlt(g_memdc, 0, g_backoffset, WINDOW_WIDTH, 2408 - g_backoffset, g_bufdc, 0, 0, SRCCOPY);

if (++g_backoffset >= 2408)
g_backoffset = 0;

//自己的飞机
SelectObject(g_bufdc, g_mine);
BitBlt(g_memdc, pMine->x, pMine->y, 100, 100, g_bufdc, 0, 0, SRCAND);
BitBlt(g_memdc, pMine->x, pMine->y, 100, 100, g_bufdc, 100, 0, SRCPAINT);

//子弹
g_tBellutCreateNow=GetTickCount();
if (g_tBellutCreateNow - g_tBellutCreatePre >= 500)
{
AddNode(pBellut, 1);
g_tBellutCreatePre = g_tBellutCreateNow;
}
Node* ptemp = pBellut->pnext;
SelectObject(g_bufdc, g_bellut);
while (ptemp != NULL)
{
BitBlt(g_memdc, ptemp->x, ptemp->y, 60, 25, g_bufdc, 60, 0, SRCAND);
BitBlt(g_memdc, ptemp->x, ptemp->y, 60, 25, g_bufdc, 0, 0, SRCPAINT);
ptemp = ptemp->pnext;
}

//敌机
g_tEnemyCreateNow = GetTickCount();
if (g_tEnemyCreateNow - g_tEnemyCreatePre >= 500)
{
AddNode(pEnemy, 2);
g_tEnemyCreatePre = g_tEnemyCreateNow;
}
Node* ptemp1 = pEnemy->pnext;
SelectObject(g_bufdc, g_enemy);
while (ptemp1 != NULL)
{
BitBlt(g_memdc, ptemp1->x, ptemp1->y, 50, 34, g_bufdc, 0, 0, SRCAND);
BitBlt(g_memdc, ptemp1->x, ptemp1->y, 50, 34, g_bufdc, 50, 0, SRCPAINT);
ptemp1 = ptemp1->pnext;
}
//4.g_memdc->g_hdc
BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_memdc, 0, 0, SRCCOPY);
g_tpre = GetTickCount();
}

void CreateList()
{
//敌机
pEnemy = (Node*)malloc(sizeof(Node));
pEnemy->pnext = NULL;

//子弹
pBellut = (Node*)malloc(sizeof(Node));
pBellut->pnext = NULL;

//自己飞机的x y 完成!!
pMine = (Node*)malloc(sizeof(Node));
pMine->x=350;
pMine->y=500;
pMine->pnext = NULL;

g_tBellutCreatePre = GetTickCount();
g_tEnemyCreatePre = GetTickCount();
g_tBellutMovePre = GetTickCount();
g_tEnemyMovePre = GetTickCount();
}

//添加节点!!! 敌机 子弹
void AddNode(Node* P, int n)
{
Node* pnew = (Node*)malloc(sizeof(Node));
pnew->pnext = NULL;

if (n == 1) //子弹
{
pnew->x = pMine->x+20;
pnew->y = pMine->y;
}
if (n == 2) //敌机 //子弹 敌机绘制出来!!!
{
pnew->x=rand()%(WINDOW_WIDTH-100);
pnew->y=0;
}
pnew->pnext = P->pnext;
P->pnext = pnew;
}

void Move(Node* P, int n)
{
if (n == 1)
{
P = pBellut->pnext;
while (P != NULL)
{
P->y -= 5;
P = P->pnext;
}
}
else if (n == 2)
{
P = pEnemy->pnext;
while (P != NULL)
{
P->y += 5;
P = P->pnext;
}
}
}

//子弹 飞机 两个链表!!! 遍历两个链表!
void Shoot(HWND hwnd)
{
Node* pdr = pEnemy->pnext;
while (pdr != NULL)
{
if (pdr->x > +pMine->x - 50 && pdr->x <= pMine->x + 100 &&
pdr->y >= pMine->y - 34 && pdr->y <= pMine->y + 100)
{
MessageBox(hwnd, "翻车了,老司机清下车!!", "消息", MB_OK);
PostQuitMessage(0);
break;
}
else
{
pdr = pdr->pnext;
}
}
}


“feijidazhan.exe”: 已加载“C:\Windows\SysWOW64\dwmapi.dll”,Cannot find or open the PDB file
“feijidazhan.exe”: 已加载“C:\Program Files (x86)\lingbo\NetClass\swgl.dll”,未使用调试信息生成二进制文件。
“feijidazhan.exe”: 已加载“C:\Windows\SysWOW64\imagehlp.dll”,Cannot find or open the PDB file
feijidazhan.exe 中的 0x00382239 处最可能的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突
feijidazhan.exe 中的 0x00382239 处有未经处理的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突
程序“[8904] feijidazhan.exe: 本机”已退出,返回值为 -1073741819 (0xc0000005)。
...全文
1096 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
一只懵 2017-12-27
  • 打赏
  • 举报
回复
有没有大神能给我加一个子弹射中敌机的代码,这样也给分!
一只懵 2017-12-27
  • 打赏
  • 举报
回复
希望大家能帮帮忙,因为做课程设计比较赶时间
一只懵 2017-12-27
  • 打赏
  • 举报
回复
刚刚找了也找不出来
paschen 2017-12-27
  • 打赏
  • 举报
回复
出错了中断下来,通过调用堆栈定位到相关位置,分析原因,检查是否使用了无效的指针导致该错误,必要时单步跟踪程序来检查

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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