문제

나는 간단한 블랙 잭 프로그램을 만들려고 노력하고 있습니다. 슬프게도, 나는 카드 한 덱을 생성하여 박쥐에서 바로 문제가 있습니다.

#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]와 양복 사이에 무언가를 넣어야합니까? 당신이 나를 올바른 방향으로 인도 할 수 있다면 감사합니다. 또한 부수적으로, 이것은 숙제 과제의 일부이므로 전체 코드 블록을주지 마십시오. 당신의 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

멤버로서 정장과 카드로 카드 클래스를 만들어 벡터 유형으로 설정하십시오. 처럼

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)이있는 카드 클래스를 만들었습니다.

반면에 분석 응용 프로그램이나 AI 플레이어를 구축하는 경우 모델이 약간 다를 수 있습니다.

몇 년 전, 나는 다양한 Texas Holdem 시나리오에서 확률을 계산하기 위해 시뮬레이터를 작성했으며, 숫자를 신속하게 바꾸고 싶었습니다. 나는 매우 간단한 모델 (카드 클래스, 소송 열거 등)으로 시작했지만 많은 프로파일 링과 최적화 후에는 약간의 표현이되었습니다.

각 카드는 16 비트 값이며, 13 개의 고차 비트가 액면가를 나타내는 13 개의 고차 비트, 슈트를 나타내는 2 개의 저급 비트, 비트 [2]는 에이스를 나타내는 특수 플래그로 비트 [2]. ACE는 A2345 직접 나타날 수 있습니다).

몇 가지 예는 다음과 같습니다.

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

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

이와 같은 디자인으로 쌍, 3 세의 3 인칭 및 스트레이트를 찾는 데 빠르게 조명하는 방법을 상상할 수 있습니다 (플러시가 약간 더 까다 롭습니다).

나는 모든 특정 작업에 들어 가지 않을 것이지만, 이런 종류의 모델이 초당 수백만 개의 작업을 지원한다고 말하면 충분합니다 ...

물론, 나는 실제로 당신이 간단한 게임 구현에서 이와 같은 디자인을 사용한다고 옹호하지 않습니다. 내가이 디자인으로 끝난 유일한 이유는 방대한 통계 시뮬레이션을 수행해야했기 때문입니다.

따라서 어떻게 모델링하고 싶은지주의 깊게 생각하십시오.

  • 각 카드
  • 선수의 손
  • 전체 데크
  • 테이블의 상태 ... 모든 플레이어 손 (초기 손을 나누는 플레이어 포함), 아마도 6 데크 신발, 버려진 더미 등을 포함하여

전체 응용 프로그램 모델과 일반적으로 응용 프로그램의 목표는 가장 적합한 데이터 구조의 유형을 크게 결정합니다.

재미있게 보내세요 !!!

10 대신 't'를 사용하십시오.

j를 11, Q로 Q로 교체하고 13으로 k를 교체 해 보셨습니까? 그런 다음 사용할 수 있습니다 int이거보다는 charActers. 나중에 11-13을 적절한 편지로 교체하십시오.

우선, 데크 [0]은 하나의 숯이지만, 당신은 "2H"를 채우려고 노력하고 있습니다. (현재, 우리는 당신이 어떻게 그렇게하고 있는지 무시할 것입니다.)

기본적으로 데크를 만들어야합니다 vector<std::string>. 카드를 const char*s 배열로 만들고 요소를 문자열로 변환하십시오.

그런 다음 사용하십시오 :

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

다른 사람들이 언급했듯이, 수치에는 't'를 10, j, q 및 k에 사용할 수 있습니다. 푸시 _back .. 데크는 숯의 벡터이므로 하나의 숯 만 푸시 _back으로 전달할 수 있습니다. 카드 값 (1 ... 9, t, j, q, k)을 모두 전달하고 스위트는 작동하지 않습니다.

나는 개인적으로 값과 스위트 속성을 가진 카드를 대표하기 위해 작은 구조물을 만들 것입니다. 그런 다음 데크를 카드 벡터로 만들 수 있습니다.

편집 : 벡터 (보다 작은) 카드 (더 큰) 이후 마지막 단어 수정 (벡터보다 더 큰)이 벡터로 렌더링되었습니다 (아무것도).

이것은 컴파일되지 않을 수도 있지만 여기에 내가 할 접근 방식이 있습니다. ints를 사용하여 카드를 표현하고 싶지만 클래스에서 쉽게 추상화 할 수 있습니다. 나는 당신을 위해 쓸 것입니다.

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

나는 이것을 컴파일하지 않았지만 가까워 야합니다.

이것은 블랙 잭 프로그램이므로 카드의 가치를 추가하고 비교하게됩니다.

그렇다면 카드를 제공하여 추가 프로그래밍과 고통을 저장할 수 있습니다. int 대신 값 (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, Jack, Queen, King, Ace 모든 단일 정장. 그것들은 결코 변하지 않을 것입니다. 그래서 나는 두 개의 루프를 사용했습니다 정장 그리고 다른 하나는 .

그것은 다음과 같은 것이 었습니다.

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

이제 그 루프들 중 하나에서 정수 값을 사용합니다. 그 이유는 간단합니다. 카드는 숫자입니다. 4 정장. 13 값. 블랙 잭 게임의 수치 값조차도. 액면가, 안면 카드를 때릴 때까지, 수치 값 10 인 수치 값 1 또는 11 인 에이스를 때릴 때까지. 모든 것은 숫자입니다. 따라서 해당 숫자를 사용하여 카드 값뿐만 아니라 카드의 소송 및 숫자 시퀀스의 숫자를 할당 할 수 있습니다.

한 가지 아이디어는 카드 클래스에지도를 저장하는 것입니다. 카드의 숯 또는 문자열 이름은 1,2,3입니다. 각각의 인덱스입니다.

나는 정수를 사용하기 위해 Ross의 제안과 함께 갈 것입니다. 대부분의 카드 게임에는 약간의 수학이 포함되므로 더 나은 표현입니다.

출력시 '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