windows sdk 类似贪吃蛇 偶尔运行出错
刚学sdk的小白,遇到了bug也是不知道怎么办。这是一个类似贪吃蛇的程序,刚运行一切正常,可是每次玩一小会就会出问题,蛇的颜色会变成黑色,随机的小方块不出现了。写了一部分就出问题了,好绝望,代码贴上,希望求得解决方法,谢谢。
/* -------------------------------------------------------------------
MyWindows.c -- 基本窗口模型
《Windows 程序设计(SDK)》视频教程
--------------------------------------------------------------------*/
#include <windows.h>
#include <Windowsx.h>
#include "xinxin.h"
#define NUM 10000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("MyWindows");//定义一个窗口类名字
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("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, //窗口类名称lpClassName
TEXT("鱼C工作室"), //窗口标题lpWindowName
WS_OVERLAPPEDWINDOW, //窗口风格dwStyle
CW_USEDEFAULT, //初始x坐标 CW CreatWindow创建窗口选项
CW_USEDEFAULT, //y
CW_USEDEFAULT, //初始x方向尺寸nWidth
CW_USEDEFAULT, //ynHeight
NULL, //父窗口句柄hWndParent
NULL, //窗口菜单句柄hMenu
hInstance, //程序实例句柄hInstance
NULL); //创建参数lpParam
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; //DC:Device Context 设备环境
PAINTSTRUCT ps;
RECT rect;
int i=0;
static POINT apt;
static int x=0,y=0;
static int shiwux,shiwuy;
static int length=1;
static int cxClient,cyClient;
static RECT Rect;
static int pd=1;//判断
int sum=0;
switch (message)
{
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:y=y-15;apt.y=y;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt)){ pd=1;}break;
case VK_DOWN:y=y+15;apt.y=y;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt)){ pd=1;}break;
case VK_LEFT:x=x-15;apt.x=x;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt)){ pd=1;}break;
case VK_RIGHT:x=x+15;apt.x=x;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt)){ pd=1;}break;//键盘移动
}
return 0;
case WM_PAINT: //绘制窗口
hdc = BeginPaint(hwnd, &ps); //绘制的初始化 ps:paintstruct存放绘画有关的参数
GetClientRect(hwnd, &rect); //获得客户区的位置坐标信息
if(pd==1)
{
shiwux=rand()%(cxClient-15);
shiwuy=rand()%(cyClient-15);
pd=0;
length++;
}
SetRect(Rect,shiwux,shiwuy,shiwux+15,shiwuy+15);
FillRect(hdc,Rect,CreateSolidBrush(RGB(0,0,255)));//食物,填充随机矩形
SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,0,255)));
for(i=length;i>0;i--)
{
apt.x=apt.x;
apt.y=apt.y;
}//坐标顺移,蛇身体变长
for(i=0;i<length;i++)
{
xin(hdc,1,1,apt.x,apt.y);
}//画心型的贪吃蛇
EndPaint(hwnd, &ps);
return 0;
case WM_MOUSEMOVE:
x=GET_X_LPARAM(lParam);
y=GET_Y_LPARAM(lParam);
apt.x=x;
apt.y=y;//获取鼠标坐标
InvalidateRect(hwnd,NULL,TRUE);
if(PtInRect(Rect,apt))//判断坐标是否在矩形中
{
pd=1;
}
return 0;
case WM_LBUTTONUP:
return 0;
case WM_DESTROY: //窗口关闭
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);//windows处理其他消息
} 这是正常情况
http://a3.qpic.cn/psb?/V11Yl7Gz1y0VzY/g8h0gCdVSZ3FlnIc3k8HKZos4U1Xo5xDdTsQir2HjvE!/b/dLMAAAAAAAAA&bo=2wSAAgAAAAADAHg!&rf=viewer_4
http://a3.qpic.cn/psb?/V11Yl7Gz1y0VzY/g.ZxMESF*SRRbvcld.Ld6e8sWUiZWtjPuuuP.PmCZcI!/b/dBkBAAAAAAAA&bo=sQGgAQAAAAADADQ!&rf=viewer_4
非正常情况 {:10_266:} QQ空间的图片不能通过外链引用哦…… 本帖最后由 明月一弯浅笑 于 2017-8-2 11:16 编辑
那个头文件我也贴上吧大哥你要不要自己试试 我实在不会贴图
{:5_92:}
void xin(HDC hdc,int xinx,int xiny,int xinxg,int xinyg)
{
POINT apt={10+xinxg,10+xinyg,5+xinxg,5+xinyg,7+xinxg,15+xinyg,10+xinxg,15.5+xinyg};
POINT apt2={10+xinxg,10+xinyg,15+xinxg,5+xinyg,13+xinxg,15+xinyg,10+xinxg,15.5+xinyg};
int i,j,k;
for(i=0;i<xiny;i++)
{
PolyBezier(hdc,apt,4);
PolyBezier(hdc,apt2,4);
for(j=0;j<xinx-1;j++)
{
for(k=0;k<=3;k++)
{
apt.x+=20;
apt2.x+=20;
}
PolyBezier(hdc,apt,4);
PolyBezier(hdc,apt2,4);
}
for(j=0;j<xinx-1;j++)
{
for(k=0;k<=3;k++)
{
apt.x-=20;
apt2.x-=20;
}
}
for(j=0;j<=3;j++)
{
apt.y+=20;
apt2.y+=20;
}
}
} 小甲鱼 发表于 2017-8-2 01:51
QQ空间的图片不能通过外链引用哦……
大哥我贴了头文件。。。。图片我再去试试 小甲鱼 发表于 2017-8-2 01:51
QQ空间的图片不能通过外链引用哦……
可以正常玩一两分钟,然后会变成黑色,方块会神秘地消失,每次都是如此,您有时间可以试试,我不知道问题在哪,谢谢了。{:5_92:}
页:
[1]