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; }
额外优化建议
- 减少全局变量:全局变量容易导致代码耦合度高,比如可以把
game_is_playing放到play_the_game函数内部,用循环条件直接控制,或者通过函数返回值来结束游戏。 - 输入验证:在
player_turn里添加对position的合法性检查(比如是否在1-9之间,是否未被占用),避免非法输入导致程序异常。 - 用引用传递简化赋值:如果不想用返回值,也可以把
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
相关产品推荐
相关产品推荐

