Kotlin是一种自动的方式,当鼠标悬停在上面时,可以获得连接四个游戏的列

Kotlin是一种自动的方式,当鼠标悬停在上面时,可以获得连接四个游戏的列,kotlin,Kotlin,我想实现一个四人游戏。新芯片将在鼠标光标下悬停,根据其x坐标,我想计算它悬停在atm上的列(以及点击后插入的列) 此时此刻,我正在做这样的事情: fun whichColumnIsChip(chip : Chip) : Int{ val x = chip.x/2 val columnWidth = Chip.radius*2 + distanceBetweenColumns val rightColumnBorder = IntArray(game

我想实现一个四人游戏。新芯片将在鼠标光标下悬停,根据其x坐标,我想计算它悬停在atm上的列(以及点击后插入的列) 此时此刻,我正在做这样的事情:

fun whichColumnIsChip(chip : Chip) : Int{
        val x = chip.x/2
        val columnWidth = Chip.radius*2 + distanceBetweenColumns
        val rightColumnBorder = IntArray(gamefield.columns.size){ i -> marginLeft+(i+1) * (Chip.radius*2 + distanceBetweenColumns) }
        when {
            x.betweenInclusive(0.0, rightColumnBorder[0].toDouble()) -> return 0
            x.betweenInclusive(rightColumnBorder[0].toDouble(), rightColumnBorder[1].toDouble()) -> return 1
            x.betweenInclusive(rightColumnBorder[1].toDouble(), rightColumnBorder[2].toDouble()) -> return 2
            x.betweenInclusive(rightColumnBorder[2].toDouble(), rightColumnBorder[3].toDouble()) -> return 3
            x.betweenInclusive(rightColumnBorder[3].toDouble(), rightColumnBorder[4].toDouble()) -> return 4
            x.betweenInclusive(rightColumnBorder[4].toDouble(), rightColumnBorder[5].toDouble()) -> return 5
            x.betweenInclusive(rightColumnBorder[5].toDouble(), rightColumnBorder[6].toDouble()) -> return 6
            else -> return -10
        }
    }
因此,如果光标悬停在第三列的x坐标之间,我只想返回3


上面的代码按预期工作,但我相信还有一种更为简便的方法

可以做的改进很少

1) 由于Kotlin的
when
不仅是一个语句,而且也是一个表达式,因此您可以减少这一点

when {
 condition1 -> return 1
 ...
 conditionN -> return N
}

2) 您可以通过声明一个对给定数组和某些索引执行检查的函数来减少复制粘贴。在下面的示例中,函数声明为local,以便捕获局部变量
x
rightColumnBorder
,但它可以声明为正则或扩展,这取决于您

fun option1(): Int {
    //...
    val test = fun (i: Int) = x.betweenInclusive(
                if (i > 0) rightColumnBorder[i - 1].toDouble() else 0.0,
                rightColumnBorder[i].toDouble())

    return when {
        test(0) -> 0
        test(1) -> 1
        test(2) -> 2
        test(3) -> 3
        test(4) -> 4
        test(5) -> 5
        test(6) -> 6
        else -> -10
    }
}
但是,在您的特定情况下,您可以注意到返回的结果是由给定的数组索引确定的,因此整个
when
语句可以替换为一个循环:

fun option2(): Int {
    //...
    rightColumnBorder.forEachIndexed { idx, value ->
        val from = if (idx > 0) rightColumnBorder[idx - 1].toDouble() else 0.0
        if (x.betweenInclusive(from, value.toDouble())) {
            return idx
        }
    }
    return -10
}


几乎没有什么改进

1) 由于Kotlin的
when
不仅是一个语句,而且也是一个表达式,因此您可以减少这一点

when {
 condition1 -> return 1
 ...
 conditionN -> return N
}

2) 您可以通过声明一个对给定数组和某些索引执行检查的函数来减少复制粘贴。在下面的示例中,函数声明为local,以便捕获局部变量
x
rightColumnBorder
,但它可以声明为正则或扩展,这取决于您

fun option1(): Int {
    //...
    val test = fun (i: Int) = x.betweenInclusive(
                if (i > 0) rightColumnBorder[i - 1].toDouble() else 0.0,
                rightColumnBorder[i].toDouble())

    return when {
        test(0) -> 0
        test(1) -> 1
        test(2) -> 2
        test(3) -> 3
        test(4) -> 4
        test(5) -> 5
        test(6) -> 6
        else -> -10
    }
}
但是,在您的特定情况下,您可以注意到返回的结果是由给定的数组索引确定的,因此整个
when
语句可以替换为一个循环:

fun option2(): Int {
    //...
    rightColumnBorder.forEachIndexed { idx, value ->
        val from = if (idx > 0) rightColumnBorder[idx - 1].toDouble() else 0.0
        if (x.betweenInclusive(from, value.toDouble())) {
            return idx
        }
    }
    return -10
}


到底是什么问题?这不管用吗?它是否工作得太慢或不准确?有任何错误消息吗?它的工作原理和预期的一样,但很笨拙,而且我相信有一种更简单、更自动化的方法,您可以迭代列数组以减少代码,或者简单地将
x
除以列宽以得到当前的列宽。可以执行类似
返回的操作,请尝试{rightColumnBorder.withIndex()。首先{(idx,column)->x>=0&&x@gutenmorgenuu尝试尽可能简单地描述您的问题……也许该描述有助于您确定一种更为惯用的方法……对我来说,听起来您有一个列宽和一些x坐标……所以不就是:“x除以向下舍入的列宽”(因为您的列似乎基于0)?也可能是:
floor(x/columnWidth)
,其中
columnWidth
是这样一列的总宽度,包括间隙…为什么它会是
-10
?如果你也需要这样做,那么在你进行计算之前只需处理这个情况…确切的问题是什么?它不工作吗?它工作得太慢或不准确吗?是否有任何错误消息?它的工作方式与预期的一样,但是这是一种笨拙的方法,而且我相信有一种更简单、更自动化的方法,您可以迭代列数组以减少代码量,或者简单地将
x
除以列宽以得到当前的列宽。可以执行类似
return的操作,尝试{rightColumnBorder.withIndex()。首先{(idx,column)->x>=0&&x@gutenmorgenuu尝试尽可能简单地描述您的问题…也许该描述有助于您确定更惯用的方法…对我来说,听起来您有一个列宽和一些x坐标…所以不只是:“x除以向下舍入的列宽”(因为您的列似乎是基于0的)那么它可能是:
地板(x/columnWidth)
,其中
columnWidth
是这样一列的总宽度,包括间隙……为什么它会是
-10
?如果您也需要,那么在您进行计算之前,只需处理这种情况。。。