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

C++循环切换玩家回合名称变量值的问题求助与代码修正建议

问题分析与代码修正

我来帮你看看这个问题~你的代码里主要有两个核心问题导致current_name_turn无法正确输出:

问题1:current_name_turn初始化时机错误

你在全局作用域中把current_name_turn赋值为player_1,但此时player_1还没有被用户输入赋值(main函数里才会调用ask_player_name_1给player_1赋值),所以初始的current_name_turn是空字符串,第一次进入player_turn时自然无法正确显示玩家名称。

问题2:函数参数传递的冗余(非致命,但可以优化)

你的ask_player_name_1和ask_player_name_2函数接收了player_1/player_2参数,但实际上函数内部并没有使用传入的参数值,而是直接给全局数组name赋值后再返回,这部分参数可以简化。


修正后的完整代码

#include <iostream>
using namespace std;

bool game_is_playing = true;
string name[] = {"x","o"};
string player_1, player_2;
string current_name_turn; // 先声明,不初始化

// 优化:不需要传递参数,直接返回输入的名字
string ask_player_name_1(){
    cout << " Player 1's name: ";
    cin >> name[0];
    return name[0];
}

string ask_player_name_2(){
    cout << " Player 2's name: ";
    cin >> name[1];
    return name[1];
}

void display_board(){
    cout << player_1 + " (X) - (O) " + player_2 << endl;
}

void player_turn(){
    int position;
    cin.clear();
    cout << current_name_turn << "'s turn." << endl;
    cout << "Enter position: " << endl;
    cin >> position;
    // 这里可以加输入验证逻辑,比如判断position是否合法
}

void switch_player_turn(){
    if (current_name_turn == player_1){
        current_name_turn = player_2;
    } else {
        current_name_turn = player_1;
    }
    // 简化else if为else,因为只有两个玩家,非此即彼
}

void play_the_game(){
    display_board();
    while(game_is_playing){
        player_turn();
        switch_player_turn();
        // 这里可以加游戏结束的判断逻辑,比如设置game_is_playing为false
    }
}

int main() {
    player_1 = ask_player_name_1();
    player_2 = ask_player_name_2();
    current_name_turn = player_1; // 关键:获取完玩家名字后再初始化
    play_the_game();
    return 0;
}

额外优化建议

  1. 减少全局变量:全局变量容易导致代码耦合度高,比如可以把game_is_playing放到play_the_game函数内部,用循环条件直接控制,或者通过函数返回值来结束游戏。
  2. 输入验证:在player_turn里添加对position的合法性检查(比如是否在1-9之间,是否未被占用),避免非法输入导致程序异常。
  3. 用引用传递简化赋值:如果不想用返回值,也可以把ask_player_name函数的参数改成引用,直接修改外部变量,比如:
    void ask_player_name_1(string &player){
        cout << " Player 1's name: ";
        cin >> player;
        name[0] = player;
    }
    
    这样main里直接调用ask_player_name_1(player_1)即可,不需要接收返回值。

内容的提问来源于stack exchange,提问作者Meilianto Luffenz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:52:42