سؤال

أحاول إنشاء برنامج بسيط للعبة البلاك جاك.للأسف، أواجه مشكلات فورًا في إنشاء مجموعة أوراق اللعب.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<char> deck;
    char suit[] = {'h','d','c','s'};
    char card[] = {'2','3','4','5','6','7','8','9','10','J','Q','K','A'};
    for (int j=0; j<13; j++) {
        for (int i=0; i<4; i++) {
            deck.push_back(card[j] suit[i]);
        }       
    }

    return 0;
}

أعلم أن مشكلتي تبدأ عندما أحاول تعيين القيمة "10" إلى حرف.من الواضح أنني لم أتمكن من تجميع هذا ولكني متأكد عندما أحاول تعيين قيم البطاقة لمجموعة المتجهات، سأحصل أيضًا على خطأ منذ أن استخدمت النوع المتغير "char".يبدو أن معرفة نوع المتغير الذي يجب استخدامه يقتلني.أيضا ، "deck.push_back (Card [J] Suit [i]) ؛" كن رمزًا صحيحًا لدمج البطاقة والبدلة ، أو هل يجب عليك وضع شيء بين البطاقة [J] و Suit [I]؟سأكون ممتنًا إذا كان بإمكان أي منكم أن يقودني في الاتجاه الصحيح.أيضًا كملاحظة جانبية صغيرة، يعد هذا جزءًا من واجب منزلي، لذا يرجى عدم إعطائي مجموعات كاملة من التعليمات البرمجية.شكرا لمساعدتك.

هل كانت مفيدة؟

المحلول

ومحاولة لخلق فئة من بطاقة مع بدلة وبطاقة كعضو وضعه كنوع من النواقل. مثل

public class Card {
 public:
  Card(char suit, char card);
  char suit, card;
};

int main() {
    vector<Card> deck;
    char suit[] = {'h','d','c','s'};
    char card[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
    for (int j=0; j<13; j++) {
        for (int i=0; i<4; i++) {
                deck.push_back(new Card(card[j],suit[i]));
        }               
    }
    return 0;
}

وأيضا باستخدام تتضمن التعدادات بدلا من حرف في دعوى وبطاقة شأنه أن يجعل أكثر وضوحا.

نصائح أخرى

وأعتقد أن ما كنت تبحث لاستخدام هو التعداد. وستجعل التعليمات البرمجية الخاصة بك أكثر وضوحا وحل مشكلتك.

enum SUIT { HEART, CLUB, DIAMOND, SPADE }; 
enum VALUE { ONE, TWO, THREE, ..., TEN, JACK, QUEEN, KING};

تعتمد الطريقة التي تصمم بها الأمر حقًا على ما تحاول القيام به.

هل تقوم بإنشاء لعبة فعلية، وتحتاج هياكل البيانات فقط إلى دعم طريقة اللعب؟

إذا كان الأمر كذلك، فسوف أقوم بإنشاء فئة بطاقة، مع حقل التعداد للبدلة ونوع رقمي (مع القيم من 1 إلى 13) للقيمة الاسمية.

من ناحية أخرى، إذا كنت تقوم بإنشاء تطبيق تحليل أو مشغل ذكاء اصطناعي، فقد يكون النموذج مختلفًا بعض الشيء.

منذ بضع سنوات مضت، قمت بتأليف جهاز محاكاة لحساب الاحتمالات في سيناريوهات مختلفة لـ Texas Holdem، وأردت أن يقوم بتحليل الأرقام بسرعة كبيرة.لقد بدأت بنموذج واضح جدًا (فئة البطاقة، تعداد البدلة، وما إلى ذلك) ولكن بعد الكثير من التنميط والتحسين، انتهى بي الأمر بتمثيل ثنائي البت.

كانت كل بطاقة ذات قيمة مكونة من ستة عشر بت، حيث تمثل البتات الثلاثة عشر ذات الترتيب العالي القيمة الاسمية، والبتان ذو الترتيب المنخفض يمثلان البدلة، ومع البت[2] كعلم خاص يشير إلى الآس (يستخدم فقط في الحالات التي يكون فيها قد يظهر الآس في A2345 على التوالي).

وفيما يلي بعض الأمثلة على ذلك:

0000000000001001  <----  Two of hearts
0100000000000011  <----  King of spades
1000000000000110  <----  Ace of diamonds

^^^^^^^^^^^^^            ("face-value" bits)
             ^           ("low-ace" flag)
              ^^         ("suit" bits)

يمكنك أن تتخيل كيف، مع تصميم مثل هذا، أنه من السهل جدًا البحث عن الأزواج، والثلاثيات من نفس النوع، والمستقيمة (يعد التدفق أكثر صعوبة قليلاً).

لن أخوض في جميع العمليات المحددة، لكن يكفي أن أقول إن هذا النوع من النماذج يدعم ملايين العمليات في الثانية...

بالطبع، ضع في اعتبارك أنني لا أؤيد في الواقع استخدام تصميم مثل هذا في التنفيذ المباشر للعبة.السبب الوحيد الذي جعلني أنتهي من هذا التصميم هو أنني كنت بحاجة إلى إجراء عمليات محاكاة إحصائية ضخمة.

لذا فكر جيدًا في الطريقة التي تريد بها تصميم النموذج:

  • كل بطاقة
  • يد اللاعب
  • سطح السفينة بأكمله
  • حالة الجدول...بما في ذلك جميع توزيعات ورق اللاعبين (بما في ذلك اللاعبين الذين قاموا بتقسيم توزيع ورقهم الأولي)، وربما حذاء من ستة أوراق لعب، أو الكومة الموزعة، وما إلى ذلك

سيحدد نموذج التطبيق الشامل، وأهداف التطبيق بشكل عام، إلى حد كبير أنواع هياكل البيانات التي ستكون أكثر ملاءمة.

استمتع!!!

استخدم 'T' بدلا من 10.

هل حاولت استبدال J مع 11، س 12 و K مع 13؟ ثم هل يمكن استخدام integers بدلا من characters. استبدال 11-13 مع الحرف المناسب في وقت لاحق.

حسنا، أولا وقبل كل شيء، على سطح السفينة [0] هو حرف واحد، ولكن تحاول، الى الاشياء "2H" في ذلك. (لحظة، ونحن سوف تجاهل هذا كيف تقومون به ما هو خطأ.)

وفي الأساس، ستحتاج إلى جعل سطح السفينة وvector<std::string>. جعل بطاقة مجموعة من CONST شار * الصورة، وتحويل العناصر إلى سلسلة.

وبعد ذلك استخدام:

deck.push_back(std::string(card[j]) + suit[i]);

وكما ذكر من قبل الآخرين، يمكنك استخدام 'T' لمدة عشر، J، Q، وK للشخصيات. بقدر ما push_back .. منذ سطح السفينة هو متجه حرف، يمكنك تمرير حرف واحد فقط لpush_back كما حجة. ويمر كل من قيمة بطاقة (1 ... 9، T، J، Q، K) ومجموعتها لا تعمل.

وأنا شخصيا من شأنه أن يخلق قليلا البنية، لتمثيل بطاقة، مع قيمة وخاصية جناح. بعد ذلك، يمكنك جعل سطح السفينة متجه من البطاقات.

وتعديل: صدر تحديد الكلمة الأخيرة منذ ناقلات بطاقة (أقل من) (أكبر مما كان)، وناقلات (لا شيء)

.

وهذا قد لا تجمع، ولكن هنا هو النهج أود أن (واستخدموا). كنت تريد الذهاب الى استخدام [إينتس] لتمثيل البطاقات الخاصة بك، ولكن يمكنك بسهولة المجرد هذا في فئة. الذي سأكتب لك.

class Card
{
public:
    enum ESuit
    {
        kSuit_Heart,
        kSuit_Club,
        kSuit_Diamond,
        kSuit_Spade,
        kSuit_Count
    };

    enum ERank
    {
        kRank_Ace,
        kRank_Two,
        kRank_Three,
        kRank_Four,
        kRank_Five,
        kRank_Six,
        kRank_Seven,
        kRank_Eight,
        kRank_Nine,
        kRank_Ten,
        kRank_Jack,
        kRank_Queen,
        kRank_King,
        kRank_Count
    };

    static int const skNumCards = kSuit_Count * kRank_Count;

    Card( int cardIndex )
    : mSuit( static_cast<ESuit>( cardIndex / kRank_Count ) )
    , mRank( static_cast<ERank>( cardIndex % kRank_Count ) )
    {}

    ESuit GetSuit() const { return mSuit );
    ERank GetRank() const { return mRank );

private:
    ESuit mSuit;
    ERank mRank;
}

والآن في غاية البساطة أن تضيف إلى هذه الفئة للحصول على كل ما تريد للخروج منه. لإنشاء قائمتها بسيطة على النحو التالي.

rstl::vector<Card> mCards;
mCards.reserve( Card::skNumCards );

for ( int cardValue = 0; cardValue < Card::skNumCards; ++cardValue )
{
    mCards.push_back( Card( cardValue ) );
}

هل تحتاج إلى خلط ورق اللعب؟

#include <algorithm>
std::random_shuffle( mCards.begin(), mCards.end() );

وماذا عن رؤية ما قيمة البطاقة الأولى؟

if ( mCards[0].GetSuit() == Card::kRank_Club && mCards[0].GetRank() == Card::kRank_Ace )
{
    std::cout << "ACE OF CLUBS!" << std::endl;
}

وأنا لم تجمع أي شيء من هذا، ولكن يجب أن تكون قريبة.

وبما أن هذا هو برنامج لعبة ورق، سيتم إضافة وبمقارنة قيمة البطاقات.

وهذا هو الحال، يمكنك أن تنقذ نفسك بعض برمجة إضافية والألم من خلال منح بطاقات <م> الباحث القيم (1-13) بدلا من شار القيم.

عندما خلقت فئة أوراق اللعب الخاصة بي في C++, ، لقد واجهت بعض المشاكل الخاصة بي.في البداية كنت أحاول التحويل فئة بطاقات PHP الخاصة بي إلى C++، مع الحد الأدنى من الحظ.قررت الجلوس ووضعها على الورق.قررت استخدام الإعداد الموجه للكائنات، لأنني أشعر أنه الأسهل في الاستخدام للتوسيع.أنا استخدم الكائنات بطاقة و ظهر السفينة, ، لذلك، على سبيل المثال، إذا كنت تريد وضع 10 مجموعات في حذاء في لعبة البلاك جاك الخاصة بك، يمكنك إنشاء 10 مجموعات، وهو أمر سيكون بسيطًا بما فيه الكفاية، لأنني قررت أن أجعل كل شيء مستقلاً بذاته.في الواقع، إنه مكتفٍ بذاته، لإنشاء حذائك، سيكون الرمز:

#include "AnubisCards.cpp"

int main() {

    Deck *shoe = new Deck(10);

}

ولكن هذا كان من أجل البساطة، وهو ليس ضروريًا تمامًا في الألعاب الصغيرة حيث تحتاج فقط إلى مجموعة أوراق لعب واحدة.

على أية حال، كيف أنا تم إنشاء المجموعة عن طريق إنشاء مجموعة من 52 كائنًا من البطاقات.التشكيلات سهلة بما فيه الكفاية، لأنك تعلم أن لديك 4 بدلات و 13 بطاقة في كل مجموعة, ، أنت تعلم أيضًا أن لديك 2,3,4,5,6,7,8,9,10,جاك,ملكة,ملك,آس في كل بدلة.تلك لن تتغير أبدا.لذلك استخدمت حلقتين، واحدة لـ بدلة والآخر ل قيمة.

كان شيء من هذا القبيل:

for(int suit = 1; suit <= 4; suit++){
    for(int card = 1; card <= 13; card++){
        // Add card to array
    }
}

الآن، ستلاحظ في كل واحدة من تلك الحلقات أنني أستخدم قيمة عددية.السبب بسيط، البطاقات عبارة عن أرقام.4 بدلات.13 القيم.حتى القيمة العددية في لعبة البلاك جاك.القيمة الاسمية، حتى تضغط على بطاقات الوجه، وهي القيمة العددية 10 حتى تضغط على الآس، وهي القيمة العددية 1 أو 11.كل شيء هو أرقام.لذا، يمكنك استخدام هذه الأرقام ليس فقط لتعيين قيمة البطاقة، بل أيضًا نوع البطاقة والرقم الموجود في التسلسل الرقمي.

تتمثل إحدى الأفكار في تخزين خريطة في فئة البطاقة، مع أسماء البطاقات char أو String، مع 1،2،3...كونها الفهارس لكل منها.

واود ان اذهب مع اقتراح روس إلى استخدام أعداد صحيحة. ومعظم ألعاب بطاقة تنطوي على بعض أجزاء من الرياضيات ولهذا تمثيل أفضل.

تحويل إلى 'A' أو غير ذلك "ACE" على الانتاج.

وبما أن هذا هو الواجب المنزلي لC ++ وانا ذاهب الى تخمين من المتوقع أن استخدام فئات لك. على خلاف ذلك استخدام تتضمن التعدادات، وإذا كان هذا C استخدام البنية أو شيء من هذا.

وبالنسبة لبعض الألعاب، وبصرف النظر عن قيمة نقطة، وكنت تريد تخزين نوعا من رتبة لبطاقة، الذي سيعتمد على الوضع الحالي من اللعب.

وأنا لم تفعل عادي C في إلى الأبد، ولكن أعني شيئا من هذا القبيل:

typedef struct struct_card {
  unsigned short int suit:2;
  unsigned short int card:4;
//  unsigned short int valu:4;
} card;

int main() {
  card a_card;
  card std_deck[52];
  const unsigned short int rummy_value[13] = {1,2,3,4,5,6,7,8,9,10,10,10,10};
  const char *std_card_name[13] = {"Ace","Two","Three","Four","Five","Six",
    "Seven","Eight","Nine","Ten","Jack","Queen","King"};
  const char *std_suit_name[4] = {"Spades","Clubs","Hearts","Diamonds"};

  int j, k, i=0;
  for(j=0; j<4; j++){
    for(k=0; k<13; k++){
      a_card.suit=j; a_card.card=k;
      std_deck[i++] = a_card;
    }
  }

  //check our work
  printf("In a game of rummy:\n");
  for(i=0;i<52;i++){
    printf("  %-5s of %-8s is worth %2d points.\n",
        std_card_name[std_deck[i].card],
        std_suit_name[std_deck[i].suit],
        rummy_value[std_deck[i].card]);
  }

  //a different kind of game.
  enum round_mode {SHEILD_TRUMP, FLOWER_TRUMP, BELL_TRUMP, ACORN_TRUMP, BOCK, GEISS} mode;
  const card jass_deck[36]={
    {0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},
    {1,1},{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{1,8},
    {2,2},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7},{2,8},
    {3,3},{3,1},{3,2},{3,3},{3,4},{3,5},{3,6},{3,7},{3,8},
  };
#define JASS_V {11,0,0,0,0,10,2,3,4}
  const unsigned short int jass_value[9] = JASS_V;
#define JASS_TRUMP_V {11,0,0,0,14,10,20,3,4}
  const unsigned short int jass_trump_value[9] = JASS_TRUMP_V;
#define JASS_BOCK_V {11,0,0,8,0,10,2,3,4}
  const unsigned short int jass_bock_value[9] = JASS_BOCK_V;
#define JASS_GEISS_V {0,11,0,8,0,10,2,3,4}
  const unsigned short int jass_geiss_value[9] = JASS_GEISS_V;
  const char *jass_card_name[9] = {"Ace","Six","Seven","Eight","Nine","Banner",
    "Under","Ober","King"};
  const char *jass_suit_name[4] = {"Sheilds","Flowers","Bells","Acorns"};
  const unsigned short int jass_all_value[6][4][9] = {
    { JASS_TRUMP_V, JASS_V, JASS_V, JASS_V },
    { JASS_V, JASS_TRUMP_V, JASS_V, JASS_V },
    { JASS_V, JASS_V, JASS_TRUMP_V, JASS_V },
    { JASS_V, JASS_V, JASS_V, JASS_TRUMP_V },
    { JASS_BOCK_V, JASS_BOCK_V, JASS_BOCK_V, JASS_BOCK_V },
    { JASS_GEISS_V, JASS_GEISS_V, JASS_GEISS_V, JASS_GEISS_V }
  };

  //check our work 2: work goes on summer vacation
  printf("In a game of jass with trump (Sheilds | Flowers | Bells | Acorns) | Bock | Geiss\n");
  for(i=0;i<36;i++){
    printf("  %-6s of %-7s is worth %8d%10d%8d%9d%8d%8d\n",
        jass_card_name[jass_deck[i].card],
        jass_suit_name[jass_deck[i].suit],
        jass_all_value[SHEILD_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[FLOWER_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[BELL_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[ACORN_TRUMP][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[BOCK][jass_deck[i].suit][jass_deck[i].card],
        jass_all_value[GEISS][jass_deck[i].suit][jass_deck[i].card]);
  }
  return 0;
}

والناتج يشبه:

In a game of rummy:
  Ace   of Spades   is worth  1 points.
  Two   of Spades   is worth  2 points.
  Three of Spades   is worth  3 points.
  Four  of Spades   is worth  4 points.
  Five  of Spades   is worth  5 points.
...
  Nine  of Diamonds is worth  9 points.
  Ten   of Diamonds is worth 10 points.
  Jack  of Diamonds is worth 10 points.
  Queen of Diamonds is worth 10 points.
  King  of Diamonds is worth 10 points.
In a game of jass with trump (Sheilds | Flowers | Bells | Acorns) | Bock | Geiss
  Ace    of Sheilds is worth       11        11      11       11      11       0
  Six    of Sheilds is worth        0         0       0        0       0      11
  Seven  of Sheilds is worth        0         0       0        0       0       0
  Eight  of Sheilds is worth        0         0       0        0       8       8
  Nine   of Sheilds is worth       14         0       0        0       0       0
  Banner of Sheilds is worth       10        10      10       10      10      10
...
  Under  of Acorns  is worth        2         2       2       20       2       2
  Ober   of Acorns  is worth        3         3       3        3       3       3
  King   of Acorns  is worth        4         4       4        4       4       4

والعوامة غير مملة. هذا الرمز لا تجمع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top