Задача: Класс Колода карт, использование в карточных играх

Тема в разделе "C/C++/C#", создана пользователем BoltozaR, 1 окт 2010.

  1. BoltozaR

    BoltozaR Гость

    Задачу надо написать в двух вариантах. Один в статической памяти, другой - динамическая память. Лучше писать с коментами на функции. Соответственная умеренная плата(После проверки). По вопросам писать в асю - 422-787-597
    Вот оно...

    1.Разработать класс "игральные карты" в соответствии со следующим заданием:
    Состояние класса -
    Колода игральных карт описывается состоянием (масть и ранг) определённого числа карт (например, от 1 до 52). Для описания карты целесообразно использовать структуру. Память под массив выделяется статически, во время компиляции, и задается массивом фиксированного размера. В группе карт не может быть одинаковых карт.
    Протокол класса -
    Определяет возможности создания и инициализации экземпляров класса и правила их использования (методы класса).
    Предусмотреть следующие возможности:
    -- пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию;
    -- создание экземпляров класса с инициализацией количеством карт, значения которых определяются с помощью генератора случайных чисел;
    -- создание экземпляров класса с инициализацией начальным состоянием одной карты;
    -- ввод экземпляров класса из входного потока и вывод((*) псевдографического рисунка) в выходной поток (с помощью перегруженных операторов <<и>> ;
    --добавить карту к группе, значение которой получается с помощью генератора случайных чисел (с помощью перегруженного префиксного оператора ++);
    --получить масть карты по её номеру в группе (с помощью перегруженного оператора () );
    -- получить ранг карты по её номеру в группе (с помощью перегруженного оператора [] );
    -- упорядочить карты по масти и убыванию ранга;
    -- выделить из группы карт подгруппу карт заданной масти.
    2. Проектирование класса рекомендуется начать с представления состояния класса, учитывающего заданные операции, а затем реализации конструкторов и перегруженного оператора вывода. Для отладки и исчерпывающего тестирования других методов разработанного класса реализовать диалоговую программу, которая позволяет вводить параметры, отлаживаемых методов. Для обработки ошибочных ситуаций использовать механизм исключительных ситуаций.
    3. Повторить разработку класса при условии, что память под массив структур необходимой длины выделяется динамически, во время выполнения программы (с помощью оператора new; память задается указателем на структуру в состоянии класса).
    Дополнить интерфейс класса следующими возможностями:
    -- создание экземпляра класса с его инициализацией другим экземпляром класса (копирующий конструктор);
    -- переопределение экземпляра класса (с помощью перегруженного оператора присваивания).
    4. Написать прикладную программу, использующую разработанный класс.

    Добавлено: Задача будет сдаваться в Visual Studio 5
    язык C++
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Если хотя бы запостишь начало своих идей и кодов - помогу... Причем бесплатно...
     
  3. evked

    evked Гость

    DarkKnight125? а ты уже решил эту задачу???
    У меня просто некоторые проблемы с реализацией интерфейсной части возникли :angry2:
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Реализацию не писал, времени не было как то, да и я и забыл про эту задачу... Автор ее не аппал..
    Но алгоритм мне был понятен еще когда первый раз ее прочитал...
    Так что спрашивай, в чем именно застопорился?
     
  5. evked

    evked Гость

    Добавлено:
    Код (Text):
     #include <iostream>
    using namespace std;
    struct Karta{
    int mast, rang;
    Karta():mast(-1),rang(-1);
    }
    class Koloda{
    int n;
    Karta kol[52];
    public:
    Koloda(int n=0){
    Karta tmp;
    for(int i=0;i<n;i++){
    tmp.mast=rand()%5;
    tmp.rang=rand()%14;
    kol[i]=tmp;
    }
    }

    ;
    Koloda(const Karta& first){
    if(first) n=1,kol[0]=first;
    else n=0;}
    friend istream&operator >>(istream& is, Koloda& kol){
    Karta tmp;
    ;
    friend ostream&operator <<(ostream&, const Koloda&);
    Koloda & operator ++(const Karta& dob);
    int operator ()(int nom) const;
    int & operator [](int nom) const;
    Koloda& sort();
    Koloda vyb(int mas) const;
    };
    Koloda :: Koloda(

    int main (int argc, char *argv[])
    {
    srand (time(NULL));
    cout << "Hello world!" << endl;

    return 0;
    }
    Добавлено: вот, я не знаю какую библиотеку для rand подключать, ну и с вводом / выводом не понятно
     
  6. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    >вот, я не знаю какую библиотеку для rand подключать
    ну что за детский сад? никогда хотя бы так не пробовали?=)
    <style type="text/css">@import url(http://www.google.com/cse/api/branding.css);</style><div class="cse-branding-bottom" style="background-color:#FFFFFF;color:#000000"> <div class="cse-branding-form"> <form action="http://www.google.ru/cse" id="cse-search-box" target="_blank"> <div> <input type="hidden" name="cx" value="partner-pub-9522070088145711:itpxzrl8xir" /> <input type="hidden" name="ie" value="windows-1251" /> <input type="text" value="rand с++" name="q" size="31" /> <input type="submit" name="sa" value="Поиск" /> </div> </form> </div> <div class="cse-branding-logo"> [​IMG] </div> <div class="cse-branding-text"> Найдется все!   </div></div>
    #include <stdlib.h>
    Для time еще вроде time.h надо. но уточните сами =)
     
  7. evked

    evked Гость

    нда, что-то я сглупил малость, исправлюсь
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    evked, Колоду лучше делать очередью... Так будет удобнее...
    Вот подумай сам, выкиним всю теорию... Остановимся на практике...
    Карточная колода... В ней лежат карты... Еще не напоминает очередь (ну или хотя бы стэк ?)
    В самом низу(в конце) - козырь (он светится)... И указатель на конец очереди мы тоже всегда можем показать.....
    А самое главное удобство...
    Вот смотри... Рассмотрим дурака (для скорости возьмем 36 карт)
    6..Т (1..9, где 1-Шесть, 9-ТУЗ), 4 масти
    Заполним очередь колоды(карты), прям по порядку (это наши карты)
    Заполним очередь колоды (игра), из очереди колоды(карты) методом rand()%36..35..34. и т.д. (при этом выкидывая из очереди элементы которые уже взяли)
    Вот и перемешали карты ...
    А на выходе получаем очередь колода(игра), где указатель на начало очереди - это верхняя карта колоды на раздачу, а указатель на конец очереди (это наш козырь из под низа)
     
  9. evked

    evked Гость

    слушай, можешь проверить что я тут наваял
    а знания об очередях мои заканчиваются на fifo и lifo(((
    Код (Text):
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    struct Karta{
    int mast, rang;
    Karta():mast(-1),rang(-1){};
    };
    class Koloda{
    int n;
    Karta kol[52];
    public:
    Koloda(int );

    Koloda(const Karta& first){
    if(n) kol[n]=first;
    else n=0;}
    friend istream&operator >>(istream& , Koloda&);
    friend ostream&operator <<(ostream&, const Koloda& );
    Koloda & operator ++();
    int operator ()(int) const;
    int & operator [](int ) const;
    Koloda& sort();
    Koloda vyb(int mas) const;
    };
    istream&operator>>(istream & is, Koloda & kol){
    Karta tmp;
    if(kol.n+1<52){
    is>>tmp.mast>>tmp.rang;
    kol.n+=1;}
    kol.kol[kol.n]=tmp;
    return is;
    }
    ostream&operator <<(ostream& os, const Koloda& kol) {
    if(kol.n){
    //os<<kol.n<<endl;
    for(int i=0;i<kol.n;i++)
    os<<i<<") "<<kol.kol[i].mast<<" "<<kol.kol[i].rang<<endl;}
    else
    os<< "пустая колода"<<endl;
    return os;
    }
    Koloda ::Koloda(int k=0){
    n=k;

    for(int i=0;i<k&&i<52;){
    int m=rand()%4;
    int r=rand()%13;
    int fl=1;
    // cout<<"*"<<endl;
    for (int j=0;j<k;j++)
    if(kol[j].mast==m&&kol[j].rang==r){
    fl=0;
    break;       
    }
    if(fl){
    kol[i].mast=m;
    kol[i].rang=r;
    i++;     
    }
    }

    };
    Koloda & Koloda :: operator++(){
    Karta tmp1,tmp2;
    int flag=0;
    if (n+1<53){
    for(int i=n;i<n+1;){
    int m=rand()%4;
    int r=rand()%13;
    int fl=1;
    // cout<<"*"<<endl;
    for (int j=0;j<n;j++)
    if(kol[j].mast==m&&kol[j].rang==r){
    fl=0;
    break;       
    }
    if(fl){
    kol[i].mast=m;
    kol[i].rang=r;
    n+=1;
    break;   
    }
    }
    }
    else
    throw "колода полная";
    return *this;
    }
    int Koloda :: operator ()(int nom)const{
    Karta tmp=kol[nom];
    cout<<tmp.mast<<endl;
    }
    int & Koloda :: operator[](int nom)const{
    Karta tmp=kol[nom];
    cout<<tmp.rang<<endl;
    }
    Koloda & Koloda :: sort(){

    for(int i=0;i<n-1;i++){
    Karta tmp1=kol[i];
    for(int j=i+1;j<n;j++){
    Karta tmp2=kol[j];
    if (tmp1.mast=tmp2.mast)
    if (tmp1.rang<tmp2.rang){
    Karta temp;
    temp.mast=kol[i].mast;
    temp.rang=kol[i].rang;
    kol[i].mast=kol[j].mast;
    kol[i].rang=kol[j].rang;
    kol[j].mast=temp.mast;
    kol[j].rang=temp.rang;
    }
    else
    if (tmp1.mast>tmp2.mast){
    Karta temp;
    temp=tmp1;
    tmp1=tmp2;
    tmp2=temp;
    }
    }
    }
    }
    Koloda Koloda :: vyb(int m)const{
    Koloda newkol(0);
    int j=0;
    for(int i=0;i<n;i++){
    if (kol[i].mast==m){
    newkol.n+=1;
    newkol.kol[j].mast=kol[i].mast;
    newkol.kol[j].rang=kol[i].rang;
    j++;
    }
    }
    return newkol;
    }


    int main (int argc, char *argv[])
    {
    srand (time(NULL));
    Koloda kar1(10),kar2;
    ++kar1;
    cout<<kar1<<endl;
    kar1.sort();
    int poi=kar1(3);
    int poiu=kar1[3];
    kar2=kar1.vyb(0);
    cout<<kar2<<endl;
    cout << "Hello world!" << endl;

    return 0;
    }
     
  10. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ок... гляну... только не сегодня голова по швам трещит.. Завтра гляну.... Рейтинг повышу, что бы не забыть...
     
  11. evked

    evked Гость

    я в общем разобрался немного, и вот что получилось, оно даже правильно работает))) осталось пределать в динамику... помоги если сможешь

    Добавлено:
    Код (Text):
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    struct Karta{
    int mast, rang;
    Karta():mast(-1),rang(-1){};
    };
    class Koloda{
    int n;
    Karta *kol;
    public:
    Koloda():n(0) {}
    Koloda(int);
    ~Koloda();
    Koloda (const Koloda &);     
    Koloda(const Karta& first){
    n=1;
    kol[0].mast=first.mast;
    kol[0].rang=first.rang;

    }
    Koloda & operator =(const Koloda &);
    friend istream&operator >>(istream& , Koloda&);
    friend ostream&operator <<(ostream&, const Koloda& );
    Koloda & operator ++();
    int operator ()(int) const;
    int & operator [](int ) const;
    Koloda& sort();
    Koloda vyb(int mas) const;
    };

    istream&operator>>(istream & is, Koloda & kol){
    Karta tmp;
    kol = Koloda();
    int num = 0;
    is >> num;
    if(num > 0 && num < 52){
    kol.n = num;
    for(int j = 0; j<num; j++) {
    //cout<<" введите масть(0-3): ";
    is>>tmp.mast;
    if(tmp.mast >=0 && tmp.mast <= 3)
    //cout<<"введите ранг (0-12): ";
    is>>tmp.rang;
    else
    throw "неверно задана масть";
    if(tmp.rang >= 0 && tmp.rang <= 12) {
    kol.kol[j].mast=tmp.mast;
    kol.kol[j].rang=tmp.rang;
    }
    else
    throw "неверно задан ранг";
    }
    }
    else
    throw "неверный размер колоды";
    return is;
    }
    ostream&operator <<(ostream& os, const Koloda& kol) {
    cout<<kol.n<<endl;
    if(kol.n==1){
    os<<"0)"<<kol.kol[0].mast<<" "<<kol.kol[0].rang<<endl;
    }
    else{
    if(kol.n){
    os<<kol.n<<endl;
    for(int i=0;i<kol.n;i++)
    os<<i<<") "<<kol.kol[i].mast<<" "<<kol.kol[i].rang<<endl;
    }
    else
    os<< "пустая колода"<<endl;
    }
    return os;
    }
    Koloda ::Koloda(int k){
    n=k;
    if(n > 0 && n < 52) {
    for(int i=0;i<k&&i<52;){
    int m=rand()%4;
    int r=rand()%13;
    int fl=1;
    for (int j=0;j<k;j++)
    if(kol[j].mast==m && kol[j].rang==r){
    fl=0;
    break;     
    }
    if(fl){
    kol[i].mast=m;
    kol[i].rang=r;
    i++;
    }
    }
    }
    else
    throw "неверный размер колоды";
    }
    Koloda & Koloda :: operator++(){
    Karta tmp1,tmp2;
    int flag=0;
    if (n+1<53){
    for(int i=n;i<n+1;){
    int m=rand()%4;
    int r=rand()%13;
    int fl=1;
    // cout<<"*"<<endl;
    for (int j=0;j<n;j++)
    if(kol[j].mast==m&&kol[j].rang==r){
    fl=0;
    break;     
    }
    if(fl){
    kol[i].mast=m;
    kol[i].rang=r;
    n+=1;
    break; 
    }
    }
    }
    else
    throw "колода полная";
    return *this;
    }
    int Koloda :: operator ()(int nom)const{
    if (nom > n)
    throw "карт в колоде меньше";
    else{
    Karta tmp=kol[nom];
    cout<<tmp.mast<<endl;
    }
    }
    int & Koloda :: operator[](int nom)const{
    Karta tmp=kol[nom];
    cout<<tmp.rang<<endl;
    }
    Koloda & Koloda :: sort(){

    for (int i=0;i<n;i++)
    for(int j=0;j<n-1;j++){
    if (kol[i].mast>kol[j].mast){
    int m,r; m=kol[i].mast; r=kol[i].rang;
    kol[i].mast=kol[j].mast; kol[i].rang=kol[j].rang;
    kol[j].mast=m; kol[j].rang=r;
    }
    }
    for (int i=0; i<n;i++)
    for(int j=0;j<n-1;j++){
    if(kol[i].mast==kol[j].mast&&kol[i].rang>kol[j].rang){
    int r; r=kol[i].rang;
    kol[i].rang=kol[j].rang;
    kol[j].rang=r;
    }
    }
    return *this;
    }
    Koloda Koloda :: vyb(int m)const{
    Koloda newkol;
    int j=0, fl=0;
    for(int i=0;i<n;i++){
    if (kol[i].mast==m){
    fl=1;
    newkol.n+=1;
    newkol.kol[j].mast=kol[i].mast;
    newkol.kol[j].rang=kol[i].rang;
    j++;
    }
    }
    if (!fl) cout << "такой масти в колоде нет" << endl;
    return newkol;
    }


    int main (int argc, char *argv[])
    {
    srand (time(NULL));
    int a, flagok=0; Koloda kolo(6);
    cout << "Исходная колода: " << kolo << endl;
    do { cout <<"Пустой конструктор-0"<<endl
    <<"1. Инициализация количеством карт"<<endl
    <<"2. Инициализация одной картой"<<endl
    <<"3. ввод вручную"<<endl
    <<"4. Добавить карту(генератор случайных чисел)"<<endl
    <<"5. узнать масть"<<endl
    <<"6. узнать ранг"<<endl
    <<"7. упорядочить по убыванию"<<endl
    <<"8. карты одной масти"<<endl
    <<"9. выход"<<endl
    <<"Введите требуемый вариант: ";
    cin>>a;
    switch (a){
    case 0: {Koloda kolod; cout<<kolod; break;}
    case 1:{
    int par;
    cout<<"введите количество карт: ";
    try {
    cin>>par;
    Koloda kolod(par);       
    cout<<kolod<<endl;}
    catch (const char *msg){cout<<msg<<endl;};
    break;}
    case 2:{
    Karta kart; cout<<"введите масть: "; cin>>kart.mast;cout<<endl;
    cout<<"введите ранг: "; cin>>kart.rang; cout<<endl;
    Koloda koloda(kart);
    cout<<koloda<<endl;
    break;
    }
    case 3:{
    int k;
    Karta kart;
    cout<<"введите масть: "; cin>>kart.mast;
    cout<<"введите ранг: "; cin>>kart.rang;
    Koloda kolod(kart);
    cout << "Колода до ввода: " << kolod << endl;         
    cout<<"введите количество карт, а затем пары ьасть-ранг: ";
    try{
    cin>>kolod;
    }
    catch (const char *msg){cout<<msg<<endl;};
    cout<<"Кодода после ввода: "<<kolod<<endl;
    kolo = kolod;
    break;
    }
    case 4:{
    cout << "Колода до добавления: " << kolo;
    try {
    ++kolo;
    cout << "Колода после добавления: " << kolo <<endl;
    }
    catch (const char *msg){cout<<msg<<endl;};

    break;}
    case 5:{
    cout << "введите номер карты: ";
    int nomer;
    cin >> nomer;
    kolo(nomer);
    break;
    }
    case 6:{cout << "введите номер карты: ";
    int nomer;
    cin >> nomer;
    kolo[nomer];
    break;};
    case 7:{kolo.sort();
    cout << kolo << endl;
    break;
    };
    case 8:{
    cout << "введите желаемую масть: ";
    int mas;
    cin >> mas;
    Koloda kar2;
    // cout << kar2 << " fdg" << endl;
    kar2=kolo.vyb(mas);
    cout << kar2 << endl;
    break;
    };
    case 9: {flagok=1; break;}
    }
    }
    while(!flagok);

    cout << "Hello world!" << endl;

    return 0;
    }
    }
     
Загрузка...
Похожие Темы - Задача Класс Колода
  1. FullhDi
    Ответов:
    2
    Просмотров:
    1.950
  2. vladis222
    Ответов:
    0
    Просмотров:
    1.098
  3. Янчик
    Ответов:
    0
    Просмотров:
    481
  4. TrishaRay
    Ответов:
    1
    Просмотров:
    781
  5. elzim
    Ответов:
    0
    Просмотров:
    929

Поделиться этой страницей