C - Rock,Paper,Scissors记分牌问题

时间:2018-02-26 20:19:08

标签: c

语言: 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;
}

我对编码仍然比较新,所以我很抱歉,如果我的代码看起来像一团糟而且没有按原样压缩。

3 个答案:

答案 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之外声明它们或作为任何参数来制作CwonPwonmain个全局变量在参数列表中,如下所示:

    int Tie, Cwon, Pwon;
    

    并在每个例程中使用它们,就像它们是参数一样。这使得它们成为全局变量,您可以从程序中的每个函数引用它们(来自mainscissorsstonepaper)您必须将声明放在文件的开头,您甚至可以为每个变量设置初始值,如:

    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_Tiesnum_Cwonnum_Pwon