একটি ব্ল্যাক জ্যাক KOTH প্রতিযোগিতা


13

BlackJack

আসল KOTH চ্যালেঞ্জ নিয়ে কাজ করার সাথে সাথে আমার একটি বিস্ফোরণ ঘটেছিল, তাই আমি আরও একটির সাথে আসতে চাইছিলাম। আমার জন্য, এই এআই চ্যালেঞ্জগুলির মজাদার তুলনামূলকভাবে সহজ বটকে পরিমার্জন করা যা সূক্ষ্মভাবে খুব সাধারণ গেম খেলে। কার্ড গেমগুলির সম্ভাব্য প্রকৃতির কারণে, আমি মনে করি যে ব্ল্যাকজ্যাক টিপিডির মতোই একটি আকর্ষণীয় KOTH গেম হতে পারে।

সমস্ত ওয়েবসাইটের জুতা সহ ব্ল্যাকজ্যাকের বিবরণ থেকে সমস্ত নিয়ম উত্পন্ন

কার্ড এবং ডেক সংক্রান্ত বিধি

  • চার (4) প্রতিযোগী এবং একজন (1) ব্যবসায়ীর টেবিলে বট খেল play
  • এক (১) জুতো (একটি বদলানো ডেক) সমস্ত খেলোয়াড় এবং ডিলার দ্বারা ক্লান্ত না হওয়া অবধি ভাগ করে নেওয়া হয় , যার পর্যায়ে একটি নতুন এলোমেলোভাবে বদলানো ডেক যুক্ত হবে এবং খেলতে থাকবে। বটগুলি এই নতুন ডেকে যুক্ত করার জন্য বিজ্ঞপ্তিপ্রাপ্ত নয় (বর্তমানে)। এই বৈশিষ্ট্যটির অভাবের কারণে পর্যাপ্ত ঝামেলা / ঝামেলা হয় তবে এই জাতীয় বিজ্ঞপ্তি যুক্ত করা যেতে পারে।
  • প্রতি রাউন্ডে 10-এর ক্রয় রয়েছে এবং কার্ডগুলি বিনামূল্যে cards
  • পারফেক্ট / আদর্শ হাতে স্কোর 21 আছে
  • সমস্ত ফেস কার্ডের মান 10 হয়
  • সমস্ত সংখ্যা কার্ড তাদের সংখ্যা মূল্য
  • টেকসই 11 বা 1 এর মূল্যবান this
  • অনুযায়ী নিয়ম , সব খেলোয়াড়দের কার্ড উপরদিকে মুখ করে তুলে মোকাবিলা এবং দৃশ্যমান। ডিলারের কার্ডগুলির একটির মুখোমুখি এবং অন্যটি মুখোমুখি।

স্কোরিং

  • 21 এর বেশি সংখ্যক স্কোর যা এসকে 11 হিসাবে ব্যবহার করে তা এসকে 1 এর মান হ্রাস করতে বাধ্য করে
  • 21 এর বেশি সংখ্যক স্কোর যা 21 "বস্ট" বট এর দোরের নীচে জোর করা যায় না

সরবারহকারী

  • ডিলার যতক্ষণ না তাকে স্টাফ করে, বা স্কোরকে 17 ছাড়িয়ে যায় ততক্ষণ টানতে পারে যেখানে তাকে দাঁড়াতে বাধ্য করা হয়

বাজি এবং চিপস

  • প্রতিটি রাউন্ডে শুরু হওয়ার সময়ে একটি কিনতে-ইন 10 অভিযুক্ত করা হয়, তাই কমপক্ষে হয় পণ 10, এবং একটি সর্বনিম্ন বাজি 1. উল্লেখ্য - বাজি, বাজি যুক্তি পরম মান, তাই বিরক্ত করবেন না নেতিবাচক বেট চেষ্টা করছি।
  • যে সমস্ত বট ক্রয় করতে পারে না তাদের প্রতিযোগিতা থেকে সরানো হয়
  • বেটস তৈরি করার সময়, বটগুলি তাদের কাছে থাকা চিপগুলির চেয়ে বেশি বাজি ধরতে পারে না
  • যদি বাজিটি সম্ভব হয় তবে চিপস বেটটি বট থেকে স্বেচ্ছায় সরানো হয় এবং তা স্টেলে যুক্ত করা হয়
  • একটি বাজি জয় বট 2x চিপস বাজি দেয়। তবে বটের বুকের চিপগুলি থেকে বাজিটি বিয়োগ করা হয়েছে বলে, বটটি এমনকি ব্রেক হয় এবং তারপরে 1x বাজিটি জিততে পারে।
  • বোট কেবল তখনই বেট জিতবে যদি তাদের স্কোর ডিলারের চেয়ে বেশি হয়

গেমপ্লে ব্রেকডাউন

এক হাত

  1. গেমটি শুরু হওয়ার সাথে সাথে প্রতিটি খেলোয়াড়কে পুনরায় এক কার্ডের জন্য ডিল করা হয় এবং তাদের চিপস থেকে buy 10 বাই-ইন ফি / সর্বনিম্ন বেট বিয়োগ করা হয়।
  2. ব্যাপারী আঁকেন
  3. একটি দ্বিতীয় পাস তৈরি করা হয়, এবং অন্য কার্ডটি সমস্ত খেলোয়াড়ের সাথে ডিল করা হয়।
  4. ব্যাপারী আঁকেন
  5. তারপরে (তাদের সাথে যেমন আচরণ করা হয়েছিল একই ক্রমে) প্রতিটি বটকে "প্রোগ্রামার ইন্টারফেস" বিভাগে বর্ণিত হিসাবে কার্যকর করা হয় এবং অবশ্যই একটি পদক্ষেপ বা স্ট্যান্ড তৈরি করতে হবে । বাজি ধরা চলা হিসাবে বিবেচিত হয়। নোট করুন যে বেটিং আরও অগ্রগতি তৈরি করতে বটসের দক্ষতা প্রভাবিত করে না। বাজি দেওয়া এবং তারপরে একটি কার্ড আঁকানো খুব সম্ভব এবং একাধিক কার্ড আঁকানো সম্ভব এবং তারা দাঁড়ানোর আগে বাজি ধরে।
  6. সমস্ত বট ফেটে বা দাঁড়ালে, ডিলার 17 এর দোরগোড়ায় খেলবে
  7. বটগুলির স্কোরগুলি তখন ডিলারের সাথে তুলনা করা হয়, বেটগুলি জিতে যায় এবং হারিয়ে যায়

এক রাউন্ড

পাঁচ (5) হাত গঠন বলে গণ্য করা হয়। হাতের মধ্যে, প্রতিযোগীদের তালিকা খেলোয়াড়দের সরানোর জন্য বাছাই করা হয় এবং তারপরে সমস্ত বটগুলি একই সংখ্যক হাতের খেলতে পারে তা নিশ্চিত করার জন্য প্রক্রিয়া করা হয় (প্রবেশের সংখ্যাটি চার-বটের টেবিলের মধ্যে সমানভাবে বিভক্ত হবে না এমন বিধান) )।

প্রোগ্রামারের ইন্টারফেস এবং আইনী পদক্ষেপ

কার্ডশার্ক ফাইলটিতে নথি হিসাবে:

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

প্রবেশের ভাষা

বর্তমানে জাভা, সি / সি ++, পাইথন এবং লিস্প সমর্থিত। অন্যান্য ভাষায় জমা দেওয়ার অন্তর্ভুক্ত করার জন্য একটি যুক্তিসঙ্গত প্রচেষ্টা করা হবে, তবে মনে রাখবেন চূড়ান্ত প্রতিযোগিতাটি একটি লিনাক্স বাক্সে পরিচালিত হবে।

বিজয়ী নির্বাচন

বিজয়ী হবেন এমন বট লেখক যা ধারাবাহিকভাবে সর্বাধিক চিপগুলি সুনির্দিষ্টভাবে নির্ধারিত সংখ্যক টেবিল এবং রাউন্ডের উপরে জমা করেছিল। বিজয়ীর ২ রা জুন ঘোষণা করা হবে, তবে এখনও সাবমিশনগুলি এলে ঘোষণা বিলম্ব হতে পারে। অনির্দিষ্টকালের জন্য প্রতিযোগিতা বাড়ানো হয়েছে।


প্রশ্ন: দৃশ্যমান-কার্ডগুলিতে কি খেলোয়াড়দের নিজস্ব হাতে রয়েছে?
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

দ্বিতীয় প্রশ্ন: আমরা জানি যে আমরা দেখতে পাচ্ছি না এমন কতগুলি কার্ড ডিল হয়েছে?
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

উত্তর # 1 - হ্যাঁ; # 2 এর উত্তর - এই ইঞ্জিনটি যেভাবে কার্যকর করা হয়েছে, কোনও গোপন কার্ড নেই। দৃশ্যমান-কার্ডগুলি হ'ল প্রতিটি কার্ড যা বর্তমান রাউন্ডে খাওয়া প্রতিটি জুতা থেকে ডিল করা হয়েছে। দৃশ্যমান-কার্ডের রিটার্নগুলি নতুন জুতাগুলিতে না ক্লিয়ার করা হয়েছে (কারণ পুরানো জুতার অংশ সম্ভবত এখনও খেলতে পারে) তবে পরিবর্তে গোলাকার সমাপ্তির পরে সাফ করা হয়। এটি সরলতার জন্য আমি তৈরি একটি আর্কিটেকচার পছন্দ, আপনি যদি লুকানো কার্ডের অভাবজনিত সমস্যাকে খুঁজে পান তবে এটি সংশোধন করা যেতে পারে।
এয়ারডেমি

আপডেট: নিয়মের লিঙ্কটি পরীক্ষা করুন। ইঞ্জিনটি এখন লুকানো কার্ডগুলি প্রয়োগ করে তবে বর্তমানে কেবলমাত্র গোপন কার্ডটি হ'ল ডিলারের বেস কার্ডগুলির মধ্যে একটি।
আরেডেমি

বটগুলি কীভাবে পার্থক্য করতে পারে কোন দৃশ্যমান কার্ডটি হ'ল ডিলার?
cthom06

উত্তর:


3

BlackJackDavey

বিরক্তিকর, পুরানো ফ্যাশন গ। এএনএসআই বা সি 99 এর অধীনে সংকলক করা উচিত।

/* 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 কৌশলটির একটি পরিবর্তন ification এই বটটি অঙ্কিত হয় যতক্ষণ না এটি 15 (চ) এর স্কোর অতিক্রম করে এবং তারপরে (সি * (স্কোর / 21)) চিপস বেট করে। এইভাবে বটটি যেখানেই সম্ভব আগ্রাসীভাবে বাজি ধরবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.