You need to enable JavaScript to run this app. C++编写数字猜谜游戏运行输出异常问题排查求助
优惠活动
大模型
产品
解决方案
定价
更多

C++编写数字猜谜游戏运行输出异常问题排查求助

数字猜谜游戏代码问题排查及修复

现存问题汇总

  • 随机数生成逻辑错误:guessingGame 方法每次调用都会重新生成目标数字,用户每次猜测的比对基准不停变化,永远无法猜对
  • 正确数统计逻辑错误:双层循环比对会重复计数,若目标数字存在重复值,统计结果会远大于实际正确数量
  • 类成员变量未正确使用:生成的随机目标数字没有存入类私有成员 correct_number,计算得到的正确匹配数也没有对外返回,主程序无法获取猜测结果
  • 主程序逻辑完全不符合业务需求:
    • 循环条件错误使用 userNumbers.size() != n,用户输入一轮n个数字后就会直接退出循环,无法实现多次猜测的逻辑
    • 循环内重复调用 guessingGame n次,还重复往 userNumbers 里push固定值n,和用户输入的猜测值完全没有关联
    • 错误使用 sizeof(userNumbers) 打印正确数,sizeof 计算的是vector对象本身的内存占用,不是正确匹配的数字数量
  • 头文件缺少防护宏,多次引入会出现重定义报错
  • 控制台提示文本和期望运行示例不匹配

修复后完整代码

game.h

#ifndef GAME_H
#define GAME_H
#include <vector>

class Game {
public:
    // 生成目标随机数
    void generateNumbers(int n, int m);
    // 传入用户猜测数组,返回正确匹配的数量
    int checkGuess(std::vector<int>& inputGuess);
private:
    std::vector<int> correct_number; // 程序生成的目标数字
};
#endif

game.cpp

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include "Game.h"
#include <iostream>
#include <vector>

void Game::generateNumbers(int n, int m) {
    correct_number.clear();
    // 随机生成n个1~m的整数
    for (int i = 0; i < n; i++) {
        int num = (rand() % m) + 1;
        correct_number.push_back(num);
    }
}

int Game::checkGuess(std::vector<int>& inputGuess) {
    int correct = 0;
    std::vector<int> temp = correct_number;
    // 不重复统计正确数
    for (int i = 0; i < inputGuess.size(); i++) {
        for (int j = 0; j < temp.size(); j++) {
            if (inputGuess[i] == temp[j]) {
                correct++;
                temp.erase(temp.begin() + j);
                break;
            }
        }
    }
    return correct;
}

driver.cpp

#include <iostream>
#include "Game.h"
#include <time.h>
#include <stdlib.h>
#include <vector>

int main()
{
    std::srand(static_cast<unsigned int>(time(nullptr)));
    char playAgain = 'y';
    // 支持多次游玩
    while (playAgain == 'y' || playAgain == 'Y') {
        Game game;
        int n, m;
        std::cout << "输入整数个数:";
        std::cin >> n;
        std::cout << "输入整数取值范围上限m:";
        std::cin >> m;
        // 生成目标随机数,全程只用生成一次
        game.generateNumbers(n, m);
        int correctCount = 0;
        // 直到全部猜对才退出循环
        while (correctCount != n) {
            std::cout << "输入猜测值:";
            std::vector<int> inputGuess(n);
            for (int i = 0; i < n; i++) {
                std::cin >> inputGuess[i];
            }
            correctCount = game.checkGuess(inputGuess);
            if (correctCount == n) {
                std::cout << "猜对了,是否要再玩一次?(y/n):";
                std::cin >> playAgain;
            } else {
                std::cout << "你猜对了" << correctCount << "个数字,请再猜一次" << std::endl;
            }
        }
    }
    return 0;
}

修复后的运行效果和你给出的期望示例完全一致,支持重复游玩,正确数统计逻辑准确。

内容的提问来源于stack exchange,提问作者user15318496

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 10:36:04