首页 > 解决方案 > 如何找到重复项

问题描述

/* 我已经根据给出的指令编写了一个简单的刽子手的代码,我只想知道如何检测重复的输入。对于此代码,它只检测正确的字母和长度

例如:

用户输入: HAM H A HANGMAN!*/

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    // Word to be guessed can be assumed to be at most 20 characters long (including end-of-string null character)
    char HangmanWord[20];

    // Variable to store current guess
    char GuessLetter;
    int count = 0;
    std::cin >> HangmanWord;
    //char guessedletter[strlen(HangmanWord)];
    //int j = 0;
    bool valid = true;

    // Check that input word only consists of uppercase English letters
    for (int i = 0; i < strlen(HangmanWord); i++)
    {
        if ((HangmanWord[i] > 'Z') || (HangmanWord[i] < 'A'))
        {
            valid = false;
            break;
        }
    }
    while (valid == true)
    {
        std::cin >> GuessLetter; //Takes the Guess letter
        if ((GuessLetter > 'Z') || (GuessLetter < 'A')) //Check that guessed letter is uppercase
        {
            break;
        }
        else
        {
            for (int i = 0; i < strlen(HangmanWord); i++) //loop to check every letter in word
            {
                if (GuessLetter == HangmanWord[i]) { //if the letter is equal to any letter in the word the count increases
                    count++;
                    break;
                }
                if (i == strlen(HangmanWord) - 1) { //If no letter is equal to any letter in the word the program exits
                    valid = false;
                }
            }

            if (count == strlen(HangmanWord)) { //Checks if all letters were guessed and exits the loop after
                valid = false;
            }

        }
    }
    if (count == strlen(HangmanWord)) { //Checks if all letters were guessed correct to print Hangman
        cout << "HANGMAN!\n";
        valid = false;
    }

标签: c++

解决方案


如果要检测是否已经输入了字母,可以使用由数字表示的 ASCII 字符。假设我们将自己限制为大写字母,'A'是 65,而“Z”是 90。

我们可以用这些来做数学。 'A' - 'A'0'C' - 'A'2

我们也知道数组是从零开始索引的。

我们可以将这些东西放在一起创建一个布尔值数组,并将它们标记为猜测字母。

std::array<std::bool, 26> already_guessed;
std::fill(already_guess.begin(), already_guessed.end(), false);

然后我们可以通过查找来检查是否已经猜到了一个字母。例如,考虑检查是否'D'已被猜到。他们一开始应该是假的,因为一开始什么都没有猜到。

already_guessed['D' - 'A']

如果没有,我们可以将其标记为已猜到:

already_guessed['D' - 'A'] = true

推荐阅读