C++游戏复用随机选中的电脑名称时调用函数输出数字如何解决
问题原因
你遇到的核心问题如下:
- 输出数字是因为你写的
std::cout << opponent << '\n'没有给函数加调用后缀(),直接输出了opponent函数的内存地址(即你看到的一串十六进制数字),和ASCII文本转换没有关系。 - 现有逻辑无法实现名字复用:你在
main和opponent函数中都调用了srand(time(NULL)),time(NULL)的精度为秒,同一秒内多次调用会生成完全相同的随机种子,且opponent函数每次调用都会重新生成随机索引,无法全程复用同一个名字。 - 隐含语法错误:
main函数中读取用户名的变量x没有提前定义。
修复方案
按照以下规则修改代码即可满足需求:
- 全局仅在
main函数开头调用一次srand,后续不需要重复设置随机种子 - 调用函数时添加
()后缀 - 将随机生成的电脑名称做持久化存储,第一次生成后全程复用,你可以用函数静态变量的方式封装,方便其他业务逻辑统一调用
- 提前定义用户名变量
x
修改后完整代码
constants.h
无需修改,原有逻辑正确:
#pragma once #ifndef CONSTANTS_H #include <string> namespace constants { std::string computer[5] = { "Duotronics", "Hal", "Shirka", "Skynet", "Icarus" }; } #endif // !CONSTANTS_H
main.cpp
#include <iostream> #include <time.h> #include <cstdlib> #include <string> #include "constants.h" // 封装获取对手名称的函数,一次生成全程复用 std::string get_opponent_name() { // 静态变量只会初始化一次 static std::string opponent_name = constants::computer[rand() % 5]; return opponent_name; } int main() { // 全局仅初始化一次随机种子 srand(time(NULL)); std::string x; std::cout << "What is your name?\n"; std::cin >> x; std::string computer_name = get_opponent_name(); std::cout << "Your opponent is the computer " << computer_name << " she is hard to beat.\n"; std::cout << "Good luck " << x << "!" << '\n'; // 多次调用返回同一个名称 std::cout << get_opponent_name() << '\n'; std::cout << get_opponent_name() << '\n'; std::cout << get_opponent_name() << '\n'; return 0; }
输出示例
假设用户输入名称为Jack,输出如下:
What is your name? Jack Your opponent is the computer Hal she is hard to beat. Good luck Jack! Hal Hal Hal
其他需要全程复用的随机值都可以参考get_opponent_name的封装方式实现。
内容的提问来源于stack exchange,提问作者Isaac Tait
相关产品推荐
相关产品推荐

