0

我正在尝试制作一个带有 ui 组件的国际象棋引擎桌面应用程序。

我提到的 game() 方法是一个简单的 while 循环,它允许我以代数表示法请求移动,并在它们是有效的移动时进行移动。

我有以下主要内容,我的问题是,如果我取消注释并在类中运行 game() 方法,它将不会启动 App 窗口,如果我尝试取消注释相同的方法但从窗口外部它仍然不会启动桌面应用程序。另一方面,如果我运行它,它将启动 UI 窗口。

fun main() = application {
    resetBoard()
    printBoardSmall()
    Window(onCloseRequest = ::exitApplication, icon = painterResource("black_knight.png"), title = "Chess") {
        ui()
        //game()
    }
    //game()
}
@Composable
fun ui() {
    var squarePair = false
    Row {
        Column {
            for (n in 8 downTo 1) {
                Row {
                    Text(
                        "" + n,
                        textAlign = TextAlign.Center,
                        modifier = Modifier.width(SIZE_TILE),
                        fontSize = FONT_SIZE_BOARD,
                        fontWeight = FontWeight.Bold
                    )
                    squarePair = boardLines(n, squarePair)
                }
            }
            Row {
                Text(" ", textAlign = TextAlign.Center, modifier = Modifier.width(SIZE_TILE))
                for (n in 0..7) {
                    Text(
                        "" + ('A' + n),
                        textAlign = TextAlign.Center,
                        modifier = Modifier.width(SIZE_TILE),
                        fontSize = FONT_SIZE_BOARD,
                        fontWeight = FontWeight.Bold
                    )
                }
            }
        }
        Column {
            Text("   Play", textAlign = TextAlign.Center, fontSize = 30.sp)
            var move = ""
            //var move by remember { mutableStateOf("") }
            TextField(
                value = move,
                onValueChange = { move = it },
                label = { Text("Move") },
                maxLines = 1,
                textStyle = TextStyle(color = Color.Black, fontWeight = FontWeight.Bold),
                modifier = Modifier.padding(20.dp)
            )
            print(move)
        }
    }
}

@Composable
fun board(n: Int, i: Int){
    var team = ""
    if(utils.isWhite(BOARD[n-1][i-1])) team = TEAM[0]
    if(utils.isBlack(BOARD[n-1][i-1])) team = TEAM[1]

    for(k in LOWER_CASE_LETTERS.indices) {
        if (BOARD[n-1][i-1] == LOWER_CASE_LETTERS[k] || BOARD[n-1][i-1] == UPPER_CASE_LETTERS[k]) {
            Image(painter = painterResource(team + "_" + PIECES[k] + ".png"), contentDescription = PIECES[k])
        }
    }
}

我是新手,我不知道是什么问题,特别是因为我试图在窗口外运行该方法

4

1 回答 1

2

我不是专家,但我会尽力提供帮助。

  • 它不起作用,当你在窗口中调用它时,因为它是用来初始化它的布局的。所以窗口不会显示,直到game()停止。
  • 我不知道,为什么它不起作用,当你把它放在窗口之后。看着fun main() = application { ... }我怀疑,启动应用程序类似于启动窗口,所以它也不会启动,直到game()结束。

您应该尝试放入game()单独的线程。像这样的东西应该工作:

fun() main = application {
    resetBoard()
    printBoardSmall()

    Window( ... ){
        ui()
    }

    Thread {
       game()
    }.start()
}

PS我对作曲也很陌生。对编程有点陌生。真的,真的很抱歉我所做的所有过度简化。

PPS 您可以在您的应用程序中添加一个 TextField 并使用 Button 的 onClick 参数来调用移动检查功能。那时就不需要使用线程和协程了。您还可以将按钮用于棋盘方格,因为您可以为它们分配背景和图像。如果您需要任何帮助 - HMU。

于 2021-11-20T23:15:49.647 回答