2013-11-14 15 views
0

我看了一下that article on Guru Of the Week,其中提出了一個「純粹的」C++解決方案來計算主謀遊戲中確切的和錯位的peg的數量,並將猜測和隱藏代碼進行比較。GoW上的Mastermind C++

但是當我使用的代碼

string colors("BGR"), comb(4, '.'), l(comb), guess; 
typedef map<int,int> M; 

struct Color 
{ 
    Color(M& cm, M& gm, int& color) 
     : cm_(cm), gm_(gm), color_(color=0) { } 

    void operator()(char c) 
    { 
     color_ += min(cm_[c], gm_[c]); 
    } 
    M &cm_, &gm_; 
    int& color_; 
}; 

struct Count 
{ 
    Count(int& color, int& exact) 
     : color_(color), exact_(exact=0) { } 

    char operator() (char c, char g) 
    { 
     return ++cm_[c], ++gm_[toupper(g)], exact_ += c == toupper(g), '.'; 
    } 

    ~Count() 
    { 
     for_each(colors.begin(), colors.end(), Color(cm_, gm_, color_)); 
    } 

    M cm_, gm_; 
    int &color_, &exact_; 
}; 

char ChoosePeg() 
{ 
    return colors[rand() % colors.size()]; 
} 

int main() 
{ 
    int color, exact = 0; 
    srand(time(0)), generate(comb.begin(), comb.end(), ChoosePeg); 

    while(exact < comb.length()) 
    { 
     cout << "\n\nguess--> ", cin >> guess; 
     transform(comb.begin(), comb.end(), 
       guess.begin(), l.begin(), 
       Count(color, exact)); 
     cout << color << ' ' << exact; 
    } 
    cout << " - solved!\n"; 
} 

「顏色」號始終爲0,即使它應該是爲他們提供的例子不同。我硬編碼的碼組合「RRBB」當我進入「rbrr」預期的結果是:3 1,但是我在我的輸出是:

guess--> rbrr 
0 1 

所有的想法會受到歡迎?

+0

我還沒有嘗試找出不工作,但是這是如何濫用標準庫中的可怕的例子,爲了混淆。不要這樣編程。 (這看起來像是一個有趣的挑戰,而不是嚴肅的代碼,第二段末尾的括號表示同樣多)。 –

回答

0

錯位的PEG(調用代碼color)的數仍然0,因爲在以下構造函數:

Color(M& cm, M& gm, int& color) 
     : cm_(cm), gm_(gm), color_(color=0) { } 

提交成員初始化之前重置int&值。 要解決這個問題,我們可以採用幾種方法,但最簡單的方法是重置Count ctor中的color值,exact值。所以ColorCount構造成爲:

Color(M& cm, M& gm, int& color) 
     : cm_(cm), gm_(gm), color_(color) { } 

Count(int& color, int& exact) 
     : color_(color = 0), exact_(exact=0) { }