游戏趣题,欢迎挑战

最近做一个小东西的时候遇到个经典的实现,分享一下,有兴趣的可以想想怎么做最好,可以锻炼很多童鞋尤其一些游戏新人的游戏思维,没有标准答案,自由发挥 :smiley:

题目如下,要求
1、尽可能简洁
2、尽量高性能
3、尽量少的平台依赖,提高可移植性

有一个长宽(ROW × COL)网格地图
用户通过拖动一个隔板到地图中
放手后即可把墙壁放置在最接近的两个格子中间
可以横向也可以纵向
数据和例子如图所示
问:
如何实现此功能。
例如,当用户手指在图中位置时,根据已知条件如何计算该隔板应该放置在什么地方。

感兴趣的还可以PK一下运算随机位置10000次的用时(此时标准是:ROW=30, COL=20,其他值可随意)

话说,这东西不就是取余结果就知道当前格子了么,地图大小不影响性能的吧

取格子肯定简单啊,问题是摆在两个格子之间,一个格子有4边,那你得到格子之后要摆在那一边呢?

四边的距离啊,离谁近取谁咯。假设触点是x,y.左右只关心x,上下只关心y.算谁距离更小呗。

你都知道哪个格子了,那找距离哪条边近不也是一样的么,根据两个x的差就知道左还是右,根据y的差就知道上还是下,根据y差和x差的比较久知道具体哪条边了嘛

我说的就是这个意思,当然,我写的是代入公式化的做法,中间没有遍历和对比的过程,纯数学运算

要计算隔板应该放置的位置,可以根据用户手指拖动隔板时的起始位置和结束位置来计算。

首先,我们需要将起始位置和结束位置转换成在网格地图上的坐标,然后计算隔板应该放置在哪个格子中间。

假设网格地图左上角的格子坐标为 (0, 0),右下角的格子坐标为 (ROW-1, COL-1),隔板的长度为 L,起始位置为 (x1, y1),结束位置为 (x2, y2)。

首先计算起始位置和结束位置在网格地图上的坐标:
startRow = floor(y1 / gridHeight)
startCol = floor(x1 / gridWidth)
endRow = floor(y2 / gridHeight)
endCol = floor(x2 / gridWidth)

其中,gridWidth 和 gridHeight 分别为每个格子的宽度和高度。

然后计算隔板应该放置在哪个格子中间。如果起始位置和结束位置在同一行或同一列,隔板应该放置在它们之间的中心位置。否则,隔板应该放置在起始位置和结束位置构成的直线与网格地图相交的位置上。

如果起始位置和结束位置在同一行:
centerRow = startRow
centerCol = floor((startCol + endCol) / 2)

如果起始位置和结束位置在同一列:
centerRow = floor((startRow + endRow) / 2)
centerCol = startCol

否则,计算直线与网格地图相交的位置:
deltaX = x2 - x1
deltaY = y2 - y1
if abs(deltaX) > abs(deltaY):
// 直线的斜率大于 1,以 x 方向为基准计算
slope = deltaY / deltaX
if deltaX > 0:
// 从左往右拖动
centerCol = startCol + 1
centerRow = startRow + slope
else:
// 从右往左拖动
centerCol = startCol
centerRow = startRow - slope
else:
// 直线的斜率小于等于 1,以 y 方向为基准计算
slope = deltaX / deltaY
if deltaY > 0:
// 从上往下拖动
centerRow = startRow + 1
centerCol = startCol + slope
else:
// 从下往上拖动
centerRow = startRow
centerCol = startCol - slope

最后将隔板放置在计算出来的位置上。

上面的计算方法可以根据具体情况进行修改和优化,比如考虑隔板的宽度和高度,限制隔板的拖动范围等。

问的chatGPT