Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Игра 21[C++,STL - console wizard]

4.7K
28 февраля 2008 года
bobik02
140 / / 11.09.2007
Нужно написать карточную игру 21 очко. (тектовый режим)
есть колода 36 карт,
двум игрокам (комп и я) раздаеться по 2 карты, дальше игрок может взять еще либо сказать стоп, если число очок больше чем 21 - значит перебор (проиграл)...
очки: 6 это 6 очков, 7 - 7 очков т.е ,
Валет,Дама,Король - по 10 очков
а вот Туз - может быть либо 1 либо 11 (игрок решает сам)

Вот начал было писать:
Код:
#include <iostream>

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(...);
у меня проблемы с синтаксимом
 
Код:
Koloda[i+j*9 -6].suit.push_back(j) ;

подскажите пожалуйста как правильно? :confused:

Только НЕ решайте за меня задачу пожалуйста !!
320
28 февраля 2008 года
m_Valery
1.0K / / 08.01.2007
Еще не вник,но на первый взгляд ... STL - очень правильный выбор.:)
Код:
vector<Card> coll;
    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.
2.0K
28 февраля 2008 года
BroKeR
163 / / 04.05.2006
я бы в структуру добавил еще поле bool играла карта или нет,таким образом вопрос с усекнием будет решен.И на мой взгля вектора тут перемудрят.Есть фиксированный массив в 36 штук.БЕрешь карту рандомом и отмечаешь ее как отиграную,при следуюшей выборке смотришь тип,если карта играла,то на следующую итерацию.ИМХО значительно проще чем перепариваться с векторами
 
Код:
struct card_t
{
    int iNum;
    int iMast;
    bool bPlay;
    enum {KREST,PIKI,BUBI,CHERVY};
};

card_t koloda[36];

а потом берем и при вытаскивании карты проверяем в колоде она или на руках,если на руках то следующую.За пределы массива никогда не выйдем т.к. у кого то будет перебор.То есть примерно так
 
Код:
int k;
while(true)
{
    k=irand(NUM_CARD);
    if (koloda.bPlay) break;
}
koloda;//и есть та самая карта которая нужна.
4.7K
29 февраля 2008 года
bobik02
140 / / 11.09.2007
BroKeR я тоже так было думал реализовать (типа как флаг в *.dbf'никах, если стоит флаг 0 то типа не активно, 1 - активно) вообщем, мне все таки такой вариант больше нравиться:) , збил меня на вектор преподаватель :p ...
// еще думаю написать, что бы у "компа" было такое понятия как фактор риска, тоисть что б комп вовремя остановился и не рисковал (тоисть набрал он ну скажем там 18 и что б дальше не тянул сказал стоп, также что бы "комп" мог приметь туз в различных ситуациях када выдавать за 1 очко , а када и за 11 очков ) вообщем интересная задачка для такого бегинера как я, буду шаманить, спасибо!, если что переспрошу :)
320
29 февраля 2008 года
m_Valery
1.0K / / 08.01.2007
И чем такой вариант с массивом будет лучше и проще ? Обоснуй.ИМХО: прав преподаваатель.
2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
Не надо перепериваться.Значительно так проще.Но если цель в изучении STL тогда конечно.А фактор риска это надо вероятность считать,если по простому,абсолютно на дурака,то примерно в таком прикиде:при достижении значения при которм возможен перебор,из 21 вычитаешь набранные очки,и получившееся количество раз берешь рандомом 1 или 0.Ну если на выходе 0 то тянешь еще карту,если 1 то стопишь...
4.7K
29 февраля 2008 года
bobik02
140 / / 11.09.2007
Цитата: m_Valery
И чем такой вариант с массивом будет лучше и проще ? Обоснуй.


проще для понимания (как то так что ли, пока еще думаю рановато мне в STL лезть)
впринцыпе идея с массивом может и хуже, хотя бы тем что получаеться лишня булевская переменная потом дальше лишняя проверка, ну прям не знаю мож и стоит приглянутся в сторону stl :rolleyes:(преподаватель дал свободу, говорит хочешь используй stl хочешь и без него "парься")

2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
Цитата: m_Valery
И чем такой вариант с массивом будет лучше и проще ?

Зачем простые вещи решать сложными методами???

bobik02 про булеву переменную и проверку это ты погорячился.Ты посмотри как вектор работает,и сколько он будет жрать на перераспределении памяти...Вообще решение вижу примерно в 50 строчках.

320
29 февраля 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: BroKeR
Не надо перепериваться.Значительно так проще.Но если цель в изучении STL тогда конечно...



Так "бо ж той воно" :) Дело ведь скорее всего именно в освоении STL,а не в нахождении простейшего решения.Сама по себе задача хоть как ее не решай - простая и ценность ее ... сам понимаешь.Так хоть контейнеры поюзаешь.Один гуру как то сказал примерно так: "С++ без STL можно сравнить с полетом на кукурузнике,а С++ с STL - с полетом на стэллс." Но раз свобода выбора выбирай что легче.

2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
Цитата: m_Valery
Так хоть контейнеры поюзаешь.Один гуру как то сказал примерно так: "С++ без STL можно сравнить с полетом на кукурузнике,а С++ с STL - с полетом на стэллс."

А я придерживаюсь другого мнения,чем проще тем лучше.Можно в принципе на данном примере и полиморфность пощупать и виртуальные функции и оберток написать.Можно даже для вектора перераспределение памяти реализовать,только вот зачем???Беспорно STL штука хорошая и нужная.Но в меру.И лучше имхо ее начинать изучать с Кенинга и МУ.

4.7K
29 февраля 2008 года
bobik02
140 / / 11.09.2007
Цитата: BroKeR
А я придерживаюсь другого мнения,чем проще тем лучше.Можно в принципе на данном примере и полиморфность пощупать и виртуальные функции и оберток написать.Можно даже для вектора перераспределение памяти реализовать,только вот зачем???Беспорно STL штука хорошая и нужная.Но в меру.И лучше имхо ее начинать изучать с Кенинга и МУ.



я вот так подумал, а все таки Вы правы!
сделаю наверное много решений этой задачи:
на первом этапе сделаю ее с массивом и без stl;
на втором - с вектором и stl;
на третьем - реализовать ее в ООП
и т.к
может еще с консольно(без графики) по псевдографлю ASCII-art'тами...
время то у меня есть, как раз будет повод разные "вещи" пощупать ;)

2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
а чего бы нормально не замутить,под винду????Надо то,DirectX и с помощью него пару функций,нарисовать прямоугольник,натянуть текстуру, в D3DX все есть...Так что карты,что называется,в руки...
320
29 февраля 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: BroKeR
А я придерживаюсь другого мнения,чем проще тем лучше.Можно в принципе на данном примере и полиморфность пощупать и виртуальные функции и оберток написать.Можно даже для вектора перераспределение памяти реализовать,только вот зачем???Беспорно STL штука хорошая и нужная.Но в меру.И лучше имхо ее начинать изучать с Кенинга и МУ.


Студенческие задачи не соблюдают этот принцип.Если изучается какая-то тема,то и решение задачи должно ей соответствовать,несмотря на то что ее как правило можно решить значительно проще.Многое из того что тут пишут(в Студентах) далеко не самое простое по решению,но что поделаешь...А STL делали как раз для упрощения,а не для усложнения и оно(STL) свою задачу выполняет.То, что STL нечто сложное - предрассудок.Знаешь - не сложное,не знаешь - конечно, сложное.А изучать его стоит начинать с Джосюттиса однозначно( это классика ).
ЗЫ: bobik02, давай по существу вопросы.;) А то тему придется опять в Общалку переносить.На твой первый вопрос про вектор я тебе ответил как вставлять.И с перечислением у тебя там ошибочка , заметил ?

4.7K
29 февраля 2008 года
bobik02
140 / / 11.09.2007
Цитата: m_Valery
.И с перечислением у тебя там ошибочка , заметил ?


заметил, но не понял...
структурой предложеной BroKeR :

 
Код:
struct card_t
{
    int iNum;
    int iMast;
    bool bPlay;
    enum {KREST,PIKI,BUBI,CHERVY};
};

почему в перечисления не определено его название ?
(будет ли компилироваться не знаю, нет возможности проверить)
320
29 февраля 2008 года
m_Valery
1.0K / / 08.01.2007
 
Код:
...
    Koloda[i+j*9 -6].suit = j;
...

Так получится "... error C2440: '=' : cannot convert from 'short' to 'Suit' ..."
Надо так Koloda[i+j*9 -6].suit =Suit( j );
2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
Будет,это неименованное перечисление.Ты мог бы задавать значение полю iMast просто цифрами,но для самодокументированности кода так прикольнее.А вообще я бы сделал что нибудь вот такое:
Код:
class CBlackJack
{
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;    
};
4.7K
29 февраля 2008 года
bobik02
140 / / 11.09.2007
Цитата: BroKeR

Будет,это неименованное перечисление.


хм... а как мне тогда обращаться к полям неименованого перечисления ?

2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
Поля это в структуре.А здесь koloda.iMast=KRESTI; и все,все будет нормально.Это равносильно koloda.iMast=0.Но с именованными константми нагляджнее.
4.7K
29 февраля 2008 года
bobik02
140 / / 11.09.2007
Цитата: BroKeR
Поля это в структуре.А здесь koloda.iMast=KRESTI; и все,все будет нормально.Это равносильно koloda.iMast=0.Но с именованными константми нагляджнее.



в структуре iMast определен как тип int а не енумовский...

ну ладно может я реально туплю (доберусь до компилятора обезательно проверю)

2.0K
29 февраля 2008 года
BroKeR
163 / / 04.05.2006
Цитата: bobik02
в структуре iMast определен как тип int а не енумовский...


enum-oм ты просто обзываешь числа,что бы было понятнее.
enum(A(то же самое что 0),B((то же самое что 1)...)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог