【问题标题】:C++ Number guessing game with feedback带有反馈的 C++ 数字猜谜游戏
【发布时间】:2015-07-19 16:26:51
【问题描述】:

我被要求创建一个随机数猜谜游戏,该游戏生成一个随机的 5 位数字,然后提示用户猜数字。然后游戏会生成反馈以帮助用户做出更好的猜测(假设他们第一次没有猜对)。例如,如果随机数数组和用户猜测数组中的第一个数字都匹配,则游戏输出 1,如果猜测数组中的第一个数字与随机数数组中的第一个数字不匹配,但与其他数字中的一个匹配,游戏输出 2;如果猜测数组中的第一个数字与随机数数组中的任何数字都不匹配,则游戏输出 0(即,如果随机数数组 = 31350 并且用户猜测为 32010,则反馈将打印为 10221)。我想我已经完成了大部分工作,但反馈部分无法正常工作。输出是一个 20 多位的数字,无论输入如何,它都表示猜到了正确的数字。到目前为止,这是我的代码。

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
bool checkGuess(int numberToGuess[], int guess[], int size);


int _tmain(int argc, _TCHAR* argv[])
{
    const int DIGITS = 5;
    int numberToGuess[DIGITS]; //declares array holding the random string of numbers
    int guess[DIGITS]; //declares array holding the user guesses

    srand(time(NULL));  //random seed

    cout << "Welcome to the number guessing game!\n";
    cout << "In this game you will try to guess a random 5 digit number" << endl;

    for (int i = 0; i < DIGITS; i++)  //loop to generate the random number
    {
        numberToGuess[i] = rand() % 9 + 1;
    }

    do
    {
        cout << "Please enter your guess: " << endl;  //prompts user for their guess
        cin >> guess[1, 2, 3, 4, 5];

        bool comparedGuess = checkGuess(numberToGuess, guess, 5);
        if (comparedGuess == false)
        {
            for (int i = 0; i < DIGITS; i++)
            {
                if (guess[i] == numberToGuess[i])
                {
                    guess[i] = 1;
                }
                else if (guess[i] == numberToGuess[0, 1, 2, 3, 4])
                {
                    guess[i] = 2;
                }
                else
                {
                    guess[i] = 0;
                }
            }
        }
        for (int i = 0; i < DIGITS; i++)
        {
            cout << guess[i];
        }
        cout << endl;
    } 
    while (guess[DIGITS] != numberToGuess[DIGITS]);


    cout << "You guessed it correctly!" << endl;

    system("pause");
    return 0;
}

bool checkGuess(int numberToGuess[], int guess[], int size)  //function to compare user guess to random number
{
    if (guess[size] == numberToGuess[size])
    {
        return true;
    }
    else
    {
        return false;
    }

}

【问题讨论】:

  • numberToGuess[i] = rand() % 9 + 1; 永远无法生成 0。试试numberToGuess[i] = rand() % 10;
  • 很好,我已经更改了它,但反馈系统仍然无法正常工作。
  • cin &gt;&gt; guess[1, 2, 3, 4, 5]; 无法按照您想要的方式工作。编译器应该告诉你。同上guess[i] == numberToGuess[0, 1, 2, 3, 4]
  • @user4581301 尽管我认为这可能是我的问题,但编译器没有给我任何错误,您对我如何解决这个问题有什么建议吗?
  • 默认警告级别可能太低。不知道如何在视觉工作室中打开它。最简单的解决方法是读入 std::string 而不是 char 数组,然后测试该字符串是否正好是 5 个字符。

标签: c++ arrays random


【解决方案1】:

OP 的输出很糟糕,因为输入错误。他们可能仍然是输出的问题,但是垃圾进,垃圾出。让我们先修复输入。

专业提示:将程序分成多个部分,并确保每个部分都能正常工作,然后再继续处理依赖于它们的部分。在这种情况下,有四个部分:

  1. 获取随机数
  2. 从用户那里得到猜测
  3. 将随机数与猜测匹配
  4. 如果匹配做得好,输出匹配结果几乎是一个噱头

问题 cmets 中介绍了获取随机数。

获取用户输入可以通过多种方式完成。最好是用一根绳子。讲师不允许使用字符串。这教会学生编写易碎的代码,或者使应该是介绍性作业的内容过于复杂化。不好的形式,教。

我对此的回答是给他们做蓝精灵。提供带有恶意用户输入的非易碎程序。任何与指定输入格式的偏差都会调用 FOAD(BLEEP Off And Die)协议,从而结束程序。

cout << "Please enter your guess: " << endl;  //prompts user for their guess
char temp[8];
temp[5] = 'C'; // canary value
cin.getline(temp, sizeof(temp));
if (temp[5] != '\0')
{ // if the did not enter exactly five characters
    cout << "Bad input. You LOSE!";
    return 0;
}
for (int index = 0; index < DIGITS; index++)
{ // ensure all input characters are digits
    if(isdigit(temp[index]))
    {
        guess[index] = temp[index] - '0'; //convert from char to int and store in guess
    }
    else
    {
        cout << "Bad input. You LOSE!";
        return 0;
    }
}

将随机数与猜测匹配

我不会完全写出这篇文章,因为这是或应该是作业的重点。 OP的逻辑或多或少是正确的,但语法是错误的。

需要的是

循环遍历所有猜测的数字。检查。

测试当前猜测的数字是否与随机选择的数字匹配。

这就是问题所在。你不能这样做if (guess[i] == numberToGuess[0, 1, 2, 3, 4]) 来检查数组的元素。你需要另一个循环。

for (int j = 0; j < DIGITS; j++)
{ // test current user input against all
    if(i!=j)
    { // skip the i==j case because it's already been checked
        if (guess[i] == numberToGuess[j])
        {
            guess[i]= 2;
            break; // stop looking
        }
    }
}

需要最后一点:退出条件。你怎么知道你是否完成了? OP的剪辑不起作用。

bool checkGuess(int numberToGuess[], int guess[], int size)  //function to compare user guess to random number
{
    if (guess[size] == numberToGuess[size]) <-- BOOM!
    {
        return true;
    }
    else
    {
        return false;
    }

}

guess[size] == numberToGuess[size] 会将guess 的一个元素与numberToGuess 的一个元素进行比较,而不是整个数组。更糟糕的是,它会在数组边界之外进行比较,因为数组索引仅在 0 到 size-1 之间有效。

这将需要另一个循环,但该循环已在数组匹配的第一步中执行。没有必要重复它。 OP 可以测试所有 1 的猜测(这需要一个循环,所以为什么要麻烦呢?)或者记录找到了多少匹配的数字。在计数 == 5 时退出。

此时输出已得到处理,因为它所说的只是是否找到了匹配项。要获得输出,必须找到匹配项,否则匹配器仍需要工作。

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多