明月一弯浅笑 发表于 2017-8-2 00:00:39

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处理其他消息
}

明月一弯浅笑 发表于 2017-8-2 00:06:10

这是正常情况
http://a3.qpic.cn/psb?/V11Yl7Gz1y0VzY/g8h0gCdVSZ3FlnIc3k8HKZos4U1Xo5xDdTsQir2HjvE!/b/dLMAAAAAAAAA&bo=2wSAAgAAAAADAHg!&rf=viewer_4

明月一弯浅笑 发表于 2017-8-2 00:06:43

http://a3.qpic.cn/psb?/V11Yl7Gz1y0VzY/g.ZxMESF*SRRbvcld.Ld6e8sWUiZWtjPuuuP.PmCZcI!/b/dBkBAAAAAAAA&bo=sQGgAQAAAAADADQ!&rf=viewer_4
非正常情况

小甲鱼 发表于 2017-8-2 01:51:10

{:10_266:} QQ空间的图片不能通过外链引用哦……

明月一弯浅笑 发表于 2017-8-2 11:12:38

本帖最后由 明月一弯浅笑 于 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 11:16:49

小甲鱼 发表于 2017-8-2 01:51
QQ空间的图片不能通过外链引用哦……

大哥我贴了头文件。。。。图片我再去试试

明月一弯浅笑 发表于 2017-8-2 11:20:45

小甲鱼 发表于 2017-8-2 01:51
QQ空间的图片不能通过外链引用哦……

可以正常玩一两分钟,然后会变成黑色,方块会神秘地消失,每次都是如此,您有时间可以试试,我不知道问题在哪,谢谢了。{:5_92:}
页: [1]
查看完整版本: windows sdk 类似贪吃蛇 偶尔运行出错