Ну, вы делаете это неправильно, вы проверяете, что каждый элемент в этом списке на самом деле равен player1 или player2.
Итак, если вы выполните, [4,5,6]
, вы получите 8 тостов, в которых 1 из них будет победителем при проверке на [4,5,6], а остальные 7 будут указывать на условие else, потому что [4,5,6]
не является [1,2,3]
, [7,8,9]
, et c.
val possibleCombos = sequenceOf( // if want listOf, just add .asSequence() before map below, this way will break the mapping if result is obtained.
listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9),
listOf(1, 4, 7), listOf(2, 5, 8), listOf(3, 6, 9),
listOf(7, 5, 3), listOf(1, 5, 9))
fun checkWinner(player1: List<Int>, player2: List<Int>) {
// this will break the mapping once first non-null value is found, in terminal operation firstOrNull()
val message = possibleCombos.map {
when {
player1.containsAll(it) -> "Winner is A $player1"
player2.containsAll(it) -> "Winner is B $player2"
else -> null
}
}.filterNotNull().firstOrNull() ?: "Game is tie"
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
// Call this function (test sample)
checkWinner(arrayListOf(1, 2, 8, 3), arrayListOf(5, 4, 6, 7)) // may change to listOf as well
Результат:
Winner is B [5, 4, 6, 7]
PS: Я реорганизовал arrayListOf()
на listOf()
, потому что это то, что рекомендует использовать Kotlin -stdlib. Однако вы также можете вернуться к arrayListOf()