Конкурс BlackJack KOTH


13

BlackJack

Оскільки у мене був вибух, що працює над оригінальним викликом KOTH, я хотів придумати ще один. Для мене задоволення від цих завдань AI полягає в удосконаленні порівняно простого бота, який грає в дуже просту гру. В силу ймовірнісного характеру карткових ігор, я думаю, що блекджек може бути цікавою КОШТОВОЮ грою, подібно до TPD.

Всі правила виведені з опису BlackJack з взуттям на цьому веб-сайті

Правила щодо карт та колоди

  • Боти грають за столами чотирьох (4) конкурентів та одного (1) дилера
  • Одне (1) взуття (перетасована колода) ділиться всіма гравцями та дилером до вичерпання, після чого буде додана нова довільно переміщена колода і гра буде продовжена. Боти НЕ ПОВІДОМЛЕНІ про додавання цієї нової колоди. Таке повідомлення може бути додане, якщо відсутність цієї функції спричиняє достатні труднощі / проблеми.
  • Існує вхід 10 за раунд, а картки безкоштовні
  • Ідеальна / ідеальна рука має оцінку 21
  • Усі картки обличчя мають значення 10
  • Усі цифрові картки варті своєї кількості
  • Тузи коштують 11 або 1. Це буде вирішуватися автоматично рамками, а не ботами.
  • Згідно з правилами , всі картки гравців роздаються обличчям догори та є видимими. Одна з карт дилера - лицьовою стороною вниз, а інша - лицьовою стороною вгору.

Оцінка балів

  • Оцінки понад 21, у яких використовується туз як 11, примушують туз зменшити значення до 1
  • бали перевищують 21, які неможливо примусити нижче порогу 21 "перебору" бота

Дилер

  • Дилер тягне, поки він не кинеться, або не перевищить бал 17, в який момент він змушений стояти

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

  • На початку кожного раунду стягується ставка 10 , тому мінімальна ставка 10, а мінімальна ставка 1. ПРИМІТКА - ставка є абсолютною вартістю аргументу ставки, тому не турбуйте спробу негативних ставок.
  • Боти, які не можуть дозволити собі придбання, видаляються з конкурсу
  • Роблячи ставки, боти не можуть ставити більше, ніж у них є фішки
  • Якщо ставка можлива, ставка з фішками негайно видаляється з бота і додається до ставки
  • Вигравши ставку, ви отримаєте бот в розмірі 2х фішок. Однак, оскільки ставка віднімається від фішок бота, бот розбивається і потім виграє 1х ставку.
  • Боти виграють ставки лише в тому випадку, якщо їх оцінка більша, ніж у дилера

Поломка геймплея

Одна рука

  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.

Як (зараз) зафіксовано у файлі Карт:

#       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":   '#'

Вихідний код системи балів - ТУТ

Зразки ботів

Лім 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 - у тому, як цей двигун реалізований, прихованих карт немає. видимі картки - це кожна картка, яка була роздана з кожного взуття, спожитого під час поточного раунду. Повернення видимих ​​карток очищається не на новому взутті (тому що частина старого взуття, ймовірно, все ще грає), а замість цього очищається після завершення круглої форми. Це вибір архітектури, який я зробив для простоти, який можна переглянути, якщо виявиться відсутність прихованих карт проблемними.
arrdem

Оновлення: перевірте посилання на правила. Тепер двигун реалізує приховані карти, але наразі єдина прихована карта - одна з базових карт дилера.
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?), Тому деякі магічні цифри - здогадки.

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

Назва з гри, моє ім’я та стара народна балада .


Десять картки IS представлені символом T. Оновить публікацію конкурсу зі списком.
arrdem

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), а потім зробить ставку на фішки int (c * (бал / 21)). Таким чином бот робитиме агресивні ставки, де це можливо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.