You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取函数返回值且无需重复执行该函数?

问题描述

如何获取函数返回的数值,而无需再次执行该函数?

当前代码中,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;
    }
}
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:45:44