2017-12-02 72 views
1

我正在製作一個二十一點遊戲。我已經建立了一個牌組,我只需要現在執行遊戲。畫一張牌,然後叫它

所以我有一個名爲deck.cpp的文件,其中包含甲板數組,以及一個存儲值和不存在的卡文件。在deck.cpp文件我有以下功能,可以抽一張牌:

void Deck::draw(int v){ 
    cout << deck[v].toString(); 
} 

然後,在我的其他文件,其中我其實玩遊戲,我叫甲板類,且改組它,這也正常。

#include "Deck.hpp" 
#include "PlayingCard.hpp" 
#include <string> 
using namespace std; 


class Blackjack{ 

    private: 
     //Must contain a private member variable of type Deck to use for the game 
     Deck a; 
     int playerScore; 
     int dealerScore; 

     bool playersTurn(); 
     bool dealersTurn(); 

    public: 
     //Must contain a public default constructor that shuffles the deck and initializes the player and dealer scores to 0 
     Blackjack(); 

     void play(); 
}; 

現在我有麻煩搞清楚如何繪製兩張牌打印出來,並讓他們的總和:

#include "Blackjack.hpp" 
#include "Deck.hpp" 
#include <iostream> 
#include <iomanip> 

using namespace std; 
//Defaults the program to run 
Blackjack::Blackjack(){ 
    a.shuffle(); 
    playerScore = 0; 
    dealerScore = 0; 
} 
void Blackjack::play(){ 

} 

我意識到有可能是這個問題,因爲當用戶決定擊中,我們可能不知道牌中有哪張牌。相信我認爲抽籤功能是錯誤的。

問題是我無法弄清楚如何從甲板上正確地繪製卡片(遞減頂部卡片)。那麼我該如何調整用戶核心呢?我有一個返回double的getValue()函數。

+0

你能否清楚地說明你到底想要什麼,問題是什麼。畫功能錯誤是相當模糊的。 – Incomputable

+0

有一點要記住C++是有效使用標準庫及其容器是解決問題的關鍵。對於通用數組,std :: vector是個不錯的選擇。 – tadman

+0

我們還沒有真正瞭解矢量,所以不知道我們是否可以使用它們。當然,他不會反對。問題是我無法弄清楚如何從甲板上正確地繪製卡牌(減少頂牌)。那麼我該如何調整用戶核心呢?我有一個返回double的getValue函數。 – John

回答

0

在甲板

需要在現實世界中的變化,甲板知道有多少卡留,什麼是下一個。在你的類應該是相同的:

class Deck{  
    private: 
     PlayingCard deck[52]; 
     int next_card;   //<=== just one approach 
    public: 
     ... 
}; 

當繪製在現實世界中一張卡,你有你的手牌。因此,繪製回報的東西:

class Deck{  
     ... 
    public: 
     Deck(); 
     void shuffle(); 
     void printDeck(); 
     PlayingCard draw(); // <=== return the card 
}; 

功能會再看看這樣的:

PlayingCard Deck::draw(){ 
    int v=next_card++; 
    cout << deck[v].toString(); 
    return deck[v]; 
} 

在此實現,deck不改變簡單起見。在構建甲板時,next_card應初始化爲0.在任何時候,next_card以下的元素已經被繪製,並且剩餘在甲板上的元素是從next_card開始到51的那些元素。如果有人想要繪製,您還應該處理該案例儘管甲板上沒有卡,但仍有一張卡。

如何去與遊戲

的繪畫是更容易,因爲現在,遊戲中可以知道,繪製卡。這使您可以根據PlayCard值更新分數。而且你不再需要跟蹤頂牌:

Blackjack::Blackjack(){ 
    // Deck a; <====== this should be a protected member of Blackjack class   
    a.shuffle(); 
    playerScore = 0; 
    dealerScore = 0; 
} 

我不確定玩家只能抽兩張牌。所以我建議改變你的遊戲環境。

void Blackjack::play(){ 
    bool player_want_draw=true, dealer_want_draw=true; 
    while (player_want_draw || dealer_want_draw) { 
     if (player_want_draw) { 
      cout<<"Player draws "; 
      PlayCard p = a.draw(); 
      cout<<endl; 
      // then update the score and ask user if he wants to draw more 
     } 
     if (dealer_want_draw) { 
      cout<<"Dealer draws "; 
      PlayCard p = a.draw(); 
      cout<<endl; 
      // then update the score and decide if dealer should continue drawing 
     }   
    } 
    // here you should know who has won 
} 

您可以實現二十一點遊戲,而不必記住每個玩家的抽牌的價值,通過更新在每一輪得分和一些標誌。但是,如果您願意,您可以像現實世界中那樣執行此操作,方法是爲每位玩家/經銷商保留Blackjack他/她已繪製的卡片。對於數組,這可能很麻煩。但是如果你已經瞭解了矢量,那就去做吧。

+0

好吧,這是有道理的。那麼如果我想調用像draw這樣的東西,我嘗試調用像a.draw();我也在構造函數中創建了具有抽獎功能的套牌。 – John

+0

@John重要的是甲板'a'成爲21點班的成員;否則你會失去它的狀態。然後甲板在Blackjack的構建過程中自動構建:不需要額外的init。 – Christophe

+0

我可以讓它成爲私人會員,還是必須是受保護的會員?它會只是甲板一個;? – John

相關問題