如何使用类对象执行正确的运行总计

时间:2015-10-21 15:38:03

标签: c++ object methods

我正在编写一个类似于猜测模具和纸牌游戏的程序。它模拟用户掷骰子,并根据他们所生成的卡片生成的卡数量相当于他们在该轮次中收到的积分数量。例如,滚动1有一张牌,表示用户捕获了一条大鱼,并获得了20分。我遇到的问题是增加积分并保持总计。该程序仅显示滚动的骰子编号,而不是该回合获得的点数。它也不会打印正确的最终总数。我已经修了好几天,这让我相信我犯了一个简单的错误。请帮忙。我的代码粘贴在下面。

    #include<iostream>
#include<cstdlib>

class Dice{
    private: 
        int dicevalue;
    public:
        int rollDice(){
         int ran = rand() %6 +1;
        dicevalue = ran;
         return dicevalue;
           }
};

class Points{

    public:
        int getpoints(int dicevalue){
            switch(dicevalue){
                case 1:
                    printf("\nYou won %d points\n",dicevalue);
                    return 1;
                    break;
                case 2:
                    printf("\nYou won %d points\n",dicevalue);
                    return 2;
                    break;
                case 3:
                    printf("\nYou won %d points\n",dicevalue);
                    return 3;
                    break;
                case 4:
                    printf("\nYou won %d points\n",dicevalue);
                    return 4;
                    break;
                case 5:
                    printf("\nYou won %d points\n",dicevalue);
                    return 5;
                    break;
                case 6:
                    printf("\nYou won %d points\n",dicevalue);
                    return 6;
                    break;
            }

            return -1;
        }
};

class Game{
    private:
        int total=0;
        Points points;
        Dice dice;

    public:
        int playgame(){
            int con;
            do{
            int dicevalue = dice.rollDice();
            int points_to_add=points.getpoints(dicevalue);
            total = total + points_to_add;

            printf("\nif you want one more term press 1 or 0 : ");
            scanf("%d",&con);   
        }while(con==1);

        return total;
        }


};

int main(){
    Game game;
    printf("\ntotal points are %d",game.playgame());
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您遇到的奇怪行为与您使用旧C函数printfscanf有关。

特别要考虑这两行:

        printf("\nif you want one more term press 1 or 0 : ");
        scanf("%d",&con);   

printf的输出缓冲,即无法保证它会立即写入控制台或程序输出定向的任何位置。实际上,当scanf提示用户输入时,输出可能仍未写入,这显然会导致用户体验不佳!用户输入内容,只有然后才能看到应该一直可见的行...

您可以使用fflush(stdout)作为解决方法来强制刷新缓冲区。但你为什么要这样?如果您使用std::coutstd::cin的C ++ I / O,那么您不会遇到此问题,因为从std::cin读取会自动刷新输出缓冲区 [*]

        std::cout << "\nif you want one more term press 1 or 0 : ";
        std::cin >> con;

这是一个很好的例子,说明如何使用标准C ++机制自动阻止你处理初学者甚至不应该知道的低级别问题。

我相信您所描述的所有其他错误只是对您不一致的程序输出的错误解释,因为如果我用{{{}替换所有printf / scanf调用,该程序对我来说非常有效。 1}} / std::cout

[*] 此功能的技术背景是std::cin被称为tiedstd::cin

答案 1 :(得分:-1)

添加

using namespace std;

在代码的开头,以便我们可以编译它而不会出错。

在我看来,您的代码完全符合预期。

在函数getpoints()中,你总是返回与dicevalue相同的值,(例如case 1:... return 1;)所以它相当于

  int getpoints(int dicevalue){
      if (dicevalue < 7) {
        printf("\nYou won %d points\n",dicevalue);
        return dicevalue;
      }
      else return -1;
  }

我更改了它,以便点数为dicevalue + 10并且工作正常:

  int getpoints(int dicevalue){
      if (dicevalue < 7) {
        int numberPoints = dicevalue+10;
        printf("\nYou won %d points\n",numberPoints);
        return numberPoints;
      }
      else return -1;
  } 

最后,我总是得到&#34;总得分是&#34;我在这轮比赛中获得的积分总和。

您应该使用时间为随机数播种,将其放在主函数的开头:

srand(time(NULL));

实际上,每当我启动程序时,我都会获得相同的数字序列。

希望这会有所帮助。