Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   BlackJack (http://forum.oszone.net/showthread.php?t=251043)

SAU-trade 10-01-2013 00:27 2062932

BlackJack
 
Здравствуйте! Пытаюсь реализовать игру Блэк Джэк. Создаю колоду, тусую. Вопрос вот в чем как организовать выдачу карт с извлечением их из колоды(тобишь чтобы они были на руках но в калоде не числились)))...

Код:

//Card.h

#include <iostream>
#include <string.h>

using namespace std;

enum Suit {clubs, diamonds, hearts, spades};

class Card{
private:
        Suit suit;
        int face;
public:
        Card();
        void setCard(int, Suit);
        void PrintCard();
        void setScore();
};

Код:

//Card.cpp
#include <iostream>
#include "Card.h"

using namespace std;

Card::Card(){
        this->face = 0;
        this->suit = (Suit)0;

}

void Card::setCard(int f, Suit s){
        this->face = f;
        this->suit = s;
}

void Card::PrintCard(){
        if (face >= 2 && face <= 10)
                cout << face;
        else{
                switch (face){
                        case 11: cout << 'J'; break;
                        case 12: cout << 'Q'; break;
                        case 13: cout << 'K'; break;
                        case 14: cout << 'A'; break;
                }
        }
        switch (suit)
        {
          case clubs: cout << static_cast<char>(5); break;
          case diamonds: cout << static_cast<char>(4); break;
          case hearts: cout << static_cast<char>(3); break;
          case spades: cout << static_cast<char>(6); break;
        }
}

Код:

//CardBatch.h

#include <iostream>
#include "Card.h"

class Card_Batch{
        Card* cards;
public:
        Card_Batch();
        void setCard_Batch();
        void Shuffle();
        void display();

        void getcard(); // Тест... для извлечения карты в этом классе временно
};

Код:

//CardBatch.cpp

#include <iostream>
#include "CardBatch.h"
#include <ctime>

using namespace std;

Card_Batch::Card_Batch(){
        const int size = 52;
//        this->score = 0;
        cards = new Card[size];
}

//Создание колоды карт
void Card_Batch::setCard_Batch(){
        for(int i = 0; i < 52; i++){
                int f = (i%13) + 2;
                Suit s = Suit(i/13);
                cards[i].setCard(f, s);
        }
}

//Тусуется колода карт
void Card_Batch::Shuffle(){
        srand (unsigned(time(NULL)));
        for(int i = 0; i < 52; i++){
                int k = rand()%52;                //выбираем случайную карту
                Card temp = cards[i];        //и меняем ее с текущей
                cards[i] = cards[k];
                cards[k] = temp;
        }

}

void Card_Batch::display(){
        for (int i = 0; i < 52; i++ ){
                cards[i].PrintCard();
                if(!((i+1)%13))                        // начинаем новую строку после каждой 13-й карты
                  cout << endl;
    }
        cout << "\n\n\n";
}


void Card_Batch::getcard(){
        for(int i = 0; i < 2; i++)
                cards[i].PrintCard();
}

Код:

//main

//Тестовый режим

#include <iostream>
#include "CardBatch.h"

using namespace std;

int main(){
        setlocale(LC_ALL,"russian");
        Card_Batch A;
        A.setCard_Batch();
        A.display();

        A.Shuffle();
        A.display();

        A.getcard();
        cout << endl;
        A.getcard();

П.С. Если я неправильно организовываю классы буду внимателен к вашим замечаниям.. Заранее спс.

lxa85 10-01-2013 08:54 2063068

SAU-trade, можно тебя попросить прикрепить проект?
Цитата:

Цитата SAU-trade
Вопрос вот в чем как организовать выдачу карт с извлечением их из колоды(тобишь чтобы они были на руках но в калоде не числились) »

Извернуться, организовать списки карт.
Ну хорошо, не списки, массивы.
Организовать дополнительное поле в массиве колоды карт с номером игрока(1-10), выбывшей картой(99),не разыгранной картой(0).

torauma 10-01-2013 09:24 2063082

Цитата:

Цитата SAU-trade
Создаю колоду, тусую. »

Если я правильно понял, то создание колоды и ее перетасовка реализованы? То есть, имеется массив, содержащий карты в случайном порядке?
Цитата:

Цитата SAU-trade
как организовать выдачу карт с извлечением их из колоды(тобишь чтобы они были на руках но в калоде не числились)))... »

Если сказанное мной выше верно, то почему бы тупо не пройти этот массив в цикле for?

Если я что то неправильно понял, то выкладывайте файлы проекта и правила игры.

Tonny_Bennet 10-01-2013 09:49 2063102

SAU-trade, я не стал сильно вникать в код. Когда-то давно я писал что-то подобное. И для карт я сделал класс объектов (или структуру) поля которого содержали следующее:
- масть
- вес (2-10, J, Q, K, A, Joker)
- местонахождение карты (колода, стол, игрок 1, игрок 2 и т.д.)

Создавал в цикле колоду карт (а именно массив объектов вышестоящего класса), перемешивал её (но алгоритм я тогда какой-то жудко мудрёный придумал со сторонним генератором случайных чисел). Создавал игроков. Раздавал карты в нужной последовательности. Исходя из своих карт и карт на столе просчитывал вероятности выпадения той или иной комбинации (пара, тройка,флеш и т.д.). По идее ещё нужно было просчитывать возможные комбинации у партнёров по игре и следить за ставками, но до этого руки так и не дошли.

SAU-trade 10-01-2013 10:14 2063127

Вложений: 1
Да реализация колоды и ее перемешивания реализованы.. Я пробЫвал циклом for вытаскивать две карты - вытаскивает, ток я не знаю как сделать чтобы они из колоды выходили... Так как получается что следующие две карты выходят те же))

Правила просты: каждому игроку вначале выдается по две карты... Идет проверка выпало ли кому 21 очко.. Если нет - первый игрок решает добрать карту или нет... Если да опять проверка больше/меньше 21? и т.д. Если выбор не добирать -- компьютер выбирает добрать карту или стоять... Если стоять, тогда сравниваются очки у двух игроков и выигрывает у кого больше)

SAU-trade 10-01-2013 10:20 2063130

Вложений: 1
Результат работы

Tonny_Bennet 10-01-2013 11:27 2063178

Цитата:

Цитата SAU-trade
Я пробЫвал циклом for вытаскивать две карты - вытаскивает, ток я не знаю как сделать чтобы они из колоды выходили »

Опять же я не стану вникать в код и пока буду просто говорить о "высоком"...

Что вы понимаете под фразой вытаскивать? К примеру у вас есть массив колоды, и если вы "вытаскиваете" карту, то есть несколько вариантов: или ввести поле указывающее на расположение этой карты (колода, игрок1, игрок2 и т.д.), или просто перенести этотот объект (карту) в другой массив - массив набора карт игрока (состоящий из 2-х элементов). Соответственно у вас будет массив колоды с пустыми элементами, потом его можно переопределить, чтобы убрать эти пустые элементы.

Цитата:

Цитата SAU-trade
Правила просты: каждому игроку вначале выдается по две карты... Идет проверка выпало ли кому 21 очко.. Если нет - первый игрок решает добрать карту или нет... Если да опять проверка больше/меньше 21? и т.д. Если выбор не добирать -- компьютер выбирает добрать карту или стоять... Если стоять, тогда сравниваются очки у двух игроков и выигрывает у кого больше) »

Правила понятны, но не понятно кто с кем играет. Один человек играет против "искусственного интеллекта" или игроков больше? Если игрок один и он играет с компьютером то компьютер нужно наделить какими-то знаниями и тактикой? По какому принципу компьютер будет добирать себе карту? Только если у него недобор? А если у него 20 очков... я бы на его месте остановился что б потом перебора небыло :)

SAU-trade 10-01-2013 12:51 2063250

Цитата:

Цитата Tonny_Bennet
Правила понятны, но не понятно кто с кем играет. »

игрок с компом))

Цитата:

Цитата Tonny_Bennet
Что вы понимаете под фразой вытаскивать? К примеру у вас есть массив колоды, и если вы "вытаскиваете" карту, то есть несколько вариантов: или ввести поле указывающее на расположение этой карты (колода, игрок1, игрок2 и т.д.), или просто перенести этотот объект (карту) в другой массив - массив набора карт игрока (состоящий из 2-х элементов). Соответственно у вас будет массив колоды с пустыми элементами, потом его можно переопределить, чтобы убрать эти пустые элементы. »

Логику я организую и учту все варианты.... Сейчас у меня проблема с расдачей карт...
Хочу перенести карты которые вытаскиваются из колоды в масив набора карт игрока.
Вы писали что можно определить карте место положения - очень хороший совет спс...

torauma 10-01-2013 12:59 2063257

Цитата:

Цитата SAU-trade
Так как получается что следующие две карты выходят те же »

Код:


void Card_Batch::getcard(){
        for(int i = 0; i < 2; i++)
                cards[i].PrintCard();
}

А как они по вашему станут другими? Вы же при каждом вызове этого метода обращаетесь к 2 первым элементам массива. Можно, конечно, и так, но тогда нужно произвести сдвиг массива влево.
Но зачем все это, если можно просто взять следующие элеметы. Всего лишь введите в свойства класса номер верхней карты в колоде и используйте в качестве первого элемента индекса.
Код:

class Card_Batch{
private:
        Card* cards;
        int nTopCard;
public:
        Card_Batch();
        void setCard_Batch();
        void Shuffle();
        void display();

        void getcard();
};

Код:


Card_Batch::Card_Batch(){
        const int size = 52;
//        this->score = 0;
        nTopCard = 0;
        cards = new Card[size];
}

Код:


void Card_Batch::getcard(){
        for(int i = nTopCard; i < nTopCard + 2; i++)
                cards[i].PrintCard();
        nTopCard += 2;
}


SAU-trade 10-01-2013 15:02 2063352

Огромное спс)) Когда доделаю выложу все сюда))

SAU-trade 10-01-2013 15:32 2063391

У меня еще один вопрос.. Определение переменной отвечайщей за местоположение карты лучше определить в классе карта или уже в калоде? bool place (false - калода true - на руках)
Если в классе карта то как сделать чтобы в этом блоке, карта получала значение place = true (с учетом что она прописана как private) или лучше сделать public?


Цитата:

Цитата torauma
void Card_Batch::getcard(){
for(int i = nTopCard; i < nTopCard + 2; i++)

cards[i].PrintCard();
nTopCard += 2;
} »


ferget 10-01-2013 16:15 2063443

Код:

void setPlace(bool isn){ place = isn;}
bool getPlace(){return place;}



Время: 21:33.

Время: 21:33.
© OSzone.net 2001-