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

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

问题分析与修改方案

你的代码存在几个核心问题,导致无法实现需求:

  1. 函数传参错误:SurrenderPlayer1/2中传递的Surrender是值传递,无法将用户选择的结果返回给调用函数;同时Player1/Player2未初始化就使用,属于未定义行为。
  2. 循环条件错误:while (Surrender=='y' && Surrender=='Y' || Surrender=='n' && Surrender=='N')逻辑矛盾,一个字符不可能同时等于'y'和'Y',应该改为循环直到输入合法值。
  3. 分数函数逻辑错误:Scores函数里的条件判断写法错误,if (xxx == 'y'||'Y')等价于if ((xxx == 'y') || 非0),永远为真;而且你在main里先调用了投降函数,又在Scores里再次调用,导致重复询问。
  4. 分数传递问题: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;
}

修改说明

  1. 合并投降函数:把两个玩家的投降函数合并为通用的Surrender函数,通过传入玩家编号实现复用,减少代码重复。
  2. 明确返回值:函数返回int类型标记是否投降,直接将结果传递给调用者,避免重复询问。
  3. 指针传递分数:使用指针参数int* pScore1直接修改main中的分数变量,解决值传递无法更新的问题。
  4. 修正输入读取:用scanf(" %c", &input)处理输入,跳过换行符避免读取错误。
  5. 简化流程逻辑:在main中按顺序询问玩家,投降后直接更新分数,符合桌游流程且无重复操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:44