C语言剪刀石头布游戏:函数间参数传递问题求助
解决剪刀石头布游戏的参数传递问题
你的代码核心问题是没有正确接收函数返回值,同时存在几个小错误,以下是修正方案:
问题拆解
- 未接收返回值:
main里调用computer(c)和player(p)时,只是调用函数但没把返回的选择赋值给变量p和c,导致后续传递给game的是未初始化的垃圾值。 - 冗余参数:
computer和player函数的参数完全多余,它们的功能是生成/获取选择并返回,不需要传入参数。 - 变量名笔误:
game函数里的computer_choice是拼写错误,应该是comp_choice。 - 随机种子位置错误:
srand(time(0))放在computer函数里会导致每次调用都重置种子,随机值会重复,应该只在程序启动时调用一次。 - 输入缓冲区问题:
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
相关产品推荐
相关产品推荐

