C语言如何传递特定输出至其他函数?桌游分数计算问题求助
问题描述
我正在开发一款桌游,需求如下:
- 当玩家选择投降时,另一玩家的分数自动加1,当前玩家分数不增加
目前遇到的问题:如何实现当玩家输入y/Y确认投降后,分数计算函数无需再次询问投降操作,直接根据该结果更新分数。我刚接触C语言,对函数传参逻辑感到困惑。
原代码
#include<stdio.h> char SurrenderPlayer1(int Player1, int Player2, char Surrender) { do { printf("(Y/N)是否投降? "); scanf("%s", &Surrender); switch (Surrender){ case 'y': case 'Y': printf("\n\t玩家%d已投降。玩家%d获胜!", Player1, Player2); break; case 'n': case 'N': printf("\t继续游戏\n"); break; } }while (Surrender=='y' && Surrender=='Y' || Surrender=='n' && Surrender=='N'); } char SurrenderPlayer2(int Player2, int Player1, char Surrender) { do { printf("(Y/N)是否投降? "); scanf("%s", &Surrender); switch (Surrender){ case 'y': case 'Y': printf("\n玩家%d已投降。玩家%d获胜!", Player2, Player1); break; case 'n': case 'N': printf("继续游戏\n"); break; } }while (Surrender=='y' && Surrender=='Y' || Surrender=='n' && Surrender=='N'); } int Scores(int Score1, int Score2) { int Player1, Player2; char Surrender; printf ("!!!比赛分数!!!:"); if (SurrenderPlayer1(Player1, Player2, Surrender)=='y'||'Y') Score1+=1; else(SurrenderPlayer2(Player2, Player1, Surrender)=='y'||'Y'); Score2+=1; printf ("\n玩家1 - %d", Score1); printf ("\n玩家2 - %d", Score2); return 0; } int main(){ int Score1=0, Score2=0; int Player1, Player2; char Surrender; SurrenderPlayer1(Player1, Player2, Surrender); SurrenderPlayer2(Player2, Player1, Surrender); Scores(Score1, Score2); return 0; }
期望示例输出
(Y/N)是否投降?y 玩家1已投降。玩家2获胜! //清屏// !!!比赛分数!!! 玩家1 - 0 玩家2 - 1
问题分析与修改方案
你的代码存在几个核心问题,导致无法实现需求:
- 函数传参错误:
SurrenderPlayer1/2中传递的Surrender是值传递,无法将用户选择的结果返回给调用函数;同时Player1/Player2未初始化就使用,属于未定义行为。 - 循环条件错误:
while (Surrender=='y' && Surrender=='Y' || Surrender=='n' && Surrender=='N')逻辑矛盾,一个字符不可能同时等于'y'和'Y',应该改为循环直到输入合法值。 - 分数函数逻辑错误:
Scores函数里的条件判断写法错误,if (xxx == 'y'||'Y')等价于if ((xxx == 'y') || 非0),永远为真;而且你在main里先调用了投降函数,又在Scores里再次调用,导致重复询问。 - 分数传递问题:
Scores函数接收的Score1/Score2是值传递,修改后无法影响main里的变量,需要用指针传递。
修改后的代码
#include<stdio.h> #include<stdlib.h> // Windows清屏用system("cls"),Linux替换为system("clear") // 处理玩家投降,返回是否投降(1=投降,0=不投降) int Surrender(int playerNum, int opponentNum) { char input; do { printf("(Y/N)玩家%d是否投降? ", playerNum); scanf(" %c", &input); // 加空格跳过换行符,避免读取错误 switch (input) { case 'y': case 'Y': printf("\n\t玩家%d已投降。玩家%d获胜!\n", playerNum, opponentNum); return 1; // 返回1表示投降 case 'n': case 'N': printf("\t继续游戏\n"); return 0; // 返回0表示不投降 default: printf("输入无效,请输入Y/y或N/n\n"); } } while (1); // 循环直到输入合法值 } // 更新分数,用指针直接修改原变量 void UpdateScores(int* pScore1, int* pScore2, int surrenderPlayer) { if (surrenderPlayer == 1) { (*pScore2)++; // 玩家1投降,玩家2分数+1 } else if (surrenderPlayer == 2) { (*pScore1)++; // 玩家2投降,玩家1分数+1 } system("cls"); // 执行清屏 printf("!!!比赛分数!!!\n"); printf("玩家1 - %d\n", *pScore1); printf("玩家2 - %d\n", *pScore2); } int main() { int score1 = 0, score2 = 0; int surrenderResult; // 询问玩家1是否投降 surrenderResult = Surrender(1, 2); if (surrenderResult == 1) { UpdateScores(&score1, &score2, 1); return 0; } // 玩家1不投降,询问玩家2 surrenderResult = Surrender(2, 1); if (surrenderResult == 1) { UpdateScores(&score1, &score2, 2); return 0; } // 双方均不投降,可添加继续游戏逻辑 printf("双方均选择继续游戏,进入下一回合\n"); return 0; }
修改说明
- 合并投降函数:把两个玩家的投降函数合并为通用的
Surrender函数,通过传入玩家编号实现复用,减少代码重复。 - 明确返回值:函数返回
int类型标记是否投降,直接将结果传递给调用者,避免重复询问。 - 指针传递分数:使用指针参数
int* pScore1直接修改main中的分数变量,解决值传递无法更新的问题。 - 修正输入读取:用
scanf(" %c", &input)处理输入,跳过换行符避免读取错误。 - 简化流程逻辑:在
main中按顺序询问玩家,投降后直接更新分数,符合桌游流程且无重复操作。
内容的提问来源于stack exchange,提问作者loochieeee
相关产品推荐
相关产品推荐

