我如何在井字游戏中制作十字线

How do I make cross line in tic tac toe

我在 Kotlin android studio 中制作了一个简单的井字游戏,我正在尝试在赢得游戏后制作一条线。 例如,如果 X 赢了所有三个 X 将与线 X̶X̶X̶ 交叉。我的代表是贫穷,但我认为你明白了。

目前进度:

制作了两个数组,其中包含每个玩家的信息:

    var Player1 = ArrayList<Int>()
    var Player2 = ArrayList<Int>()
    var ActivePlayer = 1
    var setPlayer = 1

给了按钮 id:

fun buttonClick(view: View) {
        val buSelected:Button = view as Button
        var cellId = 0
        when(buSelected.id) {
            R.id.button1 -> cellId = 1
            R.id.button2 -> cellId = 2
            R.id.button3 -> cellId = 3

            R.id.button4 -> cellId = 4
            R.id.button5 -> cellId = 5
            R.id.button6 -> cellId = 6

            R.id.button7 -> cellId = 7
            R.id.button8 -> cellId = 8
            R.id.button9 -> cellId = 9
        }
        PlayGame(cellId,buSelected)

    }

这就是我检查获胜者的方式:

fun CheckWinner()
    {
        var winner = -1

        //row1
        if (Player1.contains(1) && Player1.contains(2) && Player1.contains(3))
        {
            winner = 1
        }
        if (Player2.contains(1) && Player2.contains(2) && Player2.contains(3))
        {
            winner = 2
        }

还有更多的代码,但是要添加到这个 post。

用户界面 我建议创建您自己的自定义视图而不是使用按钮。例如,您可以创建 FrameLayout 并将其放入 TextView,然后 show/hide 一些带线的简单视图或在 Canvas 的帮助下绘制这条线。该自定义视图将是 9 个方块中的 1 个。然后将它们放在某个网格中(手动或使用 RecyclerView 或 GridView)。

逻辑 创建两个列表,其中包含每个玩家的 X 和 O。具有正方形位置的整数列表就足够了。当两个用户中的一个 select 一个正方形并且 before 添加新项目(位置)到列表时,用位置(从 1 到 9)填充这些列表,检查该项目是否是' t 已经在列表中(这个玩家,player1)并且不在另一个列表中(其他玩家,player2)。如果两个列表都不包含此项 - 添加它。然后,添加一个新位置到列表后,检查它是否形成一条线。例如,1、3、9 或 2、5、7。如果是这样,则该玩家获胜,您可以穿过这些位置。

代码可能如下所示:

enum Player {
    player1,
    player2
}

List<int> player1List = List();
List<int> player2List = List();    

void addNewPosition(Player player, int position) {
    List<int> currentPlayerList;
    List<int> otherPlayerList;
    switch(player) {
        case Player.player1:
            currentPlayerList = player1List;
            otherPlayerList = player2List;
        break;
        case Player.player2:
            currentPlayerList = player2List;
            otherPlayerList = player1List;
        break;
    }
    
    if (currentPlayerList.contains(position)) {
        // this player already selected this position, do nothing
        return;
    }

    if (otherPlayerList.contains(position)) {
        // another player already selected this position, do nothing
        return;
    }

    currentPlayerList.add(position); // add selected position to current player list
    
    // now check if current players position forms a line
    if (currentPlayerList.contains(1) && currentPlayerList.contains(2) && currentPlayerList.contains(3)) {
        // this player won
    }
    ... check other possible solutions that could result in a win. Better to follow some pattern instead of checking each of them

}