在本节中,我们谈论的闭合曲线充满,为什么这件事情

当一个场景,当我们递归,我们推标箱,假设没有推箱子。然后跑到哪里都白跑。最好是反复出现歧视坐标都是一样的

这些坐标被反转包含(同样的排序结果)。工的位置(求解算法部分再具体说)

因为场景有多个箱子,每一个箱子能够有几个方向移动。重复的寻路效率不高。起初我想删除路径部分,仅仅检測是否能移动到目标

来提升运行效率,就是偷懒一下,然后想想既然是礼物,偷懒也不是分时候,也有脸献给别人于是废弃了A×算法

目的就非常明显了。标定全部能到达的位置。检測的时候就不用寻他妹的路了,直接检測是否被填充就可以

那么怎样填充一个闭合的曲线呢?最简单的逻辑是:

1.往周围4个或8个方向,记录全部不是边界。没被填充的点并填充

2.递归这些点,直到没有新的点被检測到

递归,又是递归。这是自交么?罪过啊!

万恶的递归,可怜的堆栈……

上面的方法实现非常easy,只是有非常多点会被重复检測若干次,效率并不太高

第二种方法就是我们要说的:扫描线种子填充算法

主要逻辑思想是:

1.把坐标换成线段,记录最左和最右断点。填充线段,增加队列(取代递归)

2.填充最先增加队列的线段,检查上一行和下一行,把相邻的线段都加进来,从队列中删除

3.反复1-2直到队列没有不论什么线段

演示样例源码,详情见资源

// 扫描线填充(用循环代替递归, 玩家必须在边界封闭的曲线内)
int fnStageScan(PQUEUE pQueue, PSTAGE pStage)
{UINT x0, xl, xr, y0, xid;UINT flag;    //, cPSTACK s;PSTAR p;//UINT sNum;union {UINT *pData;BYTE *pNum;};UINT X, Y;int i;// 首先清零非类型位Y = pStage->SizeX * pStage->SizeY;X = Y % 4;pNum = pStage->Matrix;while(X--){*pNum++ &= SMT_FILTER; // 清零非类型信息}Y /= 4;while(Y--){*pData++ &= SMT_MATRIX;    // 清零非类型信息}// 清空堆栈, 种子入栈s = pQueue->Stacks;p = s->Stars;p->X = pStage->PosX;p->Y = pStage->PosY;s->Count = 1;while(s->Count){X = p->X;Y = p->Y;p--;s->Count--;pNum = &pStage->Matrix[Y * pStage->SizeX + X];*pNum |= SMT_OPENED;   // Me.PSet (x0, Y), newvaluex0 = X + 1;pNum++;// 填充右边不是箱子也不是边界的单元while((*pNum & SMT_MASKED) == 0) // Me.Point(x0, Y) <> boundaryvalue{//if(x0 >= pStage->SizeX) break;   // 到最右边(地图控制)*pNum |= SMT_OPENED;pNum++;x0++;}xr = x0 - 1;    // 最右坐标x0 = X - 1;pNum = &pStage->Matrix[Y * pStage->SizeX + x0];// 填充左边不是箱子也不是边界的单元while((*pNum & SMT_MASKED) == 0) // Me.Point(x0, Y) <> boundaryvalue{//if(x0 < 0) break;    // 到最左边(地图控制)*pNum |= SMT_OPENED;pNum--;x0--;}xl = x0 + 1;   // 最左象素// 检查上一条扫描线和下一条扫描线。若存在非边界且未填充的象素。则选代替表各连续区间的种子象素入栈。y0 = Y;for(i = 1; i >= -1; i -= 2){x0 = xr;Y = y0 + i;while(x0 >= xl){flag = 0;    // 向左传递未填充的点直到边界, 记录最后一个点的X坐标pNum = &pStage->Matrix[Y * pStage->SizeX + x0];        // c = Me.Point(x0, Y)//while(((*pNum & SMT_MASKED) == 0) && ((*pNum & SMT_OPENED) == 0) && (x0 >= xl))while(((*pNum & SMT_OPNMSK) == 0) && (x0 >= xl)){// (c <> boundaryvalue) And (c <> newvalue) And (x0 >= xl)if(flag == 0){flag = 1;xid = x0;}pNum--;   // c = Me.Point(x0, Y)x0--;}// 将最右側可填充象素压入栈中if(flag == 1){p++;p->X = xid;p->Y = Y;s->Count++; // s.push(Point(xid,y));flag = 0;}// 检查当前填充行是否被中断。若被中断,寻找左方第一个可填充象素pNum = &pStage->Matrix[Y * pStage->SizeX + x0];      // c = Me.Point(x0, Y)while(*pNum & SMT_OPNMSK){// (c = boundaryvalue) Or (c = newvalue) '推断当前点是否为边界或箱子 或 推断当前点是否为已填充点if(x0 == 0) break;  // 到最左边(...)pNum--;x0--;    // 若当前点为边界点或已填充点。依据前面的推断,当前点必定未超出左边界。则当前点向左移动}}  // loop while(x0 >= xl)}    // next for(i = 1; i >= -1; i -= 2)}  // loop while(!s.isempty())return 1;
}

为了存储空间,我仅仅填充特定标志位,队列固定大小,结构更加紧凑,測试运行效果:

左边画线的端点。一个充满完全随机的内右键点击一个封闭的曲线上的点。请参阅资源工具包。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/mfrbuaa/p/4748919.html

原因好消息: 自己主动算法设计推箱子游戏(三)相关推荐

  1. 推箱子android课程设计,推箱子游戏课程设计精选.doc

    推箱子游戏课程设计精选 目 录 Ⅰ 摘要 Ⅱ 前言 Ⅲ 功能描述 Ⅳ 配置要求 Ⅴ 总体设计 一.功能模块设计 二.数据结构设计 三.函数功能描述 四.代码实现 Ⅵ 参考文献 Ⅰ 摘 要 推箱子游戏是 ...

  2. Visual C++实现推箱子游戏的核心算法设计与实现(附源码和和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 在前面的博客中已经讲解了推箱子游戏的菜单和各种对话框的实现,下面对推箱子游戏的核心算法设计和实现进行讲解 一.地图文件读取模块的设计与实现 地图文件 ...

  3. 数据结构课程设计-推箱子

    1. 题目描述 推箱子的游戏规则是扮演工人的玩家,以"推"的方式推动箱子.玩家可以在没有阻碍物(如墙壁等的阻碍物)的情况下,向上.下.左.右的方向移动,将箱子移动到指定位置,当箱子 ...

  4. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏

    基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文 ...

  5. 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现

    基于Java推箱子游戏的设计与实现(任务书,外文翻译,毕业论文20000字,程序代码,答辩PPT) 摘    要 社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方 ...

  6. 推箱子游戏设计与实现(Java+swing+JAWT)

    目 录 摘 要 i Abstract ii 引 言 1 1 系统分析 2 1.1 技术可行性分析 2 1.1.1 可行性目的 2 1.1.2 可行性研究前提 2 1.1.3 算法可行性分析 2 1.1 ...

  7. c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...

    gd工程职业技术学院毕业论文 基于C语言的推箱子游戏设计 Design of the push box Based on Combined Language 作者姓名: 学科专业: 应用电子技术 学院 ...

  8. 推箱子游戏的java设计思路_用JAVA实现一个推箱子游戏

    技术应用 TECHNOLOGY AND MARKET Vol. 26,No. 2,2019 用 JAVA 实现一个推箱子游戏 马寅璞1,孔阳坤2 ( 1. 南京信息工程大学计算机软件学院物联网工程 1 ...

  9. 【STM32单片机】推箱子游戏设计

    文章目录 一.主要功能 二.使用步骤 三.硬件资源 1.硬件准备 2.硬件连接 四.软件设计 1.软件结构 2.主要代码 五.实验现象 联系作者 一.主要功能 1.OLED显示游戏地图和关卡 2.按键 ...

最新文章

  1. MoviePy - 中文文档4-MoviePy实战案例-把多个clip放置在一个画面中(超美)
  2. 【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )
  3. oracle 存储过程 ,触发器练习
  4. Java 获取Web项目相对webapp地址
  5. Microsoft SQL Server学习(二)
  6. Spring Boot SLF4J日志实例
  7. Docker 终失 C 位,开源少年缘何黑化
  8. 开源网络监控管理系统:OpenNMS
  9. 概率与计算机论文,数学概率统计论文范文
  10. python--sorted函数
  11. 2020软考系统架构设计师总结
  12. 记Dorado7学习(5)
  13. SAI颈部正面的画法
  14. 第二章 感受Mac 之美-惊艳从Mac 外设开始,一周后的使用感受
  15. word怎么删除空白页
  16. HBuilderX 下载安装教程
  17. RFM模型(用户分析)
  18. 视觉SLAM前端——ICP
  19. 节省60%费用!巧用阿里云归档存储降低基因测序成本
  20. error: Cannot delete branch 'xxx' checked out at 'xxxx'

热门文章

  1. api.cls.php文件,php数据POST提交到API接口
  2. spriteatlas 白屏的问题_Discuz白屏问题解决思路
  3. Python数据结构与算法(2.7)——跳表
  4. java servlet 3.1,Servlet 3.1规范学习小记
  5. for循环在c++中的用法_C ++中的循环
  6. android 通知栏样式_Android通知样式
  7. Liferay教程– Liferay门户Portlet教程
  8. Web前端开发需要掌握的技能有哪些?
  9. Java开发技术有哪些?
  10. 基于OpenCV的计算机视觉入门(4)线段和形状的绘制