语言: C
情况:我们的教授让我们制作一个摇滚,纸张,剪刀代码,主要包含一个“开关”语句,“for”循环和“if ... .else“声明。
问题:该程序大部分都有效,但在退出时无法显示记分板的正确数量。它似乎忽略了所有事情,并默认回到原定义值“0”
我的C代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
// Rock
int rock(int comp, int Tie, int Cwon, int Pwon) {
if(comp==1) {
printf("\nTie!\n");
Tie++;
} else if(comp==2) {
printf("\nYou picked Rock, the computer picked Paper.\nPaper covers Rock, the computer wins!\n");
Cwon++;
} else if(comp==3) {
printf("\nYou picked Rock, the computer picked Scissors.\nRock breaks Scissors, you win!\n");
Pwon++;
} else {
printf("Error");
}
return Tie, Cwon, Pwon;
}
// Paper
int paper(int comp, int Tie, int Cwon, int Pwon) {
if(comp==1) {
printf("\nYou picked Paper, the computer picked Rock.\nPaper covers Rock, you win!\n");
Pwon++;
} else if(comp==2) {
printf("\nTie!\n");
Tie++;
} else if(comp==3) {
printf("\nYou picked Paper, the computer picked Scissors.\nScissors cut Paper, the computer wins!\n");
Cwon++;
} else {
printf("Error");
}
return Tie, Cwon, Pwon;
}
// Scissors
int scissors(int comp, int Tie, int Cwon, int Pwon) {
if(comp==1) {
printf("\nYou picked Scissors, the computer picked Rock.\nRock breaks Scissors, the computer wins!\n");
Cwon++;
} else if(comp==2) {
printf("\nYou picked Scissors, the computer picked Paper.\nScissors cut Paper, you win!\n");
Pwon++;
} else if(comp==3) {
printf("\nTie!\n");
Tie++;
} else {
printf("Error");
}
return Tie, Cwon, Pwon;
}
// Score Display
int score(int Pwon, int Cwon, int Tie) {
printf("\nYou won %d times, the computer won %d times and it was a tie %d times.\nThank you for playing!\n", Pwon, Cwon, Tie);
}
// playCases w/ Switch
int playCases(char input, int comp, int Tie, int Cwon, int Pwon, int i) {
switch(input) {
case 'R' :
case 'r' :
rock(comp, Tie, Cwon, Pwon);
break;
case 'P' :
case 'p' :
paper(comp, Tie, Cwon, Pwon);
break;
case 'S' :
case 's' :
scissors(comp, Tie, Cwon, Pwon);
break;
case 'Q' :
case 'q' :
score(Pwon, Cwon, Tie);
i=999;
break;
default :
printf("Error: Invalid choice, try again.");
break;
}
return Tie, Cwon, Pwon;
}
// Flush
void flushScanf(int input) {
char r;
while((r = getchar()) != '\n' && r != EOF);
}
// Main Function
int main(void) {
char input;
int Cwon=0, Pwon=0, Tie=0;
printf("Let's play a game of Rock/Paper/Scissors\n");
//For Loop
for(int i=1; i<999;++i) {
printf("\nEnter the r, p, s, or q (for quit): ");
scanf("%c", &input);
flushScanf(input);
int comp=rand()%3+1;
playCases(input, comp, Tie, Cwon, Pwon, i);
}
return 0;
}
我对编码仍然比较新,所以我很抱歉,如果我的代码看起来像一团糟而且没有按原样压缩。
答案 0 :(得分:1)
这是因为您已通过按值计数器。如该术语所暗示的,只复制变量值的值,并且与原始变量的关系将丢失。
在C ++中你可以通过引用传递它们,但是在C中你必须通过指针传递它们,如果你想更新它们,或者想办法使用返回值来返回一个结果,并处理它在主要代码中。
答案 1 :(得分:1)
有一些问题。学习如何通过指针传递变量。如果这样做,您可以修改函数内的值。
int paper(int comp, int Tie, int Cwon, int Pwon) {
替换为:
int paper(int comp, int *Tie, int *Cwon, int *Pwon) {
//...
(*Cwon)++;
//...
}
你不能像这样返回乘法值:
return Tie, Cwon, Pwon;
正如我所提到的,使用指针并在*
运算符取消引用指针后修改值。
这是您考虑的小例子。请注意,num
不会在功能剪刀之外发生变化。
#include<stdio.h>
void scissors(int num, int *Tie, int *Cwon, int *Pwon) {
num++;
(*Tie)++;
(*Cwon)++;
(*Pwon)++;
}
int main() {
int num = 0;
int Tie = 1;
int Cwon= 2;
int Pwon= 3;
scissors(num, &Tie, &Cwon, &Pwon);
printf("num= %d Tie= %d Cwon= %d Pwon= %d \n", num, Tie, Cwon, Pwon );
scissors(num, &Tie, &Cwon, &Pwon);
printf("num= %d Tie= %d Cwon= %d Pwon= %d \n", num, Tie, Cwon, Pwon );
return 0;
}
输出:
num= 0 Tie= 2 Cwon= 3 Pwon= 4
num= 0 Tie= 3 Cwon= 4 Pwon= 5
答案 2 :(得分:0)
代码中的问题是C中的所有参数都是按值传递的,这意味着该参数被复制到函数中的本地存储中,与main中的值无关。
有两种方法可以解决这个问题:
第一个,也是最简单的,是通过在Tie
之外声明它们或作为任何参数来制作Cwon
,Pwon
和main
个全局变量在参数列表中,如下所示:
int Tie, Cwon, Pwon;
并在每个例程中使用它们,就像它们是参数一样。这使得它们成为全局变量,您可以从程序中的每个函数引用它们(来自main
,scissors
,stone
和paper
)您必须将声明放在文件的开头,您甚至可以为每个变量设置初始值,如:
int Tie = 0, Cwon = 0, Pwon = 0;
第二个更精细,因为它要求你知道什么是引用(指向变量的指针)并传递正确的引用。这意味着你必须改变:
int scissors(int comp, int Tie, int Cwon, int Pwon)
到
int scissors(int comp, int *Tie, int *Cwon, int *Pwon)
但是,你必须通过例程实际参考:
int num_Ties = 0, num_Cwon = 0, num_Pwon = 0;
....
scissors(comp, &num_Ties, &num_Cwon, &num_Pwon);
这意味着您希望使用scissors
变量的值调用comp
,并引用变量num_Ties
,num_Cwon
和num_Pwon
。