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

C语言剪刀石头布游戏:函数间参数传递问题求助

解决剪刀石头布游戏的参数传递问题

你的代码核心问题是没有正确接收函数返回值,同时存在几个小错误,以下是修正方案:

问题拆解

  1. 未接收返回值:main里调用computer(c)和player(p)时,只是调用函数但没把返回的选择赋值给变量p和c,导致后续传递给game的是未初始化的垃圾值。
  2. 冗余参数:computer和player函数的参数完全多余,它们的功能是生成/获取选择并返回,不需要传入参数。
  3. 变量名笔误:game函数里的computer_choice是拼写错误,应该是comp_choice。
  4. 随机种子位置错误:srand(time(0))放在computer函数里会导致每次调用都重置种子,随机值会重复,应该只在程序启动时调用一次。
  5. 输入缓冲区问题:scanf("%c")会读取输入后的换行符,需要加空格跳过空白字符。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char computer(void);
char player(void);
int game(char, char);
void outcome(char, char);

int main()
{
    // 只初始化一次随机种子,保证随机值不重复
    srand(time(0));
    
    // 接收player和computer函数返回的选择
    char p = player();
    char c = computer();
    
    game(p, c);
    outcome(p, c);
    
    return 0;
}

// 无参数,直接生成电脑选择并返回
char computer(void) {
    int n = (rand() % 3) + 1;
    
    if(n == 1) {
        return 'R';
    }
    else if(n == 2) {
        return 'P';
    }
    else {
        return 'S';
    }
}

// 无参数,获取用户输入并返回
char player(void) {
    char player_choice;
    printf("Enter(R)ock/(P)aper/(S)cissors: ");
    // 加空格跳过换行符等空白字符
    scanf(" %c", &player_choice);
    return player_choice;
}

int game(char player_choice, char comp_choice)
{
    // 修正变量名笔误
    if(player_choice == 'R' && comp_choice == 'S') {
        return -1;
    }
    else if(player_choice == 'S' && comp_choice == 'P') {
        return -1;
    }
    else if(player_choice == 'P' && comp_choice == 'R') {
        return -1;
    }
    else if(player_choice == 'S' && comp_choice == 'R') {
        return 0;
    }
    else if(player_choice == 'P' && comp_choice == 'S') {
        return 0;
    }
    else if(player_choice == 'R' && comp_choice == 'P') {
        return 0;
    }
    else if(player_choice == comp_choice) {
        return 1;
    }
    else {
        return 2;
    }
}  

void outcome(char p, char c) {
    int result = game(p, c);
    
    if(result == -1) {
        printf("You Win\n");
    }
    else if(result == 0) {
        printf("You lose\n");
    }
    else if(result == 1) {
        printf("It's a tie\n");
    }
}

关键修改说明

  • 把computer和player改成无参数函数,直接返回生成/获取的选择,main中用变量接收这些返回值,再传递给game和outcome,完美解决参数传递问题。
  • 不需要使用指针,返回值的方式更简洁直接,完全满足你的需求(不在main中直接获取用户输入)。
  • 修正了随机种子和输入缓冲区的问题,避免出现异常情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:53:10