BlackJack KOTH yarışması


13

BlackJack

Orijinal KOTH meydan okumasında bir patlama yaptığım için başka bir tane daha bulmak istedim. Benim için, bu AI zorluklarının eğlencesi, çok basit bir oyunu ustaca oynayan nispeten basit bir botu rafine etmektir. Kart oyunlarının olasılıklı doğası nedeniyle, blackjack'in tıpkı TPD gibi ilginç bir KOTH oyunu olabileceğini düşünüyorum.

Tüm kurallar bu web sitesinin ayakkabı ile BlackJack açıklamasından türetilmiştir

Kartlar ve Desteyle İlgili Kurallar

  • Botlar dört (4) rakibin ve bir (1) bayinin masalarında oynuyor
  • Bir (1) ayakkabı (karıştırılmış güverte) bitene kadar tüm oyuncular ve dağıtıcı tarafından paylaşılır , bu noktada yeni rastgele karıştırılmış bir güverte eklenir ve oyun devam eder. Botlar (şu anda) bu yeni destenin eklenmesiyle ilgili DEĞİLDİR. Bu özelliğin eksikliği yeterli sıkıntıya / soruna neden oluyorsa bu bildirim eklenebilir.
  • Tur başına 10 buy-in var ve kartlar ücretsiz
  • Mükemmel / ideal elin puanı 21
  • Tüm yüz kartlarının değeri 10
  • Tüm sayısal kartlar sayılarına değer
  • Aslar 11 veya 1 değerindedir. Bu, botlar tarafından değil, çerçeve tarafından otomatik olarak ele alınacaktır.
  • Gereğince kurallara , bütün oyuncuların kartları yüz kadar ele ve görünür olan. Krupiyenin kartlarından biri kapalı, diğeri açıktır.

puanlama

  • Ası 11 olarak kullanan 21'den fazla puanlar ası 1'e düşürmeye zorlar
  • bot "21 büstü" eşiğinin altında zorlanamayan 21 aşan puanlar

Satıcı

  • Krupiye, yumruk atıncaya kadar çeker veya ayakta durmaya zorlandığı 17 puan alır.

Bahis ve Cips

  • Her turun başında, bir satın-10 yüzden minimum değer, şarj hissesini 10 ve minimum bahis 1'in NOT - bahis böylece rahatsız etmeyin, bahis argümanının mutlak değeridir negatif bahisleri denemek.
  • Katılım ücretini karşılayamayan botlar yarışmadan çıkarılır
  • Bahis yaparken, botlar sahip oldukları fişlerden daha fazla bahis yapamazlar
  • Bahis mümkünse, fiş bahsi hemen bottan kaldırılır ve bahis miktarına eklenir
  • Bir bahis kazanmak bot 2x fişlerine bahse girer. Ancak bahis botun fişlerinden çıkarıldığı için, bot eşit olarak kırılır ve daha sonra bahsi 1 kat kazanır.
  • Botlar, yalnızca puanı dağıtıcının skorundan daha yüksekse bahis kazanır

Oynanış Dağılımı

Bir el

  1. Oyun başladığında, her oyuncuya tekrarlı olarak bir kart dağıtılır ve fişlerinden çıkarılan 10 $ 'lık katılım ücreti / minimum bahsi vardır.
  2. Krupiye berabere
  3. İkinci bir geçiş yapılır ve tüm oyunculara başka bir kart dağıtılır.
  4. Krupiye berabere
  5. Daha sonra (ele alındıkları sırayla) her bot "Programcı Arayüzü" bölümünde açıklandığı gibi yürütülür ve bir hamle veya stand yapmalıdır . Bahis bir hamle olarak kabul edilir. BAHİSLERİN BOTLARIN DAHA FAZLA HAREKET YAPMASINDAN YETENEĞİNİ ETKİ ETMEDİĞİNİ NOT. Bahis yapmak ve daha sonra bir kart çekmek çok mümkündür ve ayakta durmadan önce birden fazla kart çekmek ve bahis oynamak mümkündür.
  6. Tüm botlar patladığında veya durduğunda, krupiye 17 eşiğine oynar
  7. Botların skorları daha sonra krupiyenin skorlarıyla karşılaştırılır, bahisler kazanılır ve kaybedilir

Tek raund

Beş (5) el olduğu düşünülmektedir. Eller arasında, yarışmacılar listesi oyuncuları kaldırmak için sıralanır ve daha sonra tüm botların aynı sayıda el oynamasını sağlamak için daha fazla işlenir (giriş sayısının dört bot tabloları arasında eşit olarak ayrılmaması için bir hüküm) ).

Programcı Arayüzü ve Yasal Hareketler

CardShark dosyasında belgelendiği gibi:

#   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.

Kartlar dosyasında (şimdi) belgelendiği gibi:

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

Puanlama sistemi için kaynak kodu BURADA

Örnek Botlar

Lim 17

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

Giriş Dilleri

Şu anda Java, c / c ++, Python ve Lisp desteklenmektedir. Diğer dillerdeki gönderileri dahil etmek için makul bir çaba gösterilecektir, ancak son yarışmanın bir Linux kutusunda gerçekleştirileceğini unutmayın.

Kazanan Seçimi

Kazanan, henüz belirlenmemiş sayıda masa ve mermi üzerine sürekli olarak en fazla fiş tahakkuk eden botun yazarı olacaktır. Kazanan 3 Haziran'da duyurulacak, ancak hala gönderimler devam ederse duyuru ertelenebilir. Yarışma süresiz olarak uzatıldı.


Soru: Görünür kartlar oyuncuların elinde olanları içeriyor mu?
dmckee --- eski moderatör yavru kedi

İkinci soru: Göremediğimiz kadar kaç kart dağıtıldığını biliyor muyuz?
dmckee --- eski moderatör yavru kedi

1 numaraya cevap - evet; # 2'ye cevap - bu motorun uygulanma şekli, gizli kart yok. visible kartları, geçerli turda tüketilen her ayakkabıdan dağıtılan her karttır. visible-kart iadeleri yeni ayakkabılarla silinmez (çünkü eski ayakkabının bir kısmı hala oyundadır) ancak bunun yerine yuvarlak sonlandırmayla temizlenir. Bu, sadelik için yaptığım bir mimari seçimdir, gizli kartların eksikliğini sorunlu bulursanız revize edilebilir.
arrdem

Güncelleme: kurallar bağlantısını kontrol edin. Motor şimdi gizli kartları uygulamaktadır, ancak şu anda tek gizli kart, krupiyenin temel kartlarından biridir.
arrdem

Botlar, bayilerin hangi görünür kartı olduğunu nasıl ayırt edebilir?
cthom06

Yanıtlar:


3

BlackJackDavey

Sıkıcı, eski moda c. Derleyici ANSI veya c99 altında olmalıdır.

/* 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;
}

Buradaki strateji yorumlarda belgelenmiştir, ancak çok ileridir. Ek bahisler sadece iki durumda yapılır (bir sonraki tur için yeterli bahis veya çift bahis) ve bunun değişmesi gerekebilir.

Oyun, krupiyenin gösteren kartı hakkında belirli bir bilgi olmaması (ya da son giriş olarak bulabilir visiblemiyiz?), Yani kumarhane kumarbazları için sunulan rehberlerden bazılarını farklılaştırır , bu yüzden bazı sihirli sayılar tahminlerdir.

Yorumlardaki iki sorunun cevabına bağlı olarak mütevazı bir diddling gerekebilir.

Oyunun adı, benim adım ve eski halk şarkısı .


On kart T karakteriyle temsil edilir. Yarışma postasını listeyle güncelleyecek.
arrdem

3

Doğrusal Bahis

#!/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"

Bu bot, 17 stratejinin bir modifikasyonudur. Bu bot 15 (f) skorunu geçene kadar çeker ve sonra int (c * (skor / 21)) fişlerine bahis yapar. Bu şekilde bot mümkün olan her yerde agresif bir şekilde bahis yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.