2

我正在写一个刽子手游戏。我的逻辑和我的游戏逻辑都失败了。字符猜测(人们猜测的字母)没有被添加到向量guessArray 的正确内存槽中。假设该词是用户输入的词。

如果guessArray 是原始数组,我认为这会起作用。是否有某种原因这不适用于矢量?

//assume that attempts is num of attempts left
void coutWord(int attempts, std::string word, char guess)
{
std::vector<char> guessArray(word.length());


//this is supposed to add the guess to the correct area of guessArray;
//It's not. 

for (int i = 0; i < word.length(); i++) {
    if (guess == word[i]) {
        guessArray[i] = guess;
        std::cout << " " << guessArray[i] << " ";
        continue;
    }

    std::cout << " _ ";
}

std::cout << std::endl << std::endl;
}

编辑:我使用此代码的目标是在同一个 for 循环中找出所有未猜测的空格和猜测的空格。我只需要“记住”以前的猜测,以便得到正确的输出。给定单词=“苹果酱”:

Input: a
a _ _ _ _ _ a _ _ _
Input: p
a p p _ _ _ a _ _ _

等等

4

5 回答 5

3

向量可以用下标表示法索引[],并且它存储在连续的内存中。它是一个 STL 容器,因此与数组一样,您可以拥有任何类型的容器。

矢量会自动调整大小。数组是“静态”大小的,不能轻易调整大小(调用 realloc 的手动函数除外。)您可以使用 push_back 函数来处理此问题,也可以提前 .reserve() 内存来保存关于重新分配。

数组不跟踪它自己的大小,而向量具有可以检查这一点的函数。

如果您不确定向量的大小,请继续使用 .push_back() 添加项目以处理自动调整大小的问题。如果您通过 resize() 保留一块内存然后对其进行索引,则它更容易用作数组,但您会失去将其用作动态大小的对象的一些语法优势。

于 2009-04-27T03:23:27.177 回答
2

除了使用向量或数组之外,您的代码中还存在基本的逻辑缺陷。

您在这里尝试执行两项任务:

  • 更新猜测数组
  • 输出猜测数组

当您尝试在一个功能中完成两项任务时,很容易混淆。我对您的建议是将这些放入单独的函数中。

这是一个基本的代码结构(使用您可以实现的功能):

int attempts = 0;
std::vector<char> guessArray(word.length());
while( (attempts > maxAttemps) && (!HasFoundWord(guessArray) )
{
   char guess = InputGuess();
   UpdateResults(guessArray, guess, word);
   OutputGuess(guessArray);
   ++attempts;
}

UpdateResults 将具有如下函数签名:

void UpdateResults(std::vector<char>& guessArray, char guess, const std::string& word)

分离出功能块后,您会发现问题更容易解决。

于 2009-04-27T04:12:10.837 回答
0

对编辑的回答:

guessArray 向量是在函数中本地创建的,因此,先前插入向量中的内容将无法用于下一次尝试。您需要通过引用传递向量并为每次尝试更新向量。

void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess)

伪代码:

void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess)
{

    for (int i = 0; i < word.length(); i++) 
    {
        if (guess == word[i]) 
        {
            //its current guess
            //insert and display as well
            guessArray[i] = guess;
           std::cout << " " << guessArray[i] << " ";

        }
        //Check if the previous attempt has already inserted the char ( previous guess)
        else if(guessArray[i] != 0)
        {
            //display previous guess too
            std::cout << " " << guessArray[i] << " ";

        }
        else
        {   //not yet guessed
            std::cout << " _ ";
        }
    }

    std::cout << std::endl << std::endl;
}

在外面定义向量:

std::vector<char> guessArray(word.length());

    coutWord(guessArray, 1, word, 'a');
于 2009-04-27T04:05:48.060 回答
0

我很惊讶还没有人提到它,但 std::vector 不是数组。它是一个调整大小的连续元素容器,可用于许多与数组相同的目的。如果您想要一个包装数组(并且有很多原因),您应该查看boost::array

于 2009-04-27T05:03:53.630 回答
-1

您应该使用 push_back() 函数。有关详细信息,请参阅cpprefererence.com

此外,您不能简单地用 C 样式数组替换guessArray,因为您需要使用编译时已知的常量明确指定其大小,例如

int guessArray[25];
于 2009-04-27T03:24:25.413 回答