六边形格子地图的基本实现

基本思路

这是一张大小为 21 × 15 的六边形格子地图

我们将左上角的格子定义为 (1, 1)
则部分地图的坐标如下

易知:
若起点为(x, y)
当y为奇数时
可以前往的方向为
(x-1, y-1) (x, y-1) (x+1, y) (x, y+1) (x-1, y+1) (x-1, y)
当y为偶数时
可以前往的方向为
(x-1, y) (x, y-1) (x+1, y-1) (x+1, y) (x+1, y+1) (x, y+1)

然后写个bfs就能判断能到达的地方了

实现代码

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int max_x = 21, max_y = 15;
struct cell
{bool Is_Block = false; //有无障碍
}hex_map[max_x + 1][max_y + 1];
int to[2][6][2] = { -1,0, 0,-1, 1,-1, 1,0, 1,1, 0,1, -1,-1, 0,-1, 1,0, 0,1, -1,1, -1,0 };
int vis[max_x + 1][max_y + 1];
bool judge(int x, int y)
{if (x == max_x && y % 2 == 0) return false;if (x <= 0 || x > max_x || y <= 0 || y > max_y)return false;if (vis[x][y]) return false;return !hex_map[x][y].Is_Block;
}
void bfs(int X, int Y, int Range)
{int now_x, now_y, i, new_x, new_y;queue<pair<int, int>> que;vis[X][Y] = 1;que.push(make_pair(X, Y));while (!que.empty()){now_x = que.front().first;now_y = que.front().second;que.pop();if (vis[now_x][now_y] == Range + 1) continue;for (i = 0; i < 6; i++){new_x = now_x + to[now_y % 2][i][0];new_y = now_y + to[now_y % 2][i][1];if (judge(new_x, new_y)){vis[new_x][new_y] = vis[now_x][now_y] + 1;que.push(make_pair(new_x, new_y));}}}
}
int main(void)
{int temp, x, y, r;for (int i = 1; i <= max_y; i++){for (int i2 = 1; i2 <= max_x + i % 2 - 1; i2++){scanf("%d", &temp);if (temp)hex_map[i2][i].Is_Block = true;}}scanf("%d %d %d", &x, &y, &r);bfs(x, y, r);for (int i = 1; i <= max_y; i++){for (int i2 = 1; i2 <= max_x + i % 2 - 1; i2++){printf("%2d", vis[i2][i]);}putchar('\n');if ((i % 2)) putchar(' ');}
}

运行样例

输入:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 3 6 // 起点的x y 可以行动的范围
运行结果:
1为起点 0为不可到达

输入2:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 4 8

六边形格子地图的基本实现相关推荐

  1. 六边形格子地图坐标计算与转换

    // 世界场景的一些数据管理,如提供坐标转换之类的接口var WorldMapManager = function () {this.mapSize = null; // 地图大小,像素this.cu ...

  2. python正六边形_荐用正六边形分割地图

    给定地图上的区域(用多边形顶点的经纬度表示), 需要用正多边形(三角形/正方形/六边形)对地图上的区域进行填充. 在一些实际应用中, 这样做的是为了划分标准的作业单元, 例如定义共享自行车的骑行范围, ...

  3. 格子地图 像素坐标 地图坐标 转化

    /*** 像素坐标转换为地图坐标* */public SpaceToTiled(point: egret.Point): egret.Point {var y = Math.floor(point.y ...

  4. 蜂窝状/六边形格子网格的定位/坐标转换

    六边形网格的详细介绍:Hexagonal Grids 算法推荐博文1:蜂窝状网格的定位方法(转) - 酒醉的Tiger - 博客园 算法推荐博文2:https://blog.csdn.net/kolo ...

  5. html地图交互式显示信息,HTML5 交互式SVG六边形蜂巢状地图 悬停放大并显示提示文本...

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 function initializeMap() { var svg = document.createEl ...

  6. Unity shader 护盾shield的简单实现

    扰动 直接对uv进行变换就可以了,记得首先把六边形格子地图的Tilling调高点 先预先调成合适大小的六边形,然后repeat铺满整个护盾 1 2 3 4 5 6 // Tiles and offse ...

  7. 【Unity】六边形地图格子基础

    这里的六边形地图,指SLG游戏中的大世界地图,用六边形的网格进行平铺.例如文明,以及部分SLG手游. 这里介绍六边形地图格子的基本概念,以及具体数学实现代码. 1.基本概念 这里强制规定,所有的格子都 ...

  8. 游戏六边形地图的实现

    难点主要是如果获取一个六边形格子相邻的六个格子,在实际开发中有个简单取巧的方法, 思路:把正四边形变成平行四边形,然后把六边形格子放入平行四边形的直角坐标系中就成了六边形地图.即产生地图时可以按正四边 ...

  9. 2D-六边形瓦片地图的随机生成

    本文为转载,如有再转需标明原创作者及出处,请自觉尊重原创作者的劳动成果! 作者:elsong 原文:http://www.manew.com/thread-140331-1-1.html | 写在最前 ...

最新文章

  1. 一步一步SharePoint 2007之十七:解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...
  2. sql优化的方法及思路_微生物发酵 技术优化思路 与方法
  3. java中换行符号_Java中的回车换行符/n /r /t分析
  4. DTStructure分治法与最大子列和问题
  5. 一些关于 SAP Spartacus 组件和模块延迟加载的问题和解答
  6. 服务器虚拟化的毕业设计,基于Vmware的服务器虚拟化管理毕业论文.doc
  7. 谷歌chrome xp_将非Google任务列表添加到Chrome
  8. jvm(Java virtual machine) JVM架构解释
  9. Emmet:HTML/CSS代码快速编写神器
  10. [TypeScript] vs code TSLint常见错误解决方案
  11. activiti 文档_免费、开源、多平台的PDF文档处理软件——PDFsam Basic
  12. STM32之FSMC-SRAM例程
  13. android studio配置国内,Android studio配置国内镜像源
  14. mapreduce中文乱码,已解决
  15. python两个dataframe求差集_spark计算两个DataFrame的差集、交集、合集
  16. 使用OBS做无延时/低延迟直播(实测)
  17. python解析mht文件_php解析mht文件转换成html的实例
  18. Aspose WorkbookDesigner打开文件异常Error xml namespace
  19. activity已经销毁判断
  20. re学习笔记(57)BUUCTF-re-[FlareOn4]login

热门文章

  1. 第一课:初识Java
  2. 【学习笔记】图像超分辨
  3. 《大象--Thinking in UML 第二版》已于近日在当当首发,同时邀请各位加入新浪微博[大象-thinkinginUml群]:http://q.weibo.com/1483929
  4. 永中Office已失去往日的光辉
  5. Carla中文版社区来了
  6. 如何寻求解脱_在设计中寻求安慰
  7. Git:Github镜像网站
  8. c补week1(linux c基本操作及C语言部分基础知识)
  9. CAD数据坐标系统问题
  10. php 实现每日持续签到,累计签到,送积分