gpt4 book ai didi

c - 对石头/剪刀/布感到沮丧

转载 作者:行者123 更新时间:2023-11-30 21:11:21 27 4
gpt4 key购买 nike

我还在和我叔叔一起学习 C,我在尝试编译我们一起编写的玩剪刀石头布的程序时遇到了另一个麻烦。我在该程序上还有更多工作要做,但我什至无法让大部分内容正常工作。

我使用 Make 命令从编译器收到的错误

main.c: in function 'start_play':

main.c:79:7: error: format '%s' expects argument type 'char *', but argument 2 has type 'int' [-werror=format=]

scanf("%1s", human_hand[0]);


main.c:82:11: error: format '%s' expects argument of type 'char *', but argument 3 has type 'int' [-Werror=format=]

fprintf( stderr, "Player 1 has entered an invalid hand choice, %s.", player_1);

main.c:104:1: error: ISO C forbids nested functions [-Werror=pedantic]

int choice_to_int(const char a)

main.c:104:1: error: ISO C90 forbids mixed declarations and code [-Werror=pedantic]

main.c 132:1: error: expected declaration or statement at end of input

}

main.c:132:1: error: expected declaration or statement at end of input

main.c:60:6: error: unused variable 'choice' [-Werror=unused-variable]

enum choices choice;

这是 main.c 文件的内容,我似乎无法理解。

/*
Programmer: Tim Bowen
Creation Date: 2014/05/26
Last Updated: 2014/05/27
Project Name: RPS(Rock/Paper/Scissors)
*/

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


int gen_hand( );
void start_play();
int choice_to_int(const char a);


int main ( int argc, char *arga[], char **env)
{
start_play( );
return 0;
} /*end main*/


/*
Precondition: Srand must but initialized before usage of gen_hand
Post condition: function returns either 0, 1 or 2.
*/


int gen_hand( ) {
return((rand() % 3 ));
}

void start_play( ) {

enum choices { ROCK, PAPER, SCISSORS };
enum choices choice;
const char *rps[] = {"Rock", "Paper", "Scissors"};
int player_1, player_2;
char answer[2];
char human_hand[2];
srand(time(NULL));

printf("%s\n", "This program plays Rock, Paper, Scissors.");
printf("%s\n", "Version 0.2");

do{
printf("%s\n", "Do you want to play against the computer? (Y/N):");
printf("%s\n", "Any other character to quit.:");
scanf("%1s", answer);
printf("%s\n", answer);
break;
if(answer[0] == 'y' || answer[0] == 'Y')
{
printf( "%s\n", "Please enter your hand(R/P/S):");
scanf("%1s", human_hand[0]);
player_1=choice_to_int(human_hand[0]);
if(player_1==3){
fprintf( stderr, "Player 1 entered an invalid hand choice, %s", player_1 );
/* err_hand();
break;} */
player_2=gen_hand( );
printf( "Player one => %d\n %2s", player_1, rps[player_1]);
printf( "player two => %d\n %2s", player_2, rps[player_2]);
}
else if (answer[0] == 'n' || answer[0] == 'N' )
{
player_1=gen_hand( );
player_2=gen_hand( );
printf( "Player one => %d\n %2s", player_1, rps[player_1]);
printf( "player two => %d\n %2s", player_2, rps[player_2]);
}
else {
break;
}
while (1);
return;

}


/*
precondition: user passes in either, Rr, Pp, Ss, or another incorrect response.
post condition: function returns either 0, 1, or 2 for correct responses, or 3 for erroneous ones.
*/


int choice_to_int(const char a)
{

int r;

switch ( r ) {

case 'R':
case 'r':
r=0;
break;

case 'P':
case 'p':
r=1;
break;

case 'S':
case 's':
r=2;
break;

default:
r=3;
break;

}
return (r);
}

我为几乎过多的额外行表示歉意,但我这样做是为了(希望)更容易阅读。我不确定这次我做错了什么,因为我几乎完全从类笔记中复制了这一点。我无法继续尝试添加我应该添加的部分,因为我无法让我们一起编码的部分正常工作。当我叔叔编译示例时,没有出现这些错误。

编辑:到目前为止,给出的答案已经帮助清除了所涉及的大部分错误,除了一个新错误:

main.c:58:5 error: format '%s' expected arguments of type 'char ', but argument 2 has type 'char ()[2]' [-Werror=format]

它仍然提示我没有使用变量“选择”,但说实话,我不确定如何使用选择。我可能没有说清楚,但我没有直接“写”这个。我在叔叔写的时候提出建议,然后“课”结束后我在我的机器上重写了它。我并没有真正声称完全理解我在这里所做的事情......该程序应该是显而易见的(对于具有丰富编码经验的人......),但我想我没有明白。

它应该选择玩石头/剪刀/布,并提供让计算机自己玩的选项(else if语句),我们使用枚举来指定选择,然后使用choice_to_int来接受用户输入并将其转换回与枚举匹配的值,并允许我根据这些值的比较创建“赢/输/平局”语句。我可能建议了一些愚蠢的方法来实现这个想法,但这就是想法。我还没有达到可以创建赢/输/平局语句的程度,或者如果用户决定放入不适合游戏格式的内容(例如,Z 或其他内容)时处理错误。

感谢您迄今为止的帮助,并在这个也许不必要地复杂的石头/剪刀/布的实现上对我的帮助...

最佳答案

一些一般建议:不要编写包含数十个问题的 100 行代码,而是一次编写一小段代码,检查其是否全部正常工作,然后继续处理下一段代码。

其他答案尚未提及的问题:

<小时/>
int gen_hand( );
void start_play();

应该是:

int gen_hand(void);
void start_play(void);

void 表示该函数不带参数;空括号意味着我们还不知道需要多少(如果你不正确,你的程序可能会搞砸)。

<小时/>

接下来,scanf("%1s", answer);scanf("%1s", human_hand[0]);。使用 scanf 您必须告诉它在哪里写入您读取的字符。相反,你告诉它这些东西的当前值。使用 & 运算符获取目标位置的地址。

<小时/>

在此代码中:

if(player_1==3){
fprintf( stderr, "Player 1 entered an invalid hand choice, %s", player_1 );
/* err_hand();
break;} */

您永远不会关闭{,因为您注释掉了结束的}。您不应该注释掉 break;},因为这意味着您继续使用 3 作为越界的数组索引。

<小时/>

printf( "player 二 => %d\n %2s", player_2, rps[player_2]); 中,2 表示:打印至少 2人物。所有字符串都比 2 长得多,因此这没有效果。你想做什么?

关于c - 对石头/剪刀/布感到沮丧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23975074/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com