com.neko233.skilltree.game.grid.Grid2D.kt Maven / Gradle / Ivy
package com.neko233.skilltree.game.grid
import com.example.kotlinplayground.spaceMath.Vector2D
/**
* 二维网格接口
*/
interface Grid2D {
/**
* 根据坐标获取网格中的值
* @param x 横坐标
* @param y 纵坐标
* @return 网格中的值,若坐标无效则返回null
*/
fun get(x: Int, y: Int): T?
/**
* 设置网格中指定坐标的值
* @param x 横坐标
* @param y 纵坐标
* @param value 要设置的值
*/
fun set(x: Int, y: Int, value: T?)
/**
* 清空网格,将所有值置为null
*/
fun clear()
/**
* 填充网格,将所有值设置为指定值
* @param value 要填充的值
*/
fun fill(value: T?)
/**
* 遍历网格中的每个元素,并执行指定的操作
* @param handleGrid 操作网格的函数,接收横坐标、纵坐标和值作为参数
*/
fun forEach(handleGrid: (x: Int, y: Int, value: T?) -> Unit)
/**
* 使用广度优先搜索算法查找从起点到目标点的路径
* @param start 起点坐标
* @param target 目标点坐标
* @return 路径上的坐标列表,若无路径则返回空列表
*/
fun bfs(start: Vector2D, target: Vector2D): List
/**
* 使用深度优先搜索算法查找从起点到目标点的路径
* @param start 起点坐标
* @param target 目标点坐标
* @return 路径上的坐标列表,若无路径则返回空列表
*/
fun dfs(start: Vector2D, target: Vector2D): List
/**
* 使用A*搜索算法查找从起点到目标点的路径
* @param start 起点坐标
* @param target 目标点坐标
* @param targetScoreMap 目标点坐标
* @param targetCostMap 代价函数
* @return 路径上的坐标列表,若无路径则返回空列表
*/
fun aStar(
start: Vector2D,
target: Vector2D,
targetScoreMap: MutableMap = mutableMapOf(start to 0),
targetCostMap: MutableMap = mutableMapOf(start to heuristic(start, target)),
): List
/**
* 代价函数
*/
fun heuristic(
start: Vector2D,
target: Vector2D,
): Double
fun getNeighbors(position: Vector2D): List {
val x = position.x
val y = position.y
val neighbors = mutableListOf()
// 添加上下左右四个方向的邻居
if (isValidPosition(x - 1, y)) {
neighbors.add(Vector2D(x - 1, y))
}
if (isValidPosition(x + 1, y)) {
neighbors.add(Vector2D(x + 1, y))
}
if (isValidPosition(x, y - 1)) {
neighbors.add(Vector2D(x, y - 1))
}
if (isValidPosition(x, y + 1)) {
neighbors.add(Vector2D(x, y + 1))
}
return neighbors
}
/**
* is 合法的格子 ?
*/
fun isValidPosition(
x: Number,
y: Number,
): Boolean {
return get(x.toInt(), y.toInt()) != null
}
}