Игра 21[C++,STL - console wizard]
есть колода 36 карт,
двум игрокам (комп и я) раздаеться по 2 карты, дальше игрок может взять еще либо сказать стоп, если число очок больше чем 21 - значит перебор (проиграл)...
очки: 6 это 6 очков, 7 - 7 очков т.е ,
Валет,Дама,Король - по 10 очков
а вот Туз - может быть либо 1 либо 11 (игрок решает сам)
Вот начал было писать:
using namespace std;
enum Suit { pika, tref , cherva , buba }; // Масти
struct Card
{
short number; // достоинсво карты
Suit suit; // масть
};
int main()
{
Card Koloda[36];
for (short i = 6; i < 15 ; i++) // заполняем достоинства
{
for (short j = 0; j < 4; j++) // заполняем масти
{
Koloda[i+j*9 -6].suit = j ;
Koloda[i+j*9 -6].number = i;
}
}
return 0;
}
А потом подумал:
ну ладно есть колода, допустим выдам я пользователю какую нить картежку или две или больше (радоном от 0 до 35)
получаеться карта с колоды ушла! как усекать что карта вышла (подумал я)
тоисть, ну там скажем получил я радомон 31 (Koloda[31] number:10 suit:3) или любую другую карту, как мне потом сделать так что бы уже 31 ил др. не выдавало при следуйщих раздачах во время игры...
и понял что моя реализация обречена на провал...
додумался это все запихнуть не в массив а в vector<Card> Koloda
потом Koloda.push_back(...);
Koloda.erase( ... )
И карту отдавать random()%Koloda.size()
...
Но есть вопросы,
например пусть будет тот же цикл, только вместо массива надо правильно написать
Koloda.push_back(...);
у меня проблемы с синтаксимом
подскажите пожалуйста как правильно? :confused:
Только НЕ решайте за меня задачу пожалуйста !!
for (short i = 6; i < 15 ; ++i) // заполняем достоинства
{
for (short j = 0; j < 4; ++j) // заполняем масти
{
Card d;
d.number = i;
d.suit = Suit(j);
coll.push_back(d);
}
}
random_shuffle(coll.begin(),coll.end());
for(size_t i = 0;i < coll.size();++i)
cout << coll.number << " " << coll.suit << endl;
...
Создаешь массив карт.Заполняешь,тасуешь - для этого используешь алгоритм random_shuffle.
{
int iNum;
int iMast;
bool bPlay;
enum {KREST,PIKI,BUBI,CHERVY};
};
card_t koloda[36];
а потом берем и при вытаскивании карты проверяем в колоде она или на руках,если на руках то следующую.За пределы массива никогда не выйдем т.к. у кого то будет перебор.То есть примерно так
while(true)
{
k=irand(NUM_CARD);
if (koloda.bPlay) break;
}
koloda;//и есть та самая карта которая нужна.
// еще думаю написать, что бы у "компа" было такое понятия как фактор риска, тоисть что б комп вовремя остановился и не рисковал (тоисть набрал он ну скажем там 18 и что б дальше не тянул сказал стоп, также что бы "комп" мог приметь туз в различных ситуациях када выдавать за 1 очко , а када и за 11 очков ) вообщем интересная задачка для такого бегинера как я, буду шаманить, спасибо!, если что переспрошу :)
проще для понимания (как то так что ли, пока еще думаю рановато мне в STL лезть)
впринцыпе идея с массивом может и хуже, хотя бы тем что получаеться лишня булевская переменная потом дальше лишняя проверка, ну прям не знаю мож и стоит приглянутся в сторону stl :rolleyes:(преподаватель дал свободу, говорит хочешь используй stl хочешь и без него "парься")
Зачем простые вещи решать сложными методами???
bobik02 про булеву переменную и проверку это ты погорячился.Ты посмотри как вектор работает,и сколько он будет жрать на перераспределении памяти...Вообще решение вижу примерно в 50 строчках.
Так "бо ж той воно" :) Дело ведь скорее всего именно в освоении STL,а не в нахождении простейшего решения.Сама по себе задача хоть как ее не решай - простая и ценность ее ... сам понимаешь.Так хоть контейнеры поюзаешь.Один гуру как то сказал примерно так: "С++ без STL можно сравнить с полетом на кукурузнике,а С++ с STL - с полетом на стэллс." Но раз свобода выбора выбирай что легче.
А я придерживаюсь другого мнения,чем проще тем лучше.Можно в принципе на данном примере и полиморфность пощупать и виртуальные функции и оберток написать.Можно даже для вектора перераспределение памяти реализовать,только вот зачем???Беспорно STL штука хорошая и нужная.Но в меру.И лучше имхо ее начинать изучать с Кенинга и МУ.
я вот так подумал, а все таки Вы правы!
сделаю наверное много решений этой задачи:
на первом этапе сделаю ее с массивом и без stl;
на втором - с вектором и stl;
на третьем - реализовать ее в ООП
и т.к
может еще с консольно(без графики) по псевдографлю ASCII-art'тами...
время то у меня есть, как раз будет повод разные "вещи" пощупать ;)
Студенческие задачи не соблюдают этот принцип.Если изучается какая-то тема,то и решение задачи должно ей соответствовать,несмотря на то что ее как правило можно решить значительно проще.Многое из того что тут пишут(в Студентах) далеко не самое простое по решению,но что поделаешь...А STL делали как раз для упрощения,а не для усложнения и оно(STL) свою задачу выполняет.То, что STL нечто сложное - предрассудок.Знаешь - не сложное,не знаешь - конечно, сложное.А изучать его стоит начинать с Джосюттиса однозначно( это классика ).
ЗЫ: bobik02, давай по существу вопросы.;) А то тему придется опять в Общалку переносить.На твой первый вопрос про вектор я тебе ответил как вставлять.И с перечислением у тебя там ошибочка , заметил ?
заметил, но не понял...
структурой предложеной BroKeR :
{
int iNum;
int iMast;
bool bPlay;
enum {KREST,PIKI,BUBI,CHERVY};
};
почему в перечисления не определено его название ?
(будет ли компилироваться не знаю, нет возможности проверить)
Koloda[i+j*9 -6].suit = j;
...
Так получится "... error C2440: '=' : cannot convert from 'short' to 'Suit' ..."
Надо так Koloda[i+j*9 -6].suit =Suit( j );
{
public:
CBlackJack() {};//тут инициализируем игру
int GetCard();//взять карту
bool CheckSumPlayer() {if (numPointPlayer>21) return false; return true;};//проверить сумму очков игрока
bool CheckSumComp() {if (numPointComp>21) return false; return true;};//проверить сумму очков компа
void AddPlayerPoint(int) {numPointPlayer+=x;};//добавить очков игроку
void AddCompPoint(int x) {numPointComp+=x;}//добавить очков компу
private:
enum {KREST,PIKI,BUBI,CHERVI,ALL_CARD=36};
struct card_t
{
int iNum;
int iMast;
bool bPlay;
};
card_t kol[ALL_CARD];
int numPlayerPoint;
int numCompPoint;
};
Будет,это неименованное перечисление.
хм... а как мне тогда обращаться к полям неименованого перечисления ?
в структуре iMast определен как тип int а не енумовский...
ну ладно может я реально туплю (доберусь до компилятора обезательно проверю)
enum-oм ты просто обзываешь числа,что бы было понятнее.
enum(A(то же самое что 0),B((то же самое что 1)...)