如何使用Kotlin和TornadoFX将棋子添加到棋盘

问题描述

我目前正在尝试使用TornadoFX在Kotlin开发一个小型棋盘游戏,主要用于练习目的。但是我目前正在努力将这些部分添加到董事会中。我尝试了许多对我来说似乎合乎逻辑的方法,但是每次它以太给我一个错误消息或根本不起作用时。因此,当我没有任何想法或可能的解决方案时,我现在在这里寻求有关Stackoverflow的帮助(这是有史以来第一次:-))。

从Controller向棋盘添加棋子的最佳方法或最惯用的方法是什么?我还应该提到,我以前从未真正使用过JavaFX,因此我正在从头开始学习TornadoFX。

这是我的董事会视图:

class BoardView : View("BoardView")
{
    private val numberOfCells = 8
    private val cellSize = 100.0
    private val controller: BoardController by inject()

    override val root = pane {
        prefheight = cellSize * numberOfCells
        prefWidth = cellSize * numberOfCells

        gridpane {
            for (y in 0 until numberOfCells)
            {
                row {
                    for (x in 0 until numberOfCells)
                    {
                        if ((x + y) % 2 == 0)
                        {
                            add(ChessCell(cellSize,true,x,y))
                        }
                        else
                        {
                            add(ChessCell(cellSize,false,y))
                        }
                    }
                }
            }
        }
    }
}

我的碎片片段:

class Stone(light: Boolean,x: Double,y: Double): Fragment()
{
    private val colorLight = c("E4E4E4")
    private val colorDark = c("1B1B1B")

    override val root = pane {
        circle {
            fill = if (light)
            {
                colorLight
            }
            else
            {
                colorDark
            }
            radius = 30.0
            centerY = y
            centerX = x
        }
    }
}

最后是我的Controller类:

class BoardController(): Controller()
{
    private val board: BoardView by inject()

    fun startGame()
    {
        // How to place a Stone (aka piece) from here?
    }
}

非常感谢您提供任何帮助

解决方法

经过一周的工作,我终于找到了解决方案。如果将来有人需要,我将在这里发布。

我在BoardView内添加了以下功能:

fun placeStone(light: Boolean,xPos: Double,yPos: Double)
{
    with(root)
    {
        this += Stone(light,xPos,yPos)
    }
} 

然后我在startGame()中更改了函数BoardController

fun startGame()
{
    for (x in 0 until 8)
    {
        for (y in 0 until 8)
        {
            if ((x + y) % 2 != 0)
            {
                if (y < 3)
                {
                    board.placeStone(false,x,y)
                }
                else if (y > 4)
                {
                    board.placeStone(true,y)
                }
             }
         }
     }
}