Как найти следующего, чтобы действовать в игре в покер, где некоторые люди сложили? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь написать программное обеспечение для игры в покер, и мне не удается отследить вовлеченных в игру игроков и решить, кто будет действовать дальше.

Например: игра с тремя руками с помощью кнопки 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

Как мне организовать свои данные, чтобы эта проблема могла быть уменьшена донадеюсь, простой поиск.

...