[游戏模版17] Win32 推箱子 迷宫

简介:


 

>_<:Here introduce a simple game:

>_<:resource

>_<:only can push a box and finally arrive the gate.

复制代码
  1 #include <windows.h>
  2 // C 运行时头文件
  3 #include <stdlib.h>
  4 #include <cstdio>
  5 #include <malloc.h>
  6 #include <memory.h>
  7 #include <tchar.h>
  8 #include <time.h>
  9 #include <string>
 10 #include <stack>
 11 
 12 HINSTANCE hInst;
 13 
 14 HBITMAP ball,tile,dis;
 15 HDC hdc,mdc,bufdc;
 16 HWND hWnd;
 17 DWORD tPre,tNow;
 18 int nowPos,prePos;//在上次贴图位置贴白色去除残留影响
 19 bool FIND;
 20 int rows=5,cols=5;
 21 int kind[]={5,8,8,10,10,10,16,16,16,16,20,20,20,20,25,25,25,25,25},KindNum=0;
 22 int bilv=400/rows;
 23 int Dis;//终点位置
 24 int mapIndex[160000]={0,2,0,0,0,0,0,0,
 25                          0,1,0,1,1,1,1,0,
 26                          0,1,0,1,0,1,1,0,
 27                          0,1,0,0,0,1,1,0,
 28                          0,1,1,1,1,1,1,0,
 29                          0,1,0,0,0,0,1,0,
 30                          0,0,1,1,1,1,1,0,
 31                          0,0,0,0,0,0,3,0};
 32 
 33 int record[160000];//用来标记不可走方格或已经走过的方格
 34 // 此代码模块中包含的函数的前向声明:
 35 ATOM                MyRegisterClass(HINSTANCE hInstance);
 36 BOOL                InitInstance(HINSTANCE, int);
 37 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 38 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 39 void                MyPaint(HDC hdc);
 40 void                CreateMiGong(int Hang);
 41 void                PreparePaint();//准备阶段绘图
 42 
 43 int APIENTRY _tWinMain(HINSTANCE hInstance,
 44                      HINSTANCE hPrevInstance,
 45                      LPTSTR    lpCmdLine,
 46                      int       nCmdShow){
 47 
 48     MSG msg;
 49     MyRegisterClass(hInstance);
 50     // 执行应用程序初始化:
 51     if (!InitInstance (hInstance, nCmdShow)){
 52         return FALSE;
 53     }
 54     // 主消息循环:
 55     while (GetMessage(&msg, NULL, 0, 0)){
 56         TranslateMessage(&msg);
 57         DispatchMessage(&msg);
 58     }
 59     return (int) msg.wParam;
 60 }
 61 
 62 //  函数: MyRegisterClass()
 63 //
 64 //  目的: 注册窗口类。
 65 ATOM MyRegisterClass(HINSTANCE hInstance){
 66     WNDCLASSEX wcex;
 67 
 68     wcex.cbSize = sizeof(WNDCLASSEX);
 69 
 70     wcex.style            = CS_HREDRAW | CS_VREDRAW;
 71     wcex.lpfnWndProc    = WndProc;
 72     wcex.cbClsExtra        = 0;
 73     wcex.cbWndExtra        = 0;
 74     wcex.hInstance        = hInstance;
 75     wcex.hIcon            = NULL;
 76     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
 77     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
 78     wcex.lpszMenuName    = "Beautifulzzzz";
 79     wcex.lpszClassName    = "Beautifulzzzz";
 80     wcex.hIconSm        = NULL;
 81 
 82     return RegisterClassEx(&wcex);
 83 }
 84 
 85 //   函数: InitInstance(HINSTANCE, int)
 86 //
 87 //   目的: 保存实例句柄并创建主窗口
 88 //
 89 //   注释:
 90 //
 91 //        在此函数中,我们在全局变量中保存实例句柄并
 92 //        创建和显示主程序窗口。
 93 //        1.设定飞机的初始位置
 94 //        2.设定鼠标位置及隐藏
 95 //        3.设定鼠标光标移动区域
 96 //
 97 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
 98 
 99    HBITMAP bmp;
100 
101    hInst = hInstance; // 将实例句柄存储在全局变量中
102 
103    hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,
104       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
105 
106    if (!hWnd)
107    {
108       return FALSE;
109    }
110 
111    MoveWindow(hWnd,10,10,640,480,true);
112    ShowWindow(hWnd, nCmdShow);
113    UpdateWindow(hWnd);
114 
115    hdc=GetDC(hWnd);
116    mdc=CreateCompatibleDC(hdc);
117    bufdc=CreateCompatibleDC(hdc);
118 
119     bmp=CreateCompatibleBitmap(hdc,cols*bilv,rows*bilv);
120    SelectObject(mdc,bmp);
121 
122    PreparePaint();
123 
124    SetTimer(hWnd,1,220,NULL);
125    MyPaint(hdc);
126 
127    return TRUE;
128 }
129 
130 //
131 //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
132 //
133 //  目的: 处理主窗口的消息。
134 //
135 //  WM_COMMAND    - 处理应用程序菜单
136 //  WM_PAINT    - 绘制主窗口
137 //  WM_DESTROY    - 发送退出消息并返回
138 //
139 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
140     int wmId, wmEvent;
141     int rowNum,colNum;
142     int x,y,up,down,left,right;
143     PAINTSTRUCT ps;
144 
145     switch (message)
146     {
147     case WM_KEYDOWN:
148         rowNum=nowPos/cols;
149         colNum=nowPos%rows;
150         x=colNum*bilv;
151         y=rowNum*bilv;
152 
153         up=nowPos-cols;
154         down=nowPos+cols;
155         left=nowPos-1;
156         right=nowPos+1;
157 
158         switch(wParam){//上下左右
159         case VK_UP:
160             if(up>=0 && mapIndex[up])//往上走
161             {
162                 prePos=nowPos;
163                 nowPos=up;
164 
165                 if(mapIndex[nowPos]==3)
166                     FIND=true;
167 
168                 MyPaint(hdc);
169             }
170             else if(up>=cols && !mapIndex[up] && mapIndex[up-cols]==1)//向上推箱子
171             {
172                 mapIndex[up]=1;
173                 mapIndex[up-cols]=0;
174                 SelectObject(bufdc,tile);
175                 BitBlt(mdc,bilv*((up-cols)%rows),bilv*((up-cols)/cols),bilv,bilv,bufdc,0,0,SRCCOPY);
176 
177                 prePos=nowPos;
178                 nowPos=up;
179 
180                 MyPaint(hdc);
181             }break;
182         case VK_DOWN:
183             if(down<=cols*rows-1 && mapIndex[down])//往下走
184             {
185                 prePos=nowPos;
186                 nowPos=down;
187 
188                 if(mapIndex[nowPos]==3)
189                      FIND=true;
190 
191                 MyPaint(hdc);
192             }
193             else if(down<=cols*rows-cols-1 && !mapIndex[down] && mapIndex[down+cols]==1)//向下推箱子
194             {
195                 mapIndex[down]=1;
196                 mapIndex[down+cols]=0;
197                 SelectObject(bufdc,tile);
198                 BitBlt(mdc,bilv*((down+cols)%rows),bilv*((down+cols)/cols),bilv,bilv,bufdc,0,0,SRCCOPY);
199 
200                 prePos=nowPos;
201                 nowPos=down;
202 
203                 MyPaint(hdc);
204             }break;
205         case VK_LEFT:
206             if(left>=rowNum*cols && mapIndex[left])//往左走
207             {
208                 prePos=nowPos;
209                 nowPos=left;
210 
211                 if(mapIndex[nowPos]==3)
212                     FIND=true;
213 
214                 MyPaint(hdc);
215             }
216             else if(left>=rowNum*cols+1 && !mapIndex[left] && mapIndex[left-1]==1)//往左推箱子
217             {
218                 mapIndex[left]=1;
219                 mapIndex[left-1]=0;
220                 SelectObject(bufdc,tile);
221                 BitBlt(mdc,bilv*((left-1)%rows),bilv*((left-1)/cols),bilv,bilv,bufdc,0,0,SRCCOPY);
222 
223                 prePos=nowPos;
224                 nowPos=left;
225 
226                 MyPaint(hdc);
227             }break;
228         case VK_RIGHT:
229             if(right<=(rowNum+1)*cols-1 &&  mapIndex[right])//往右走
230             {
231                 prePos=nowPos;
232                 nowPos=right;
233 
234                 if(mapIndex[nowPos]==3)
235                     FIND=true;
236 
237                 MyPaint(hdc);
238             }
239             else if(right<=(rowNum+1)*cols-2 &&  !mapIndex[right] && mapIndex[right+1]==1)//往右推箱子
240             {
241                 mapIndex[right]=1;
242                 mapIndex[right+1]=0;
243                 SelectObject(bufdc,tile);
244                 BitBlt(mdc,bilv*((right+1)%rows),bilv*((right+1)/cols),bilv,bilv,bufdc,0,0,SRCCOPY);
245 
246                 prePos=nowPos;
247                 nowPos=right;
248 
249                 MyPaint(hdc);
250             }break;
251         }
252         break;
253     case WM_TIMER:
254         A:MyPaint(hdc);
255         break;
256     case WM_PAINT:
257         hdc = BeginPaint(hWnd, &ps);
258         goto A;// TODO: 在此添加任意绘图代码...
259         EndPaint(hWnd, &ps);
260         break;
261     case WM_DESTROY:
262         DeleteDC(mdc);
263         DeleteDC(bufdc);
264         DeleteObject(ball);
265         DeleteObject(tile);
266 
267         KillTimer(hWnd,1);
268         ReleaseDC(hWnd,hdc);
269         PostQuitMessage(0);
270         break;
271     default:
272         return DefWindowProc(hWnd, message, wParam, lParam);
273     }
274     return 0;
275 }
276 
277 void MyPaint(HDC hdc){
278     char* str;
279     int rowNum,colNum;
280     int x,y;
281     int up,down,left,right;
282 
283     //清除上次贴图
284     rowNum=prePos/cols;
285     colNum=prePos%rows;
286     x=colNum*bilv;
287     y=rowNum*bilv;
288     SelectObject(bufdc,ball);
289     BitBlt(mdc,x,y,bilv,bilv,bufdc,0,0,WHITENESS);
290 
291     //小球贴图
292     rowNum=nowPos/cols;
293     colNum=nowPos%rows;
294     x=colNum*bilv;
295     y=rowNum*bilv;
296     SelectObject(bufdc,ball);
297     BitBlt(mdc,x,y,bilv,bilv,bufdc,0,0,SRCCOPY);
298 
299     if(!FIND){
300         str = "找寻出口中...";
301     }else{
302         str="找到出口了!";
303         cols=rows=kind[(++KindNum)%19];
304         PreparePaint();
305     }
306 
307     rowNum=Dis/cols;
308     colNum=Dis%rows;
309     x=colNum*bilv;
310     y=rowNum*bilv;
311     SelectObject(bufdc,dis);
312     BitBlt(mdc,x,y,bilv,bilv,bufdc,0,0,SRCCOPY);
313 
314     TextOutA(hdc,430,10,str,strlen(str));
315     BitBlt(hdc,10,10,cols*bilv,rows*bilv,mdc,0,0,SRCCOPY);
316 }
317 /*生成迷宫函数*/
318 void CreateMiGong(int Hang){
319     srand((unsigned)time(NULL));
320     for(int i=0;i<Hang*Hang;i++)
321         mapIndex[i]=rand()%2;
322     mapIndex[rand()%(Hang*Hang)]=2;
323     mapIndex[Dis=rand()%(Hang*Hang)]=3;
324 }
325 /*准备阶段贴图*/
326 void PreparePaint(){
327     bilv=400/rows;
328     tile=(HBITMAP)LoadImageA(NULL,"tile.bmp",IMAGE_BITMAP,bilv,bilv,LR_LOADFROMFILE);
329     ball=(HBITMAP)LoadImageA(NULL,"ball.bmp",IMAGE_BITMAP,bilv,bilv,LR_LOADFROMFILE);
330     dis=(HBITMAP)LoadImageA(NULL,"dis.bmp",IMAGE_BITMAP,bilv,bilv,LR_LOADFROMFILE);
331 
332     int rowNum,colNum,x,y;
333     CreateMiGong(cols);
334    //按照mapIndex数组中的定义进行迷宫拼接
335    //贴上终点
336    for(int i=0;i<rows*cols;i++){
337        record[i]=mapIndex[i];
338 
339        rowNum=i/cols;//列编号
340        colNum=i%rows;//行编号
341        x=colNum*bilv;//求贴图x坐标
342        y=rowNum*bilv;//求贴图y坐标
343 
344        SelectObject(bufdc,tile);
345 
346        if(!mapIndex[i])//
347            BitBlt(mdc,x,y,bilv,bilv,bufdc,0,0,SRCCOPY);
348        else {
349            if(mapIndex[i]==2){//迷宫入口
350                nowPos=i;
351                mapIndex[i]=1;
352            }
353            BitBlt(mdc,x,y,bilv,bilv,bufdc,0,0,WHITENESS);
354        }
355    }
356    prePos=cols*rows+1;//第一次在窗口外绘图不影响效果,以后记录上一次小球位置并贴图覆盖原来小球影像
357    FIND=false;
358 }
复制代码
相关文章
|
2月前
|
人工智能 自然语言处理 安全
2026年新手零门槛解锁OpenClaw/Clawdbot部署+WhatsApp接入教程指南
在AI自动化工具全面普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令驱动+全场景任务自动执行”的核心优势,成为个人、跨境从业者及轻量团队的必备智能助手——它无需专业编程基础,无需手动配置复杂运行环境,就能轻松实现文件管理、联网搜索、跨境信息同步、批量消息推送等多元化操作,完美适配WhatsApp的高频使用场景。而阿里云推出的OpenClaw一键部署方案,依托云端基础设施的稳定性与自动化部署能力,预置专属优化镜像、整合所有核心依赖,彻底打破了新手的技术门槛,哪怕你完全不懂服务器、不懂代码,跟着步骤15-20分钟就能完成部署,部署后通过简单配置即可快速接入
548 2
|
3月前
|
缓存 编解码 分布式计算
阿里云8核16G/32G/64G高配置云服务器测评解析:实例规格、价格与选型指南
阿里云 8 核系列高配置云服务器通过计算型、通用型、内存型的差异化设计,覆盖企业从计算密集到内存密集的全场景需求,同时依托折扣券、长期套餐等优惠政策降低成本。企业选型时需明确业务核心需求 —— 计算优先选 c 系列、均衡需求选 g 系列、大内存需求选 r 系列,同时结合地域、使用周期优化成本。如需获取实时价格或技术细节,可参考阿里云官方文档,确保配置与业务需求精准匹配,实现高效稳定的云上部署。
|
5月前
|
自然语言处理 算法
RAG模型革命:大模型时代的问答系统最佳实践揭秘
RAG模型革新问答系统,融合检索与生成,精准检索海量数据,生成自然回答,解锁大模型时代问答新篇章。
|
5月前
|
IDE 开发工具 C++
从代码到芯片:CLion 2025.1如何重构嵌入式开发全流程,安装步骤+安装包
JetBrains CLion 2025.1 是一款专业 C/C++ 跨平台 IDE,提升开发效率。支持项目外文件分析、增强调试(含 Qt 渲染)、STM32 调试优化,集成 Zephyr 构建,并免费开放 AI 助手功能,兼容主流云模型,打造智能编程体验。
485 0
从代码到芯片:CLion 2025.1如何重构嵌入式开发全流程,安装步骤+安装包
|
6月前
|
机器学习/深度学习 人工智能
AI重塑电商拍摄:技术驱动的商业变革——5款AI模特图生成工具技术分析
AI技术正重塑电商拍摄:低成本、高效率生成逼真模特图,支持批量换装、换背景,助力商家快速上架、灵活试错。燕雀光年、Kaiber等工具实测好用,未来AI与实拍将互补共存。
746 0
|
7月前
|
安全 数据建模 网络安全
阿里云申请SSL证书价格多少钱一年?免费版和付费版手动整理
阿里云SSL证书提供免费及多种付费选择,免费版为Digicert品牌,有效期3个月。付费证书涵盖DV、OV、EV类型,品牌包括DigiCert、GlobalSign等,价格从238元至万元不等,满足不同网站安全需求。
546 0
|
11月前
|
缓存 安全 JavaScript
WordPress主题实用指南(最新完整版)
《WordPress主题实用指南(最新完整版)》全面解析了WordPress主题开发的核心技术与最佳实践。内容涵盖主题架构、模板开发、Hook系统应用、性能优化、安全防护、现代功能集成、调试维护及商业化开发规范八大章节。从标准模板层级结构到子主题开发,从条件标签到自定义文章类型,再到数据库查询优化与资源加载策略,本书深入浅出地讲解了WordPress主题开发的各个环节。同时,针对安全性与国际化需求,提供了输入验证、文件上传保护及多语言支持的实现方法。最后,通过自动化测试与更新系统的集成,帮助开发者打造高效、稳定且符合商业标准的主题产品。无论是初学者还是资深开发者,都能从中受益匪浅。
248 13
|
机器学习/深度学习 存储 人工智能
大厂技术实现 | 图像检索及其在淘宝的应用 @计算机视觉系列
图像检索任务指的是,给定查询图像,从图像数据库中找到包含相同或相似实例的图像。典型应用之一就是电商商品检索,如淘宝拍立淘,只需要用户随手拍照即可精准检索,提高了电商购物的体验。本篇我们来看看淘宝拍立淘背后的实现方案和依托的计算机视觉技术。
7244 5
大厂技术实现 | 图像检索及其在淘宝的应用 @计算机视觉系列
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
1147 0
|
Shell 数据库 数据安全/隐私保护

热门文章

最新文章