鱼C论坛

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

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

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

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

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

x
  刚学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,         //y  nHeight
                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[NUM+1];
                static int x=0,y=0;
                static int shiwux,shiwuy;
                static int length=1;
                static int cxClient,cyClient;
                static RECT Rect[2];
                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[0].y=y;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;
                                case VK_DOWN:y=y+15;apt[0].y=y;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;
                                case VK_LEFT:x=x-15;apt[0].x=x;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ pd=1;}break;
                                case VK_RIGHT:x=x+15;apt[0].x=x;InvalidateRect(hwnd,NULL,TRUE);if(PtInRect(Rect,apt[0])){ 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[i].x=apt[i-1].x;
                                  apt[i].y=apt[i-1].y;
                                }//坐标顺移,蛇身体变长
                                for(i=0;i<length;i++)
                                {
                                   xin(hdc,1,1,apt[i].x,apt[i].y); 
                                }//画心型的贪吃蛇
                                
                
                EndPaint(hwnd, &ps);
                return 0;


                case WM_MOUSEMOVE:
                                

                            x=GET_X_LPARAM(lParam);
                                y=GET_Y_LPARAM(lParam);

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

                                return 0;
                           
                case WM_LBUTTONUP:
                                return 0;
            case WM_DESTROY:                                                             //窗口关闭
                PostQuitMessage(0);
                return 0;

        }

        return DefWindowProc(hwnd, message, wParam, lParam);//windows处理其他消息
}
想知道小甲鱼最近在做啥?请访问 -> 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 编辑

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



void xin(HDC hdc,int xinx,int xiny,int xinxg,int xinyg)
{
                        POINT apt[4]={10+xinxg,10+xinyg,5+xinxg,5+xinyg,7+xinxg,15+xinyg,10+xinxg,15.5+xinyg};
                POINT apt2[4]={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[k].x+=20;
                                          apt2[k].x+=20;
                                        }
                                        PolyBezier(hdc,apt,4);
                                    PolyBezier(hdc,apt2,4);
                                  }
                                  for(j=0;j<xinx-1;j++)
                                  {
                                    for(k=0;k<=3;k++)
                                        {
                                          apt[k].x-=20;
                                          apt2[k].x-=20;
                                        }
                                  }
                                  for(j=0;j<=3;j++)
                                  {
                                    apt[j].y+=20;
                                    apt2[j].y+=20;
                                  }
                                }
}
想知道小甲鱼最近在做啥?请访问 -> 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-11-24 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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