Применение нескольких бизнес-правил для определения конечного результата с использованием операций Scala List - PullRequest
1 голос
/ 13 июня 2019

Здесь, после того как Геймер и Дилер забрали все свои карты (в игре в блэкджек), мне нужно решить, кто выиграл игру.Самый высокий игрок с очками не более 21 выигрывает, если оба имеют одинаковые очки, которые выигрывает игрок.

Итак, у меня есть этот код Scala:

    def determineWinner(gamer: Gamer, dealer: Dealer): Player = {
      List(gamer, dealer).filter(_.points <= blackJack).maxBy(_.points)
    }

Вопросы:

  • Можем ли мы улучшить код выше?Есть ли более идиоматический подход?
  • Как я могу изменить приведенный выше код, чтобы явно иметь дело со случаем, когда оба имеют равные точки?

Полный код здесь: https://bitbucket.org/jameskingconsulting/blackjack-scala/src/master/

1 Ответ

2 голосов
/ 13 июня 2019

maxBy явно возвращает первое максимальное значение, поэтому размещение игрока первым в списке гарантирует, что игрок всегда будет выигрывать связи.Только будьте осторожны, чтобы не использовать коллекцию с недетерминированным порядком итераций, например, Set.

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

if (!busted(gamer) && (gamer.points >= dealer.points || busted(dealer)))
  Some(gamer)
else if (!busted(dealer))
  Some(dealer)
else
  None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...