C++编写数字猜谜游戏运行输出异常问题排查求助
数字猜谜游戏代码问题排查及修复
现存问题汇总
- 随机数生成逻辑错误:
guessingGame方法每次调用都会重新生成目标数字,用户每次猜测的比对基准不停变化,永远无法猜对 - 正确数统计逻辑错误:双层循环比对会重复计数,若目标数字存在重复值,统计结果会远大于实际正确数量
- 类成员变量未正确使用:生成的随机目标数字没有存入类私有成员
correct_number,计算得到的正确匹配数也没有对外返回,主程序无法获取猜测结果 - 主程序逻辑完全不符合业务需求:
- 循环条件错误使用
userNumbers.size() != n,用户输入一轮n个数字后就会直接退出循环,无法实现多次猜测的逻辑 - 循环内重复调用
guessingGamen次,还重复往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
相关产品推荐
相关产品推荐

