鱼C论坛

 找回密码
 立即注册
查看: 2419|回复: 6

windows sdk 类似贪吃蛇 偶尔运行出错

[复制链接]
发表于 2017-8-2 00:00:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  刚学sdk的小白,遇到了bug也是不知道怎么办。这是一个类似贪吃蛇的程序,刚运行一切正常,可是每次玩一小会就会出问题,蛇的颜色会变成黑色,随机的小方块不出现了。
  
  写了一部分就出问题了,好绝望,代码贴上,希望求得解决方法,谢谢。

  1. /* -------------------------------------------------------------------
  2.                     MyWindows.c -- 基本窗口模型  
  3.                                 《Windows 程序设计(SDK)》视频教程                    
  4. --------------------------------------------------------------------*/

  5. #include <windows.h>
  6. #include <Windowsx.h>
  7. #include "xinxin.h"
  8. #define NUM 10000

  9. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  10. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  11. {
  12.         static TCHAR szAppName[] = TEXT("MyWindows");//定义一个窗口类名字
  13.         HWND hwnd;                                   //窗口句柄
  14.         MSG msg;                                     //消息结构
  15.         WNDCLASS wndclass;                           //窗口类结构     //声明

  16.         wndclass.style = CS_HREDRAW | CS_VREDRAW;    //指定窗口类型
  17.         wndclass.lpfnWndProc = WndProc;              //指定窗口过程
  18.         wndclass.cbClsExtra = 0;                     //预留的额外空间
  19.         wndclass.cbWndExtra = 0;                    
  20.         wndclass.hInstance = hInstance;              //应用程序的实例句柄
  21.         wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//为所有基于该窗口类设定一个图标
  22.         wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //为所有基于该窗口类设定一个鼠标指针
  23.         wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//指定窗口背景色
  24.         wndclass.lpszMenuName = NULL;//指定窗口菜单
  25.         wndclass.lpszClassName = szAppName;//指定窗口类名

  26.         if (!RegisterClass(&wndclass))//注册
  27.         {
  28.                 MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
  29.                 return 0;
  30.         }

  31.         hwnd = CreateWindow(szAppName, //窗口类名称lpClassName     
  32.                 TEXT("鱼C工作室"),     //窗口标题lpWindowName
  33.                 WS_OVERLAPPEDWINDOW,   //窗口风格dwStyle
  34.                 CW_USEDEFAULT,         //初始x坐标           CW CreatWindow创建窗口选项
  35.                 CW_USEDEFAULT,         //y
  36.                 CW_USEDEFAULT,         //初始x方向尺寸nWidth
  37.                 CW_USEDEFAULT,         //y  nHeight
  38.                 NULL,                  //父窗口句柄hWndParent
  39.                 NULL,                  //窗口菜单句柄hMenu
  40.                 hInstance,             //程序实例句柄hInstance
  41.                 NULL);                 //创建参数lpParam
  42.         
  43.         ShowWindow(hwnd, iCmdShow);     //显示窗口
  44.         UpdateWindow(hwnd);             //更新窗口

  45.         while (GetMessage(&msg, NULL, 0, 0))
  46.         {
  47.                 TranslateMessage(&msg); //翻译消息
  48.                 DispatchMessage(&msg);  //分配消息  调用
  49.         }                               //消息循环

  50.         return msg.wParam;
  51. }

  52. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  53. {
  54.         HDC hdc;                       //DC:Device Context 设备环境
  55.         PAINTSTRUCT ps;
  56.         RECT rect;
  57.                 int i=0;
  58.                 static POINT apt[NUM+1];
  59.                 static int x=0,y=0;
  60.                 static int shiwux,shiwuy;
  61.                 static int length=1;
  62.                 static int cxClient,cyClient;
  63.                 static RECT Rect[2];
  64.                 static int pd=1;//判断
  65.                 int sum=0;
  66.         switch (message)
  67.         {
  68.                 case WM_SIZE:
  69.                             cxClient=LOWORD(lParam);
  70.                                 cyClient=HIWORD(lParam);
  71.                             return 0;
  72.                 case WM_KEYDOWN:
  73.                             switch(wParam)
  74.                                 {
  75.                                 case VK_UP:y=y-15;apt[0].y=y;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;
  76.                                 case VK_DOWN:y=y+15;apt[0].y=y;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;
  77.                                 case VK_LEFT:x=x-15;apt[0].x=x;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;
  78.                                 case VK_RIGHT:x=x+15;apt[0].x=x;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;//键盘移动
  79.                                 }
  80.                                 return 0;
  81.         case WM_PAINT:                                                            //绘制窗口
  82.                 hdc = BeginPaint(hwnd, &ps);                                        //绘制的初始化 ps:paintstruct存放绘画有关的参数
  83.                 GetClientRect(hwnd, &rect);                                         //获得客户区的位置坐标信息
  84.                                 if(pd==1)
  85.                                 {
  86.                                 shiwux=rand()%(cxClient-15);
  87.                                 shiwuy=rand()%(cyClient-15);
  88.                                 pd=0;
  89.                                 length++;
  90.                                 }
  91.                                 SetRect(Rect,shiwux,shiwuy,shiwux+15,shiwuy+15);
  92.                                 FillRect(hdc,Rect,CreateSolidBrush(RGB(0,0,255)));//食物,填充随机矩形


  93.                                 SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,0,255)));
  94.                                 for(i=length;i>0;i--)
  95.                                 {
  96.                                   apt[i].x=apt[i-1].x;
  97.                                   apt[i].y=apt[i-1].y;
  98.                                 }//坐标顺移,蛇身体变长
  99.                                 for(i=0;i<length;i++)
  100.                                 {
  101.                                    xin(hdc,1,1,apt[i].x,apt[i].y);
  102.                                 }//画心型的贪吃蛇
  103.                                
  104.                
  105.                 EndPaint(hwnd, &ps);
  106.                 return 0;


  107.                 case WM_MOUSEMOVE:
  108.                                

  109.                             x=GET_X_LPARAM(lParam);
  110.                                 y=GET_Y_LPARAM(lParam);

  111.                                 apt[0].x=x;
  112.                                 apt[0].y=y;//获取鼠标坐标
  113.                                 InvalidateRect(hwnd,NULL,TRUE);
  114.                                 if(PtInRect(Rect,apt[0]))//判断坐标是否在矩形中
  115.                                 {
  116.                                   pd=1;
  117.                                 }

  118.                                 return 0;
  119.                           
  120.                 case WM_LBUTTONUP:
  121.                                 return 0;
  122.             case WM_DESTROY:                                                             //窗口关闭
  123.                 PostQuitMessage(0);
  124.                 return 0;

  125.         }

  126.         return DefWindowProc(hwnd, message, wParam, lParam);//windows处理其他消息
  127. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-8-2 00:06:10 | 显示全部楼层
这是正常情况

                               
登录/注册后可看大图


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-2 00:06:43 | 显示全部楼层

                               
登录/注册后可看大图

非正常情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-2 01:51:10 | 显示全部楼层
QQ空间的图片不能通过外链引用哦……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-2 11:12:38 | 显示全部楼层
本帖最后由 明月一弯浅笑 于 2017-8-2 11:16 编辑

那个头文件我也贴上吧  大哥你要不要自己试试 我实在不会贴图







  1. void xin(HDC hdc,int xinx,int xiny,int xinxg,int xinyg)
  2. {
  3.                         POINT apt[4]={10+xinxg,10+xinyg,5+xinxg,5+xinyg,7+xinxg,15+xinyg,10+xinxg,15.5+xinyg};
  4.                 POINT apt2[4]={10+xinxg,10+xinyg,15+xinxg,5+xinyg,13+xinxg,15+xinyg,10+xinxg,15.5+xinyg};
  5.                 int i,j,k;
  6.           for(i=0;i<xiny;i++)
  7.                                 {
  8.                                   PolyBezier(hdc,apt,4);
  9.                                   PolyBezier(hdc,apt2,4);
  10.                                   for(j=0;j<xinx-1;j++)
  11.                                   {
  12.                                     for(k=0;k<=3;k++)
  13.                                         {
  14.                                           apt[k].x+=20;
  15.                                           apt2[k].x+=20;
  16.                                         }
  17.                                         PolyBezier(hdc,apt,4);
  18.                                     PolyBezier(hdc,apt2,4);
  19.                                   }
  20.                                   for(j=0;j<xinx-1;j++)
  21.                                   {
  22.                                     for(k=0;k<=3;k++)
  23.                                         {
  24.                                           apt[k].x-=20;
  25.                                           apt2[k].x-=20;
  26.                                         }
  27.                                   }
  28.                                   for(j=0;j<=3;j++)
  29.                                   {
  30.                                     apt[j].y+=20;
  31.                                     apt2[j].y+=20;
  32.                                   }
  33.                                 }
  34. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-2 11:16:49 | 显示全部楼层
小甲鱼 发表于 2017-8-2 01:51
QQ空间的图片不能通过外链引用哦……

大哥我贴了头文件。。。。图片我再去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-2 11:20:45 | 显示全部楼层
小甲鱼 发表于 2017-8-2 01:51
QQ空间的图片不能通过外链引用哦……

可以正常玩一两分钟,然后会变成黑色,方块会神秘地消失,每次都是如此,您有时间可以试试,我不知道问题在哪,谢谢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 10:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表