我试图实施公牛队和公牛队。奶牛游戏,我有一个逻辑问题。我明确地检查每个数字是否等于相应指数(公牛)或其他指数(奶牛)中的数字。我检查的价值(4321)应该产生" 0公牛和4头奶牛"但它反而给了我" 0公牛和3头奶牛。
这是我的代码(我为代码重复道歉。我也想知道是否有人建议让这些代码更小):
#include <iostream>
#include <vector>
using namespace std;
int main() {
int guessValue = 1234;
int guess;
int bulls = 0;
int cows = 0;
cout << "Enter a 4 digit guess: ";
cin >> guess;
int firstValue = (guess % 10000) / 1000;
int secondValue = (guess % 1000) / 100;
int thirdValue = (guess % 100) / 10;
int fourthValue = guess % 10;
if (firstValue == ((guessValue % 10000) / 1000)) {bulls += 1;}
else if(firstValue == ((guessValue % 1000) / 100) ||
firstValue == ((guessValue % 100) / 10) ||
firstValue == (guess % 10))
{cows += 1;}
if (secondValue == ((guessValue % 1000) / 100)) {bulls += 1;}
else if (secondValue == ((guessValue % 10000) / 1000) ||
secondValue == ((guessValue % 100) / 10) ||
secondValue == (guess % 10))
{cows += 1;}
if (thirdValue == ((guessValue % 100) / 10)) {bulls += 1;}
else if (thirdValue == ((guessValue % 10000) / 1000) ||
thirdValue == ((guessValue % 1000) / 100) ||
thirdValue == (guess % 10))
{cows += 1;}
if (fourthValue == (guessValue % 10)) {bulls += 1;}
else if (fourthValue == ((guessValue % 10000) / 1000) ||
fourthValue == ((guessValue % 1000) / 100) ||
fourthValue == (guessValue % 100) / 10)
{cows += 1;}
cout << bulls << " bulls and " << cows << " cows" << endl;
}
答案 0 :(得分:2)
我也想知道是否有人建议将此代码缩小
首先使用std::vector
来保留单独的数字:
std::vector<int> split( int v )
{
std::vector<int> r;
while( v ) {
r.push_back( v % 10 );
v /= 10;
}
return r;
}
其次,使用标准算法std::count_if
:
auto bulls = std::count_if( guessv.begin(), guessv.end(),
[it = targetv.begin()]( int i ) mutable
{ return i == *it++; } );
auto cows = std::count_if( guessv.begin(), guessv.end(),
[s = std::set<int>{ targetv.begin(), targetv.end() }]( int i )
{ return s.count( i ); } );
第二个实际上是对牛和公牛进行计数,因此需要进行调整:
cows -= bulls;
答案 1 :(得分:1)
绝对需要掌握的2个概念:循环和函数。首先创建一些有用的功能。
这些是您可以构建程序的功能:
int get_digit(int number, int order)
示例测试用例:
get_digit(7895, 0) == 5
get_digit(7895, 1) == 9
get_digit(7895, 2) == 8
get_digit(7895, 3) == 7
然后:
bool has_digit(int number, int digit)
示例测试用例:
has_digit(7895, 1) == false
has_digit(7895, 8) == true
has_digit(7895, 5) == true
has_digit(7895, 0) == false
has_digit(7000, 0) == true
然后:
bool matches_digit(int a, int b, int order)
有测试用例:
matches_digit(1239, 4269, 0) == true
matches_digit(1239, 4269, 1) == false
matches_digit(1239, 4269, 2) == true
matches_digit(1239, 4269, 2) == false
最后:
int get_cow(int a, int b)
int get_bull(int a, int b)
int main()
这是一种自上而下的设计,自下而上的实施方法。首先,你要考虑大局,找出你需要的小部件(功能),然后从最小的最独立的功能开始实现,然后逐步组合成更高的功能,直到你到达主要部分。
答案 2 :(得分:0)
这是我的解决方案而且有效。基本上我必须创建一个函数来提取每个数字并将它们存储到一个可以应用于模型和猜测的向量中。然后我使用find()
库的<algorithm>
方法来查看猜测向量中是否存在数字,如果是,则在哪个位置与模型向量进行比较。相同的位置等于1头牛,不同的头寸等于1头牛。我将为此程序添加更多内容,例如随机生成模型并在每轮后循环程序,这样用户就不必重新启动游戏。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> getDigits(int modelValue) {
vector<int> vectorValue;
int extractedDigit = 0;
int modulant = 10000;
int divisor = 1000;
for (int i = 0; i < 4; i++) {
extractedDigit = (modelValue % modulant) / divisor;
vectorValue.push_back(extractedDigit);
modulant /= 10;
divisor /= 10;
}return vectorValue;
}
int main() {
int model = 1234;
int guess = 0000;
int bulls = 0;
int cows = 0;
int counter = 1;
cout << "Enter a value to guess: ";
cin >> guess;
vector<int> modelVector = getDigits(model);
vector<int> guessVector = getDigits(guess);
for (int i = 0; i < 4; i++) {
if (find(modelVector.begin(), modelVector.end(), guessVector[i]) != modelVector.end()) {
if (modelVector[i] == guessVector[i]) {bulls += 1;}
else { cows += 1; }
}
}cout << "There are " << bulls << " bulls and " << cows << " cows"<< endl;
}