C++二十一点项目中srand报错需要存储类是什么原因?
核心错误原因
srand(time(NULL))是可执行语句,不能放在全局作用域。C/C++的全局作用域仅支持变量、函数的声明/定义,不允许直接编写运行时执行的逻辑,编译器会误将该语句识别为函数声明,因此抛出「需要存储类」的报错。
修复方法
- 将
srand(time(NULL))和随机手牌的初始化逻辑移动到main函数的最开头 - 修复手牌点数累加逻辑的bug:原逻辑每次循环都会累加历史值,会导致点数计算错误,每次计算前需要先重置点数变量为0
- 逻辑判断符
or部分编译器不原生支持,替换为更通用的||
修正后可运行的代码
#include <iostream> #include <vector> #include <cstdlib> #include <time.h> using namespace std; vector<int> handone(0); vector<int> handtwo(0); int handone_int = 0; int handtwo_int = 0; string n = "Yes"; int main() { // 随机数种子初始化放到main开头 srand(time(NULL)); int starting_hand = rand() % 21 + 1; int starting_hand_two = rand() % 21 + 1; cout << "Welcome To BlackJack! "; cout << "Your starting hand is " << starting_hand << "\n"; while (handone_int < 21 && handtwo_int < 21) { // 每次计算前先重置点数,避免重复累加 handone_int = 0; handtwo_int = 0; for (int i = 0; i < handone.size(); i++) { handone_int = handone_int + handone[i]; } for (int i = 0; i < handtwo.size(); i++) { handtwo_int = handtwo_int + handtwo[i]; } cout << "Would you like to keep or hold? "; cin >> n; if (n == "keep" || n == "Keep") { // 后续抽牌逻辑可在此补充 } } return 0; }
内容的提问来源于stack exchange,提问作者Maxon Baisley
相关产品推荐
相关产品推荐

