Я не совсем понимаю, к каким указателям или управлению памятью вы обращаетесь. Однако это
cin >> a[1000];
неверно. Массив с 1000
элементами имеет последний действительный индекс как 999
. Вы получаете доступ к массиву за пределами, что вызывает неопределенное поведение. Может случиться что угодно (ну, не совсем, но лучше так об этом думать).
Правильный цикл должен быть («правильный» как в «минимальных изменениях, чтобы избежать уб»):
for(int h = 0;h < g; h++){
cout << " Input number: ";
cin >> a[h];
}
Однако, это также вызовет проблемы, когда пользователь вводит число больше чем 1000
для g
. Что вы действительно должны использовать, так это std::vector
, который позволяет вам выдвигать элементы сколько угодно, не указывая их размер во время компиляции.
PS: Если ваш код работает без указателей или ручного управления памятью, то нет причин добавлять его. Указатели и (ручное) управление памятью сложны, обучение тому, как с ними обращаться, в основном сводится к тому, как их избежать.
Попытайтесь создать класс Карты с иском и карты как участник и установить его как тип вектора. Как
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 затем модель могла бы немного отличаться.
Несколько лет назад я записал средство моделирования для вычисления вероятностей в различных сценариях Техас Холдема, и я хотел, чтобы оно произвело подсчеты ДЕЙСТВИТЕЛЬНО быстро. Я начал с очень простой моделью (класс карты, перечисление иска, и т.д.), но после большого профилирования и оптимизации, я закончил с поразрядным представлением.
Каждая карта была шестнадцатиразрядным значением, с тринадцатью старшими битами, представляющими номинальную стоимость, два бита низкоуровневых, представляющие иск, и с битом [2] как специальный флаг, указывающий на туз (используемый только в случаях, где туз мог бы появиться в A2345 прямо).
Вот несколько примеров:
0000000000001001 <---- Two of hearts
0100000000000011 <---- King of spades
1000000000000110 <---- Ace of diamonds
^^^^^^^^^^^^^ ("face-value" bits)
^ ("low-ace" flag)
^^ ("suit" bits)
Можно вообразить, как с дизайном как это это освещает быстро для поиска пар, threes-of-a-kind, и дорожки (сбросы немного более хитры).
Я не войду во все конкретные операции, но достаточно сказать, что этот вид поддержек модели миллионы операций в секунду...
Конечно, имейте в виду, я на самом деле не защищаю это, Вы используете дизайн как это в простой игровой реализации. Единственная причина я закончил с этим дизайном, состоит в том, потому что я должен был провести крупные статистические моделирования.
Поэтому думайте тщательно о том, как Вы хотите смоделировать:
Полная прикладная модель и цели приложения в целом, определят в большой степени типы структур данных, это будет самым соответствующим.
Развлекайтесь!!!
Вы попытались заменить J 11, Q с 12 и K с 13? Затем Вы могли использовать int
egers, а не char
агенты. Замените 11-13 соответствующей буквой позже.
Ну, в первую очередь, дека [0] является одним символом, все же Вы пробуете, для наполнения "2 ч" в него. (в настоящий момент мы проигнорируем что, как Вы делаете, который является неправильным.)
В основном необходимо будет сделать деку a vector<std::string>
. Сделайте карту массивом константы char*s и преобразуйте элементы для строкового представления.
затем использование:
deck.push_back(std::string(card[j]) + suit[i]);
Как упомянуто другими, можно использовать 'T' для десять, J, Q, и K для чисел. До push_back.. так как дека является вектором символов, можно передать только один символ push_back как аргумент. Передача обоих значение карты (1... 9, T, J, Q, K) и его комплект не работает.
Я лично создал бы немного структуры, для представления Карты, со Значением и свойством Suite. Затем можно сделать деку вектором Карт.
Отредактированный: фиксация последнего слова начиная с вектора (меньше) Карта (больше - чем) была представлена, как векторизовали (ничто).
Так как это - программа блэк джека, Вы будете добавлять и сравнивать значение карт.
При этом можно сохранить себя некоторое дополнительное программирование и боль путем предоставления значений интервала карт (1-13) вместо символьных значений.
Я пошел бы с предложением Ross для использования целых чисел. Большинство карточных игр включит некоторые биты математики, таким образом, это будет лучшим представлением.
Преобразуйте в или 'ACE' и т.д. на выводе.
Это не могло бы скомпилировать, но здесь является подходом, который я был бы (и использовать). Вы собираетесь хотеть использовать 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;
}
Я не скомпилировал ни одного из этого, но это должно быть близко.
Так как это - домашняя работа для 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
Блэк джек является скучным. Этот код действительно компилирует.