Blackjack

Тема в разделе "C/C++/C#", создана пользователем fuzzyduzzy, 22 янв 2013.

  1. fuzzyduzzy

    fuzzyduzzy New Member

    Регистрация:
    22 янв 2013
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте! Задание написать игру Блэк Джек). Я реализовал создание колоды тусовку и чтобы карты выпадали по порядку. Проблема в раздаче карт игроку и дилеру (Может нужен еще какой то блок?).

    Подскажите плиз как решить данную проблему... Возможно кто то даст совет по оптимизации.
    Код (Text):
    //CARD_H
    #include <iostream>
    #ifndef CARD_H
    #define CARD_H

    using namespace std;

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

    class Card{
    private:
    Suit suit;
    int face;
    int points;
    public:
    Card();
    void setCard(int, Suit);
    void PrintCard();
    void setPoints(int);
    };
    #endif CARD_H
    Код (Text):
    //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;
    }
    //cout << "\n\n";
    }
    Код (Text):
    //CARDBATCH_H
    #include <iostream>
    #include "Card.h"
    #ifndef CARDBATCH_H
    #define CARDBATCH_H

    class Card_Batch{
    Card* cards;
    int count;
    //  int nTopCard;
    public:
    Card_Batch();
    void setCard_Batch();
    void Shuffle();
    void display(); // Для проверки
    void AddCard();
    void Shell();
    ~Card_Batch();
    };
    #endif CARDBATCH_H
    Код (Text):
    //CARDBATCH.cpp
    #include <iostream>
    #include "CardBatch.h"
    #include <ctime>

    using namespace std;

    Card_Batch::Card_Batch(){
    const int size = 52;
    count = 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::AddCard(){
    for(int i = count; i < count + 1; i++)
    cards[i].PrintCard();
    count++;
    }

    void Card_Batch::Shell(){
    count = 0;
    }

    Card_Batch::~Card_Batch(){
    delete[] cards;
    }
    Код (Text):
    //PLAYER_H
    #include <iostream>
    #include "CardBatch.h"
    #ifndef PLAYER_H
    #define PLAYER_H

    class Player{
    Card_Batch cb;
    int playerScore;
    public:
    Player();
    Card_Batch& GetCardBatch(){return deck;}

    //  void SetPlayerScore(int);
    //  int GetPlayerScore() const {return playerScore;}
    void Drop();
    };
    #endif PLAYER_H
    Код (Text):
    //Player.cpp
    #include "Player.h"
    Player::Player(){
    Drop();
    }

    void Player::Drop(){
    playerScore = 0;
    deck.Shell();
    };
    Код (Text):
    //TWENTYONEGAME_H
    #include "CardBatch.h"
    #include "Player.h"
    #ifndef TWENTYONEGAME_H
    #define TWENTYONEGAME_H

    class TwentyOneGame{
    Player dealer;
    Player gamer;

    Card_Batch cb;
    public:
    void startGames();
    void NewGames();
    void FillDeck();
    void ShowPlayer(Player&);
    void Show();
    void addPlayerCard(Player&);
    //  void CalculateScore(Player& gamer);
    };
    #endif TWENTYONEGAME_H
    Код (Text):
    //TWENTYONEGAME.cpp
    #include <iostream>
    #include "TwentyOneGame.h"

    #include <stdlib.h>
    using namespace std;

    void TwentyOneGame::NewGames(){
    system("cls");
    dealer.Drop();
    gamer.Drop();

    FillDeck();
    addPlayerCard(dealer);
    cout << "\n";
    addPlayerCard(gamer);
    addPlayerCard(gamer);

    Show();
    }

    void TwentyOneGame::addPlayerCard(Player& game){
    gamer.GetCardBatch().AddCard();
    }

    void TwentyOneGame::FillDeck(){
    cb.setCard_Batch();
    cb.Shuffle();
    cb.display();
    }

    void TwentyOneGame::ShowPlayer(Player& gamer){

    }

    void TwentyOneGame::Show( ){
    cout << "Карты Дилера: \n";
    ShowPlayer(dealer);
    cout << "Ваши карты: \n";
    ShowPlayer(gamer);
    }
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    тусуешь нормально )
    а в чем проблема раздачи я не понял, но сдается мне ты не знаешь как раздать разные карты.

    Наверное тебе надо хранить колоду в виде списка (или создавать этот список из тусованых карт в начале игры (перед раздачей). раздаешь карты и удаляешь их из списка.
     
  3. fuzzyduzzy

    fuzzyduzzy New Member

    Регистрация:
    22 янв 2013
    Сообщения:
    3
    Симпатии:
    0
    Я не знаю как правильно сделать чтобы вывод карт был в функции Show()..

    Я когда пытался передать карты то получалось первая цифра а затем одна масть без цифр идет и только трефа)) или вообще одни и те же карты выдает и дилеру и игроку))... Нет как бы разделения между игроком и дилером..

    Через списки нельзя)) Это задание нужно сделать через классы и без списков))
     
  4. fuzzyduzzy

    fuzzyduzzy New Member

    Регистрация:
    22 янв 2013
    Сообщения:
    3
    Симпатии:
    0
    Вот такой вот гембель получается)))

    111.png

    В этом блоке что то не то))

    Код (C++):
    void TwentyOneGame::FillDeck(){
    cb.setCard_Batch();
    cb.Shuffle();
    cb.display();
    }
    если пишу таким образом
    Код (C++):
    void TwentyOneGame::FillDeck(){
    gamer.GetCardBatch().setCard_Batch();
    gamer.GetCardBatch().Shuffle();
    gamer.GetCardBatch().display();

    }
    Получается приличная раздача))
    222.png

    Но так нельзя ))) или можно?
     

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