Я пытаюсь написать программное обеспечение для игры в покер, и мне не удается отследить вовлеченных в игру игроков и решить, кто будет действовать дальше.
Например: игра с тремя руками с помощью кнопки SB BB, первая в игреЭто кнопка звонков, SB фолды, BB чеки. Теперь на флопе, как правило, СБ, но он сброшен, кто же будет следующим? (Это BB)
Чтобы определить следующее действие, где действия - это чек-рейз игроков, я по ошибке уменьшил действия последнего раунда (ривер на флоп-терне и т. Д.), Начиная со всех вовлеченных игроков и сбрасывая те, которыеили сложил, или пошел ва-банк, этот расчет неверен, потому что мне нужно сократить все раунды, это неэффективно и его можно избежать.
private lazy val nextToAct = {
def nextIndex(skipIndexes: List[StackIndex], i: StackIndex): StackIndex = {
val next = (i + 1) % players
if (skipIndexes.exists(_==next))
nextIndex(skipIndexes, next)
else
next
}
def findToAct(acts: List[Act], skipIndexes: List[StackIndex], cur: StackIndex): StackIndex = acts match {
case (Fold|AllIn)::as =>
findToAct(as, cur :: skipIndexes, nextIndex(skipIndexes, cur))
case _::as =>
findToAct(as, skipIndexes, nextIndex(skipIndexes, cur))
case Nil =>
cur
}
// recentActs is acts that happened on the last round either preflop, flop, turn, or river.
findToAct(recentActs.reverse, Nil, firstToAct)
}
// this calculation is wrong because bigBlind + 1 might have been folded.
lazy val firstToActOnPreflop = (bigBlind + 1) % players
lazy val firstToActOnFlop = (button + 1) % players
lazy val firstToAct = if (preflop)
firstToActOnPreflop
else
firstToActOnFlop
Как мне организовать свои данные, чтобы эта проблема могла быть уменьшена донадеюсь, простой поиск.