如何获取函数返回值且无需重复执行该函数?
问题描述
如何获取函数返回的数值,而无需再次执行该函数?
当前代码中,difficulty()函数会等待用户输入'1'/'2'/'3'并返回对应字符,但每次在Move()里调用它都会重新触发等待输入的逻辑,实际只需要在游戏开始时获取一次难度值,之后反复复用这个值即可。
相关代码
难度选择函数
int difficulty() { char x; while (true) { if (kbhit()) { x = getch(); if (x == '1' || x == '2' || x == '3') { return x; break; // 此代码永远不会执行,return已直接退出函数 } } } cout << "done"; // 此代码永远不会执行 }
Move函数(每次调用都会重新获取难度)
void Move(){ if (HeadY >= Height-1 || HeadY <= 0 || HeadX >= Widht-1 || HeadX <= 0) Lose = false; char level=difficulty(); // 每次调用Move都会重新执行difficulty,等待输入 if(level=='2' || level=='3'){ for(int i=0;i<Ta_N;i++) if(HeadX==Ta_X[i] && HeadY==Ta_Y[i]) Lose = false; } }
Menu函数(循环调用Move)
void menu(){ if(kbhit()){ x=getch(); if(x=='s' || x=='S'){ system("cls"); table(); while(Lose){ Line(); Input(); Move(); // 循环内每次调用Move都会触发difficulty的输入等待 Sleep(50); } system("pause"); } } }
解决方案
核心思路是只调用一次difficulty()获取难度值,之后复用该值,以下是几种可行实现方式:
方法1:游戏开始前获取难度,通过参数传递给Move
修改menu()和Move(),在进入游戏循环前先获取难度,后续调用Move时直接传入该值:
// 修改Move函数,新增难度参数 void Move(char level){ if (HeadY >= Height-1 || HeadY <= 0 || HeadX >= Widht-1 || HeadX <= 0) Lose = false; if(level=='2' || level=='3'){ for(int i=0;i<Ta_N;i++) if(HeadX==Ta_X[i] && HeadY==Ta_Y[i]) Lose = false; } } // 修改menu函数,提前获取难度 void menu(){ if(kbhit()){ x=getch(); if(x=='s' || x=='S'){ system("cls"); table(); // 游戏启动前仅获取一次难度 char gameLevel = difficulty(); while(Lose){ Line(); Input(); Move(gameLevel); // 直接传入已获取的难度值 Sleep(50); } system("pause"); } } }
方法2:用静态变量缓存难度值
修改difficulty()函数,用静态变量存储已获取的难度,后续调用直接返回缓存值:
char difficulty() { static char level = 0; // 静态变量仅初始化一次 if (level != 0) { return level; // 已获取过难度,直接返回缓存值 } // 仅第一次调用时执行输入逻辑 while (true) { if (kbhit()) { level = getch(); if (level == '1' || level == '2' || level == '3') { return level; } } } }
后续调用difficulty()时,会直接返回第一次获取的level值,不会再进入循环等待输入。
方法3:使用全局变量存储难度
定义全局变量保存难度值,在游戏开始前调用difficulty()赋值,Move()直接使用全局变量:
// 定义全局变量 char gameLevel; // 保持difficulty函数逻辑不变 char difficulty() { char x; while (true) { if (kbhit()) { x = getch(); if (x == '1' || x == '2' || x == '3') { return x; } } } } // 修改menu函数,提前赋值全局变量 void menu(){ if(kbhit()){ x=getch(); if(x=='s' || x=='S'){ system("cls"); table(); gameLevel = difficulty(); // 将难度存入全局变量 while(Lose){ Line(); Input(); Move(); Sleep(50); } system("pause"); } } } // 修改Move函数,直接使用全局变量 void Move(){ if (HeadY >= Height-1 || HeadY <= 0 || HeadX >= Widht-1 || HeadX <= 0) Lose = false; if(gameLevel=='2' || gameLevel=='3'){ for(int i=0;i<Ta_N;i++) if(HeadX==Ta_X[i] && HeadY==Ta_Y[i]) Lose = false; } }
额外提示
原difficulty()函数中的break和cout << "done";属于无效代码,因为return语句会直接退出函数,可以删除这些冗余代码。
内容的提问来源于stack exchange,提问作者kimo_liz
相关产品推荐
相关产品推荐

