Một cuộc thi BlackJack KOTH


13

BlackJack

Khi tôi có một vụ nổ làm việc với thử thách KOTH ban đầu, tôi muốn đến với một thử thách khác. Đối với tôi, niềm vui của những thử thách AI này là trong việc tinh chỉnh một bot tương đối đơn giản, chơi một trò chơi rất đơn giản một cách tinh tế. Do tính chất xác suất của trò chơi bài, tôi nghĩ rằng blackjack có thể là một trò chơi KOTH thú vị giống như TPD.

Tất cả các quy tắc được lấy từ mô tả của BlackJack với trang web này

Quy tắc về Thẻ & Bộ bài

  • Bots chơi tại bàn của bốn (4) đối thủ cạnh tranh và một (1) đại lý
  • Một (1) giày (một sàn được xáo trộn) được chia sẻ bởi tất cả người chơi và nhà cái cho đến khi nó cạn kiệt, tại thời điểm đó, một sàn được xáo trộn ngẫu nhiên mới sẽ được thêm vào và chơi sẽ tiếp tục. Các bot KHÔNG (hiện tại) KHÔNG ĐƯỢC THÔNG BÁO về việc bổ sung bộ bài mới này. Thông báo như vậy có thể được thêm vào nếu thiếu tính năng này gây ra đủ sự cố / rắc rối.
  • Có 10 lượt mua mỗi vòng và thẻ miễn phí
  • Bàn tay hoàn hảo / lý tưởng có số điểm 21
  • Tất cả các thẻ mặt có giá trị 10
  • Tất cả các thẻ số có giá trị số của họ
  • Ách có giá trị 11 hoặc 1. điều này sẽ được xử lý tự động theo khung chứ không phải các bot.
  • Theo quy định , tất cả các thẻ của người chơi được xử lý trực diện và có thể nhìn thấy. Một trong những thẻ của người giao dịch là úp và cái còn lại là úp.

Chấm điểm

  • Điểm vượt quá 21 sử dụng ace vì 11 buộc ace giảm giá trị xuống 1
  • điểm vượt quá 21 mà không thể bị ép buộc dưới ngưỡng 21 "phá sản" bot

Các đại lý

  • Nhà cái rút thăm cho đến khi anh ta bán thân, hoặc bị phạt 17 điểm, tại đó anh ta buộc phải đứng

Cá cược và khoai tây chiên

  • Khi bắt đầu mỗi vòng, một lần mua 10 được tính phí, do đó, tỷ lệ cược tối thiểu là 10 và đặt cược tối thiểu là 1. LƯU Ý - đặt cược là giá trị tuyệt đối của đối số đặt cược, vì vậy đừng bận tâm cố gắng đặt cược tiêu cực.
  • Các lô không đủ khả năng mua đã bị xóa khỏi cuộc thi
  • Khi đặt cược, bot không thể đặt cược nhiều hơn số chip họ có
  • Nếu đặt cược là có thể, đặt cược chip sẽ được loại bỏ hoàn toàn khỏi bot và thêm vào tiền cược
  • Chiến thắng một cược đặt cược cho bot 2 lần đặt cược. Tuy nhiên vì đặt cược bị trừ khỏi chip của bot, bot hòa vốn và sau đó thắng cược 1 lần.
  • Bots thắng cược chỉ khi điểm của họ lớn hơn điểm của nhà cái

Phân tích trò chơi

Một tay

  1. Khi trò chơi bắt đầu, mỗi người chơi được lặp lại một thẻ và có phí mua 10 đô la / tiền cược tối thiểu được trừ vào chip của họ.
  2. Các đại lý rút thăm
  3. Một đường chuyền thứ hai được thực hiện, và một thẻ khác được xử lý cho tất cả người chơi.
  4. Các đại lý rút thăm
  5. Sau đó (theo thứ tự như đã được xử lý), mỗi bot được thực thi như được mô tả trong phần "Giao diện của lập trình viên" và phải thực hiện di chuyển hoặc đứng. Đặt cược được coi là một động thái. LƯU Ý R BETNG B BETNG CHỨNG KHÔNG CÓ ẢNH HƯỞNG ĐẾN KHẢ NĂNG CỦA BOTS ĐỂ KIẾM ĐƯỢC NHIỀU PHIM. Rất có thể đặt cược và sau đó rút một thẻ, và có thể rút nhiều thẻ và họ đặt cược trước khi đứng.
  6. Khi tất cả các bot đã bị vỡ hoặc đứng, đại lý chơi đến ngưỡng 17
  7. Điểm số của các bot sau đó được so sánh với các đại lý, cược được thắng và thua

Một vòng

Được coi là tạo thành năm (5) tay. Ở giữa hai bàn tay, danh sách các thí sinh được sắp xếp để loại bỏ người chơi và sau đó được xử lý thêm để đảm bảo rằng tất cả các bot chơi cùng số tay (một điều khoản cho thực tế là số lượng mục sẽ không chia đều giữa các bảng bốn bot ).

Giao diện lập trình và di chuyển hợp pháp

Như tài liệu trong tệp 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.

Như (bây giờ) được ghi lại trong tệp Thẻ:

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

Mã nguồn cho hệ thống tính điểm là TẠI ĐÂY

Bots mẫu

Lim 17

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

Ngôn ngữ nhập cảnh

Hiện tại, Java, c / c ++, Python và Lisp được hỗ trợ. Một nỗ lực hợp lý sẽ được thực hiện để bao gồm các bài nộp bằng các ngôn ngữ khác, nhưng hãy nhớ rằng cuộc thi cuối cùng sẽ được tổ chức trên một hộp Linux.

Lựa chọn người chiến thắng

Người chiến thắng sẽ là tác giả của bot liên tục tích lũy được nhiều chip nhất qua số lượng bảng và vòng được xác định. Người chiến thắng sẽ được công bố vào ngày 3 tháng 6, nhưng thông báo có thể bị trì hoãn nếu vẫn có bài nộp. Cuộc thi kéo dài vô tận.


Câu hỏi: thẻ có thể nhìn thấy có bao gồm những thẻ trong tay người chơi không?
dmckee --- ex-moderator mèo con

Câu hỏi thứ hai: chúng ta có biết có bao nhiêu thẻ đã được xử lý mà chúng ta không thể nhìn thấy không?
dmckee --- ex-moderator mèo con

Trả lời # 1 - có; Trả lời # 2 - cách thức thực hiện công cụ này, không có thẻ ẩn. thẻ nhìn thấy là mọi thẻ đã được xử lý từ mỗi chiếc giày được tiêu thụ trong vòng hiện tại. lợi nhuận của thẻ nhìn thấy được xóa không phải trên giày mới (vì một phần của giày cũ có thể vẫn còn chơi) mà thay vào đó bị xóa khi chấm dứt vòng. Đây là một lựa chọn kiến ​​trúc tôi đã làm cho đơn giản, có thể được sửa đổi nếu bạn thấy thiếu thẻ ẩn có vấn đề.
arrdem

Cập nhật: kiểm tra các liên kết quy tắc. Công cụ hiện thực hiện các thẻ ẩn, nhưng thẻ ẩn duy nhất hiện tại là một trong những thẻ cơ sở của người giao dịch.
arrdem

Làm thế nào bot có thể phân biệt thẻ nhìn thấy được các đại lý?
cthom06

Câu trả lời:


3

BlackJackDavey

Chán, lỗi thời c. Nên biên dịch theo ANSI hoặc 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;
}

Chiến lược ở đây được ghi lại trong các ý kiến, nhưng rất thẳng về phía trước. Đặt cược bổ sung được thực hiện chỉ trong hai trường hợp (không đủ tiền cược cho vòng tiếp theo, hoặc tăng gấp đôi), và điều này có thể cần phải thay đổi.

Trò chơi khác với một số hướng dẫn được cung cấp cho người đánh bạc ở sòng bài ở chỗ không có thông tin cụ thể về thẻ hiển thị của người giao dịch (hoặc chúng ta có thể là mục cuối cùng trong visible?), Vì vậy một số con số ma thuật là phỏng đoán.

Có thể cần một số câu hỏi khiêm tốn tùy thuộc vào câu trả lời cho hai câu hỏi trong các bình luận.

Tên từ trò chơi, tên đầu tiên của tôi, và bản ballad dân gian cũ .


Mười thẻ IS được đại diện bởi ký tự T. Sẽ cập nhật bài dự thi với danh sách.
arrdem

3

Cược tuyến tính

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

Bot này là một sửa đổi của chiến lược 17. Bot này rút ra cho đến khi vượt quá số điểm 15 (f) và sau đó đặt cược chip int (c * (điểm / 21)). Bằng cách này, bot sẽ đặt cược tích cực bất cứ nơi nào có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.