带有反馈的C ++数字猜谜游戏

时间:2015-07-19 16:26:52

标签: c++ arrays random

对于一个班级,我被要求创建一个随机数字猜谜游戏,生成一个随机的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;
    }

}

1 个答案:

答案 0 :(得分:0)

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

专业提示:将程序分成它的部分并确保每个部分都有效,然后再转向依赖它们的部分。在这种情况下,有四个部分:

  1. 获取随机数
  2. 从用户那里猜测
  3. 将随机数与猜测匹配
  4. 如果匹配完成,输出匹配结果几乎是一个噱头
  5. 问题评论中包含了随机数字。

    获取用户输入可以通过多种方式完成。最好的是一个字符串。教练不允许使用字符串。这教导学生编写脆弱的代码或者过分复杂应该是一个介绍性的任务。糟糕的形式,教导。

    我对此的回答让他们感到沮丧。提供非脆弱的程序和令人厌恶的用户输入。任何与指定输入格式的偏差都会调用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]会将一个猜测元素与numberToGuess的一个元素进行比较,而不是整个数组。更糟糕的是,它在数组的边界之外进行比较,因为数组索引仅在0到size-1之间有效。

    这将需要另一个循环,但该循环已在阵列匹配的第一步中执行。没有必要重复它。 OP可以测试所有1的猜测(这需要一个循环,所以为什么要打扰?)或者保持计算找到多少匹配数字。计数退出== 5.

    此时输出得到处理,因为所有内容都表明是否找到了匹配项。要获得输出,必须找到匹配或匹配器仍然需要工作。