Bulls & Cows 项目:奶牛检查

Bulls & Cows project: cow checking

我的 Bulls and Cows 项目快完成了,但是如果我输入一个单词或一串数字,其中有字母或数字重复,代码的 'cow' 部分就会出错。例如:考虑以下

Enter something that you want someone to guess: cool

Time to guess! The code is of size 4. book

COWS: 0 BULLS: 2

ozzo

COWS: 4 BULLS: 0

可以看到,输入"ozzo"后,牛值应该是2,而不是4。 如何在不更改整个代码的情况下解决此问题?

for (size_t i = 0; i != startg.getSize(); ++i){
    if (guess[i] == origWord[i]){
        bullCtr++;
    } else {
        for (size_t j = 0; j != startg.getSize(); ++j){
            if (origWord[i] == guess[j]){
                cowCtr++;
            }
        }
    }
}

应用修复后的代码:

for (size_t i = 0; i != startg.getSize(); ++i){
    if (guess[i] == origWord[i]){
        bullCtr++;
    } else {
        for (size_t j = 0; j != startg.getSize(); ++j){
            if (origWord[i] == guess[j]){
                origWord[i] = 'X';
                cowCtr++;
            }
        }
    }
    origWord = origWordcpy;
}

你的牛检查有问题

为了方便起见(不完全是)我会这样做(我只是在谈论 else 语句):

for(unsigned int j = 0 ; j != startg.getSize() ; j++)
{
    if(origWord[i] == guess[j])
    {
         origWord[i] = 1; //Just assigning a certain value there to mark that we've already did something with it
         cowCtr++;
    }
}

这应该可以完成工作。

编辑:

你显然应该有一个临时字符串而不是 origWord 因为改变它会影响外循环的下一次迭代(得到猜测并再次比较) - 我只是告诉你方法。

这是 Bulls & Cows 游戏的一种可能实现方式:

// used constants; numbers to be guessed
const int first_num = 2;
const int second_num = 4;
const int third_num = 1;
const int forth_num = 5;

int main(){
// vector holding the values to be guessed
vector<int>gamenum(4);
gamenum[0] = first_num;
gamenum[1] = second_num; 
gamenum[2] = third_num;
gamenum[3] = forth_num;

// prompt message; input cycle till perfect guess (4 bulls)
int bulls = 0;
while (!(bulls == 4)){
    // vector holding the guesses
    vector<int>guesses;
    // vector input values
    int guess1(0), guess2(0), guess3(0), guess4(0);

    cout << "\t\tPlay the game ""Bulls and Cows\n""" << endl;
    cout << "Enter a set of four numbers, separated by whitespace space: ";
    cin >> guess1 >> guess2 >> guess3 >> guess4;
    guesses.push_back(guess1);
    guesses.push_back(guess2);
    guesses.push_back(guess3);
    guesses.push_back(guess4);

    // input confirmation; show your guess
    cout << "\nYour guess is: ";
    for (int i = 0; i < guesses.size(); ++i){
        cout << guesses[i];
    }

    // bulls criterion
    for (int j = 0; j < guesses.size(); ++j){
        if (guesses[j] == gamenum[j]) ++bulls;
    }

    // cows criterion
    int cows = 0;
    for (int gue = 0; gue < guesses.size(); ++gue){
        for (int gam = 0; gam < gamenum.size(); ++gam){
            if (guesses[gue] == gamenum[gam] && gue != gam) ++cows;
        }
    }

    // print result
    if (bulls < 4){
        cout << "\nBulls: " << bulls << " and Cows: " << cows <<endl;
        cout << "\n\n\n" << endl;
        // reset bulls
        bulls = 0;
    }

    // empty guesses vector
    guesses.clear();
    // reset cows
    cows = 0;
}
// print success
cout << "\nPerfect Guess!" << endl;
cout << "Bulls: " << bulls << endl;
cout << "\n\n\n" << endl;

keep_window_open();
return 0;
}

无论如何都不是最佳的,简陋的,但工作。 您可以将其用作基准。