Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2014, 21:09   #1
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию игра подобие на 21(блэкджек)

Решил попробывать написать игру в 21/блэкджек(пока что-то среднее).
Правила таковы: кто набирает 21 выигрывает, если никто 21 не набрал выигрывает тот кто набрал ближе всех к 21 но не больше. картинки -10 очков, туз - 11, остальные по номиналу.
Всякие более тонкие нюансы пока не добавлял(тут с этим бы разобраться)
Решил согласно ООП делать. Можете посмотреть - целесообразно было вообще городить классы?)) ну типа рационально составлена программа?))) ПОтому что мне кажется не совсем))).
Ну вообщем хотелось чтоб показали на мои ошибки и т.д. Как было бы правильней спроэктировать подобную программу....
Код:
#include <cstdlib>
#include <iostream>

using namespace std;
///////////////////////////////////////////////////////
class card{
      char suit, rank;
      int cost;
      char name[2];
      public:
      card(int c=-1);
      //card(const card &o){int c=-1;};
      void showcard();
      int costs(){
          return cost;
          }
      };
card::card(int c){
               if(c==-1){
                         suit=0;
                         rank=0;
                         }
         suit=c/13;
         rank=c%13;
         cost=(rank<=8)?(rank+2):10;
         if(rank==12) cost=11;
         name[0]=259+suit;
         name[1]="23456789TJQKA"[rank];
             }
void card::showcard(){
          cout<<name[0]<<name[1]<<" ";
          //cout<<"["<<costs()<<"]"<<" ";       
                 }
//////////////////////////////////////////////////////
class pack{int size;
      card a[52];
      public:
      pack();
      card getcard();
      void pushcard();
      void shuffle();
      void showpack();
      };
pack::pack(){size=51;
     for(int i=0;i<=size;i++)
     a[i]=card(i);
     }
card pack::getcard(){
     if(!size){
     cout<<"pack is empty";
     return 0;
     }
     size--;
     return a[size+1];
     }
void pack::showpack(){
     for(int i=0;i<=size;i++)
     {if(!(i%13))cout<<"\n";
     a[i].showcard();}
     }
 void pack::shuffle(){
      srand(time(0));
      card ch;
      int r;
      for(int i=0;i<52;i++)
      {r=rand()%51;
      ch=a[r];
      a[r]=a[i];
      a[i]=ch;}
      }     

////////////////////////////////////////////////////
 class player{int cards;
       card hand[9];
       static int  count;
       int number;
       int result;
       public:
       friend void showhand(player &p);
       player();
       ~player(){count--;}
       player(const player &p){
       for(int i=0;i<9;i++)
       hand[i]=p.hand[i]  ;         
                 } 
       void givehand(pack &a);
       friend void showhand(player p[],int c);
       card takecard(pack &a);
       int costhand();
       int getnumber(){return number;}
       void setresult(int a){result=a;}
       };
       int player::count;
 player::player(){
                  number=count;
                  count++;
       for(int i=0;i<9;i++)
       hand[i]=card(-1)  ;         
                  }
 
 void player::givehand(pack &a){
      hand[0]=a.getcard();
      hand[1]=a.getcard();
      cards=2;
      }
card player::takecard(pack &a){
     hand[cards]=a.getcard();
     cards++;
}
int player::costhand(){
     int cost=0;
     for(int i=0;i<cards;i++)
     cost+=hand[i].costs();
     return cost;
     }


void showhand(player &p){        //Показывает карты игроков
      if(!p.getnumber())cout<<"\nYOUR HAND: ";
      else cout<<"\nPlayerN"<<p.getnumber()<<" hand: " ;
      for(int i=0;i<p.cards;i++)
      p.hand[i].showcard();
      }


int computerturn(pack &a,player &p){     //Типа комп играет)))
     srand(time(0));
     int r,ran;
     for(;;){
     r=p.costhand();
     ran=rand()%(21-r);
     if ((r>=0)&&(r<22))
     if(ran>((21-r-1)/2)-1) p.takecard(a);
     else  break;
     else break;}    
     return p.costhand();    
     }
//void winner(int* w,int countp)
     
     
    
int game(pack a,int countp, player &p){ //часть игры осуществляемая человеком
char ch;
do
{             for(;;){
                   cout<<"\nHit? Y/N?";
                   cin>>ch;
                   if ((ch=='Y')||(ch=='y')){
                        p.takecard(a);
                        showhand(p);
                        }
                        else break;
                        if(p.costhand()>=21) break;
                        }
                        
                    return p.costhand();
                                    
                   } while(ch!=0);
}

Последний раз редактировалось tolikprankster; 04.08.2014 в 21:12.
tolikprankster вне форума Ответить с цитированием
Старый 04.08.2014, 21:09   #2
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Код:
int main(int argc, char *argv[])
{   cout<<" ***21***  by  <<<ROGA & KOPITA>>> allRights reserved(C)\n\n\n";
    cout<<"T - Ten, J - Jack, Q - Queen,  K - King A- Ace.\n";

for(;;)
{pack a;
a.shuffle();
//a.showpack();
int countp=6;
player p[countp];
int w[countp];
int change;
for(int i=0;i<countp;i++)
{p[i].givehand(a);
showhand(p[i]);
}
int q = game(a,countp,p[0]);
if(q==-1) cout<<"GAME OVER!LOSER!";
else {cout<<"YOUR RESULT: "<<q<<"\n";
w[0]=q;
             for(int i=1;i<countp;i++)
                  {computerturn(a,p[i]);
                   showhand(p[i]);
                   w[i]=computerturn(a,p[i]);
                   cout<<"\nResult: "<<w[i]<<" score"; 
                  }
    }   
    
int max=0;
     for(int i=0;i<countp;i++)              //находим макс значение
     {if(w[i]<=21)
     if (w[i]>max)max=w[i];}
     if(max==0) cout<<"\n <<<<NOBODY WIN>>>";
     else{cout<<"\nWINNER:";
     for(int i=0;i<countp;i++)              //выводим победителей
     if (w[i]==max)cout<<"\nPlayerN"<<i<<" with"<<max<<" scores"; 
     }    
cout<<"\nDo you want play again?Y/N?";
char ch;
cin>>ch;
if ((ch!='Y')&&(ch!='y'))return 0;
}
}
А И ЕЩЁ! Иногда прога вылетает: "Ошибка приложения. Исключение unknown software exception(0xc00000094) в приложении по адресу 0ч00401baf"
Может кто-нибудь подсказать в чем тут проблема?
tolikprankster вне форума Ответить с цитированием
Старый 04.08.2014, 21:31   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код вообще не читаемый.
Код:
suit=c/13;
         rank=c%13;
         cost=(rank<=8)?(rank+2):10;
         if(rank==12) cost=11;
         name[0]=259+suit;
         name[1]="23456789TJQKA"[rank];
Что такое 13, 12, 11, 8, 2, 10, 259, 0, 1 ?
Так писать нельзя, руки отобьют.


Отформатируй код. Это не дело:
Код:
for(int i=0;i<countp;i++)
{p[i].givehand(a);
showhand(p[i]);
}
int q = game(a,countp,p[0]);
if(q==-1) cout<<"GAME OVER!LOSER!";
else {cout<<"YOUR RESULT: "<<q<<"\n";
w[0]=q;
             for(int i=1;i<countp;i++)
                  {comput
расставь отступы, пробелы и переводы строк нормально.

Назови нормально переменные и методы. Вот этот кусок:
Код:
class player{int cards;
       card hand[9];
       static int  count;
       int number;
       int result;
я читаю так:
- игрок держит карты. Все карты что он держит - это одно целое число (ты назвал cards - оно во множественном числе и переводится "карты")
- не понятно, но походу у игрока 9 рук (hand). И каждая рука - это карта (имеет тип "card"). Хотя, если у него много рук - то должно быть hands (множественное число, как cards).
- count - статическая переменная класса, она наверное хранит количество игроков (общее, она ведь общая для всех игроков и называется "количество")
- у каждого игрока есть номер
- у каждого игрока есть результат (не понятно что это, наверное имелся ввиду счет, но я не уверен).

Код плохой, надо переписывать. Но а пока что твой код читать невозможно. Проще удалить и написать новый.
rrrFer вне форума Ответить с цитированием
Старый 04.08.2014, 21:46   #4
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код вообще не читаемый.
Код:
suit=c/13;
         rank=c%13;
         cost=(rank<=8)?(rank+2):10;
         if(rank==12) cost=11;
         name[0]=259+suit;
         name[1]="23456789TJQKA"[rank];
Что такое 13, 12, 11, 8, 2, 10, 259, 0, 1 ?
Так писать нельзя, руки отобьют.
с- порядковый номер карты, делится на 13 и получается ранг карты(король,дама)
8-это порядковый номер 10 в массиве "23456789TJQKA" - для всех картот 2 до 10 чтоб получить ранг добавляется 2 к порядковому номеру (ибо 2 - нулевой эл массива, 3 -первый и т.п.)
12 - если эл-нт идет 12 то ему присваивается кост(кол-во очков которые "весит" карта)
259 - код символа масти)))

А как лучше(правильней) сделать? создать отдельные переменные или константы для: 13,12,8,2,10 259 и т.д. с именами по типу pos, suitcode ?

Последний раз редактировалось tolikprankster; 04.08.2014 в 22:43.
tolikprankster вне форума Ответить с цитированием
Старый 04.08.2014, 22:31   #5
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение

Назови нормально переменные и методы. Вот этот кусок:
Код:
class player{int cards;
       card hand[9];
       static int  count;
       int number;
       int result;
я читаю так:
- игрок держит карты. Все карты что он держит - это одно целое число (ты назвал cards - оно во множественном числе и переводится "карты")
- не понятно, но походу у игрока 9 рук (hand). И каждая рука - это карта (имеет тип "card"). Хотя, если у него много рук - то должно быть hands (множественное число, как cards).
hand(рука) - представляет собой массив карт(9 - макс число карт которое может находится на руках у игрока)
tolikprankster вне форума Ответить с цитированием
Старый 05.08.2014, 05:16   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
с- порядковый номер карты, делится на 13 и получается ранг карты(король,дама)
8-это порядковый номер 10 в массиве "23456789TJQKA" - для всех картот 2 до 10 чтоб получить ранг добавляется 2 к порядковому номеру (ибо 2 - нулевой эл массива, 3 -первый и т.п.)
12 - если эл-нт идет 12 то ему присваивается кост(кол-во очков которые "весит" карта)
259 - код символа масти)))

А как лучше(правильней) сделать? создать отдельные переменные или константы для: 13,12,8,2,10 259 и т.д. с именами по типу pos, suitcode ?
Правильней имена давать нормальные.

вместо c используй id или cardNumber или numberOfCard

Не знаю что такое 13, но наверное - количество карт (видов карт)

const int numOfCardTypes = 13;
или если внутри класса Card - то просто numOfTypes.

--------------------------- добавил
Цитата:
hand(рука) - представляет собой массив карт
Рука - это штука с пятью пальцами. Выбирай имена.

-----------------------------добавил

Цитата:
259 - код символа масти)))
259 - код символа масти)))

Код:
enum SuitType {
  Baptize,
  Bubi,
  Worms,
  Peaks
};
// Теперь SuitType::Bubi - код символа масти.

Последний раз редактировалось rrrFer; 05.08.2014 в 05:18.
rrrFer вне форума Ответить с цитированием
Старый 05.08.2014, 05:45   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Как человек недавно писавший заготовку для карточной игры вообще и для блекджека (21) в частности (хоть и на C#), меня убивает
Код:
enum SuitType {
  Baptize,
  Bubi,
  Worms,
  Peaks
};
WTF? тем более, что предложением выше советуется делать нормальные имена.
Код:
enum SuitType {
  Clubs,
  Diamonds,
  Hearts,
  Spades
};
phomm вне форума Ответить с цитированием
Старый 05.08.2014, 06:00   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

phomm
Ну...согласен. Я не картежник, я пользовался гуглотранслэйтом ))
Да, так делать нельзя. Но я типа суть пытался отразить (вроде отразил).

ЗЫ: а че, не Worms что-ли? xD
rrrFer вне форума Ответить с цитированием
Старый 05.08.2014, 13:12   #9
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Правильней имена давать нормальные.

вместо c используй id или cardNumber или numberOfCard

Не знаю что такое 13, но наверное - количество карт (видов карт)

const int numOfCardTypes = 13;
или если внутри класса Card - то просто numOfTypes.

--------------------------- добавил

Рука - это штука с пятью пальцами. Выбирай имена.

-----------------------------добавил



259 - код символа масти)))

Код:
enum SuitType {
  Baptize,
  Bubi,
  Worms,
  Peaks
};
// Теперь SuitType::Bubi - код символа масти.
Буду исправлять. А насчет руки не согласен, так как это чисто карточное выражение: http://www.poker-wiki.ru/poker/Рука
tolikprankster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подобие меток в Qt Mr_ViK Помощь студентам 2 02.04.2014 16:54
Подобие градиента ACE Valery Помощь студентам 9 30.03.2013 15:00
подобие лайтбокса 9i. JavaScript, Ajax 0 29.07.2012 23:19
подобие треугольников Виталя Woody Помощь студентам 3 25.03.2010 22:02
Подобие карты сайта. Proger10 JavaScript, Ajax 5 12.05.2009 19:46