All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.neko233.skilltree.game.grid.Grid2D.kt Maven / Gradle / Ivy

There is a newer version: 0.3.6
Show newest version
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
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy