Конкурс Блэкджек КОТ


13

Блэк Джек

Поскольку у меня был взрыв, работающий над оригинальным испытанием KOTH, я хотел придумать еще один. Для меня удовольствие от этих задач ИИ заключается в том, чтобы усовершенствовать сравнительно простого бота, который тонко играет в очень простую игру. Из-за вероятностного характера карточных игр, я думаю, что блэкджек может быть интересной игрой КОТ, как и TPD.

Все правила взяты из описания этого блэкджека с обувью на этом сайте.

Правила относительно карт и колоды

  • Боты играют за столами четырех (4) участников и одного (1) дилера.
  • Один (1) башмак (перемешанная колода) используется всеми игроками и дилером до тех пор, пока он не будет исчерпан, после чего будет добавлена ​​новая случайно перемешанная колода и игра продолжится. Боты НЕ (в настоящее время) УВЕДОМЛЕНЫ о добавлении этой новой колоды. Такое уведомление может быть добавлено, если отсутствие этой функции вызывает достаточные проблемы / проблемы.
  • Существует бай-ин в 10 за раунд, и карты бесплатны
  • Идеальная / идеальная рука имеет счет 21
  • Все лицевые карты имеют значение 10
  • Все числовые карты стоят своих номеров
  • Тузы стоят 11 или 1. Это будет решаться автоматически фреймворком, а не ботами.
  • Согласно правилам , все карты игроков сдаются открытыми и видимыми. Одна из карт дилера закрыта, а другая - лицом вверх.

счет

  • Баллы, превышающие 21, которые используют туза как 11, вынуждают туза уменьшиться до 1
  • баллы, превышающие 21, которые не могут быть принуждены ниже порога 21 "перебить" бот

Дилер

  • Дилер тянет до тех пор, пока не разорится или не наберет 17 очков, после чего он вынужден стоять

Ставки и фишки

  • В начале каждого раунда, бай-ин 10 заряжена, так что минимальная ставка 10, а минимальная ставка на 1 Примечание - ставка является абсолютным значением ставки аргумента, так что не беспокойтесь пробовать отрицательные ставки.
  • Боты, которые не могут позволить себе вступительный взнос, удаляются из конкурса
  • Делая ставки, боты не могут ставить больше, чем у них есть фишки
  • Если ставка возможна, ставка на фишки немедленно снимается с бота и добавляется к ставке.
  • Выигрыш ставки дает боту ставку в 2 раза больше фишек. Однако, поскольку ставка вычитается из фишек бота, бот становится безубыточным, а затем выигрывает ставку в 1 раз.
  • Боты выигрывают ставки только в том случае, если их рейтинг больше, чем у дилера.

Геймплей Breakdown

С одной стороны

  1. Когда игра начинается, каждому игроку итеративно сдается по одной карте, и из его фишек вычитается плата за вступительный взнос в размере 10 долларов США / минимальная ставка.
  2. Дилер рисует
  3. Выполняется второй пас, и всем игрокам раздается другая карта.
  4. Дилер рисует
  5. Затем (в том же порядке, в котором они действовали) каждый бот выполняется, как описано в разделе «Интерфейс программиста», и должен сделать ход или встать. Ставки считаются ходом. ЗАМЕТЬТЕ, ЧТО СТАВКА НЕ ВЛИЯЕТ НА СПОСОБНОСТЬ БОТОВ ДЕЛАТЬ ДАЛЬШЕ.Очень возможно сделать ставку, а затем взять карту, и можно взять несколько карт, и они делают ставку, прежде чем стоять.
  6. Когда все боты разорились или встали, дилер играет до своего порога 17
  7. Затем боты сравниваются с результатами дилера, ставки выигрываются и проигрываются.

Один раунд

Считается, что составляют пять (5) рук. В промежутках между руками список участников сортируется для удаления игроков, а затем подвергается дальнейшей обработке, чтобы гарантировать, что все боты разыгрывают одинаковое количество рук (условие того, что количество записей не будет равномерно распределяться между столами с четырьмя ботами ).

Интерфейс программиста и легальные ходы

Как указано в файле CardShark:

#   DOCUMENTATION
#       INPUT SPECIFICATION
#          $ ./foo.bar <hand-score> <hand> <visible cards> <stake> <chips>
#          <hand-score>     is the present integer value of the player's hand.
#          <hand>           is a space-free string of the characters [1-9],A,J,Q,K
#          <visible cards>  every dealt card on the table. when new shoes are brought
#                           into play, cards drawn therefrom are simply added to this list
#                           NOTE: the first TWO (2) cards in this list belong to the dealer.
#                             one however will be "hidden" by a "#". the other is visible.
#                           !!! THE LIST IS CLEARED AT THE END OF HANDS, NOT SHOES !!!
#          <stake>          the  number of chips which the bot has bet this hand
#          <chips>          the number of chips which the bot has
#       SAMPLE INPUT
#          $ ./foo.bar 21 KJA KQKJA3592A 25 145
#
#       OUTPUT SPECIFICATION
#          "H"|"S"|"D"|"B"  (no quotes in output)
#          "H"              HIT - deal a card
#          "S"              STAND - the dealer's turn
#          "D"              DOUBLEDOWN - double the bet, take one card. FIRST MOVE ONLY
#          "B 15"           BET - raises the bot's stakes by $15.

Как (сейчас) задокументировано в файле Cards:

#       class CARD
#           card is a container for representing paper playing cards in
#           otherwise fairly functional programming.
#           letter()
#               gets the letter used to identify the card in a string  
#               LETTER MAPPINGS  
#                   Ace     :   'A'
#                   Two     :   '2'
#                   Three   :   '3'
#                   Four    :   '4'
#                   Five    :   '5'
#                   Six     :   '6'
#                   Seven   :   '7'
#                   Eight   :   '8'
#                   Nine    :   '9'
#                   Ten     :   'T'
#                   Jack    :   'J'
#                   Queen   :   'Q'
#                   King    :   'K'
#                   "Hidden":   '#'

Исходный код для системы скоринга ЗДЕСЬ

Образцы ботов

Lim 17

#!/usr/bin/env python
import sys
s = sys.argv
if int(s[1]) < 17:
    print "H"
else:
    print "S"

Языки входа

В настоящее время поддерживаются Java, c / c ++, Python и Lisp. Будут предприняты разумные усилия, чтобы включить материалы на других языках, но помните, что финальный конкурс будет проводиться на Linux-боксе.

Выбор победителя

Победителем станет автор бота, который последовательно набрал наибольшее количество фишек за определенное количество столов и раундов. Победитель будет объявлен 3 июня, но объявление может быть отложено, если еще поступят заявки. Конкурс продлен до бесконечности.


Вопрос: есть ли в видимых картах те, которые находятся в руках у игроков?
dmckee --- котенок экс-модератора

Второй вопрос: мы знаем, сколько карт было сдано, что мы не можем видеть?
dmckee --- котенок экс-модератора

Ответ № 1 - да; Ответ № 2 - способ реализации этого движка, скрытых карт нет. visible-cards - это каждая карта, которая была сдана из каждой обуви, использованной в текущем раунде. Возврат видимых карт очищается не на новых туфлях (потому что часть старого башмака, вероятно, все еще находится в игре), но вместо этого очищается при завершении раунда. Это архитектурный выбор, который я сделал для простоты, который можно пересмотреть, если вам не хватает невидимых карт.
Март

Обновление: проверьте ссылку на правила. Движок теперь реализует скрытые карты, но единственной скрытой картой в настоящее время является одна из базовых карт дилера.
arrdem

Как боты могут различить, какая видимая карта у дилеров?
cthom06

Ответы:


3

BlackJackDavey

Скучно, старомодно c. Должен компилятор под ANSI или c99.

/* BlackJackDavey
 *
 * A entry for
 * http://codegolf.stackexchange.com/questions/2698/a-blackjack-koth-contest
 * copyright 2011 
 *
 * Currently expects a slightly extended version of the spec. Two
 * expected changes:
 * - Tens will be represented as 'T'
 * - The visible card string will include '#' for those cards whose
 *     *backs* we can see (slight improvement in card counting technique)
 * 
 * No disaster if neither feature is present, just sligtly degraded
 * performance.
 */
#include <stdio.h>
#include <string.h>

/* A full deck has a total value of 4*( (11*5) + (3*10) + ace ) where
 * ace is 11 or according to our need.
 **/
int fullWeight(const int current){
  int ace = (current>10) ? 1 : 11;
  return 4 * ( 11*5 + 3*10 + ace);
}
/* Return the value of a particular card in the context of our
 * current score
 */
int cardWeight(const char c, const int current){
 switch (c) {
 case '1': case '2': case '3': case '4': case '5':
 case '6': case '7': case '8': case '9':
   return (c - '0');
 case 'T': case 'J': case 'Q': case 'K':
   return 10;
 case 'A':
   return current>10 ? 1 : 11;
 }
 return 0;
}
/* returns the mean card *value* to be expected from the deck 
 *
 * Works by computing the currently unknown value and diviing by the
 * number of remaining cards 
 */
float weight(const char*known, const int current){
  int weight = fullWeight(current);
  int count=52;
  int uCount=0;
  const char*p=known;
  while (*p != '\0') {
    if (*p == '#') { /* Here '#' is a stand in for the back of a card */
      uCount++;
    } else {
      weight -= cardWeight(*p,current);
    }
    count--;
    p++;
    if ( count==0 && *p != '\0') {
      count += 52;
      weight += fullWeight(current);
    }
  }
  return (1.0 * weight)/(count+uCount);
}


int main(int argc, char*argv[]){
  int score=atoi(argv[1]);
  const char*hand=argv[2];
  const char*visible=argv[3];
  int stake=atoi(argv[4]);
  int chips=atoi(argv[5]);

  /* If current stake is less than 10, bet all the rest because a loss
     does not leave us enough to continue */
  if (chips < 10 && chips > 0) {
    printf("B %d\n",chips);
    return 0;
  }
  /* First round stategy differs from the rest of the game */
  if (strlen(hand)==2 && stake==10) {
    switch(score){
    case 10:
    case 11: /* Double down on particularly strong hands */
      if (chips >= 10) {
    printf("D\n");
    return 0;
      }
      break;
    default:
      break;
    };
  }
  /* In future rounds or when first round spcialls don't apply it is
     all about maximizing chance of getting a high score */
  if ((score + weight(visible,score)) <= 21) {
    /* if the oods are good for getting away with it, hit */
    printf("H\n");
    return 0;
  }
  /* Here odd are we bust if we hit, but if we are too low, the dealer
     probably makes it.*/
  printf("%c\n", score>14 ? 'S' : 'H');
  return 0;
}

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

Игра отличается от руководств, предлагаемых игрокам казино, тем, что в них нет конкретной информации о показательной карточке дилера (или мы могли бы сказать, что это последняя запись в visible ?), Поэтому некоторые магические числа являются догадками.

Может понадобиться скромное занудство в зависимости от ответа на два вопроса в комментариях.

Имя из игры, мое имя и старая народная баллада .


Десять карт обозначены буквой Т. Обновит конкурсный пост со списком.
Март

3

Линейная ставка

#!/usr/bin/env python
from __future__ import division
import sys
s = sys.argv

c=150    # chip modifier
f=15     # stand score

if int(s[1]) < f:
    print "H"
else:
    if int(s[4]) == 10:
        print "B", (int(s[1])/21)*c
    else:
        print "S"

Этот бот является модификацией 17 стратегии. Этот бот тянет до тех пор, пока он не превысит 15 (f), а затем ставит фишки (c * (Score / 21)). Таким образом, бот будет агрессивно делать ставки везде, где это возможно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.