我如何在井字游戏中制作十字线
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
}
我在 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
}