【问题标题】:C Programming 'Craps' Game [closed]C编程“掷骰子”游戏[关闭]
【发布时间】:2013-04-13 02:14:39
【问题描述】:

我正在为我的 C 编程课程做一个学习任务,我被要求做以下事情:

任务 2。废话。

在掷骰子游戏中,“及格线”赌注如下进行。使用两个六面骰子, 掷骰子的第一轮骰子称为“Come out Roll”。投注 出局点数为 7 或 11 时立即获胜,出局点数为 7 或 11 时输 2、3 或 12。如果在出局掷骰上掷出 4、5、6、8、9 或 10,则该数字成为“点数”。玩家继续掷骰子,直到掷出 7 点或点数。如果点数先滚动,则玩家赢得赌注。如果玩家先掷出 7,那么玩家 输了。

使用上述规则编写一个玩掷骰子游戏的程序,以便它 模拟没有人工输入的游戏。该程序没有要求下注,而是 应该只计算玩家是否会赢或输。创建一个模拟的函数 掷两个骰子并返回总和。添加一个循环,让程序播放10,000 游戏。

添加计数器来计算玩家获胜的次数以及获胜次数 玩家输了。在 10,000 场比赛结束时,计算获胜的概率,即 Wins / (Wins + Losses) 并输出此值。从长远来看,谁会赢 掷骰子最多的游戏,是你还是房子?

这是我目前所写的:

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

// Craps Program
// Written by Kane Charles
// Lab 2 - Task 2

// 7 or 11 indicates instant win
// 2, 3 or 12 indicates instant los
// 4, 5, 6, 8, 9, 10 on first roll becomes "the point"
// keep rolling dice until either 7 or "the point is rolled"
//      if "the point" is rolled the player wins
//      if 7 is rolled then the player loses

    int wins = 0, losses = 0;
    int r, i;
    int N = 1, M = 12;
    int randomgenerator();

main(void){

    /* initialize random seed: */
  srand (time(NULL));
  /* generate random number 10,000 times: */
  for(i=0; i < 10000 ; i++){
     int r = randomgenerator();
     if (r == 7 || r == 11) {
        wins++;
     }
     else if (r == 2 || r == 3 || r == 12) {
        losses++;
     }
     else if (r == 4 || r == 5 || r == 6 || r == 8 || r == 9 || r == 10) {
        int point = r;
        int temproll;
        int *tr = &temproll;
        do
        {
             *tr = randomgenerator();

        }while (temproll != 7 || temproll != point);

        if (temproll == 7) {
            losses++;
        }
        else if (temproll == point) {
            wins++;
        }
     }
  }
    printf("Wins\n");
    printf("%d",&wins);
    printf("\nLosses\n");
    printf("%d",&losses);
}

int randomgenerator(){
    r = M + rand() / (RAND_MAX / (N - M + 1) + 1);
    return r;
}

程序总是以:

Wins:
0.000000
Losses:
0.000000

而它应该显示(共 10000 次)程序赢了多少次,输了多少次。有人能帮我解决这个问题吗?我怀疑我可能需要使用指针而不是 wins++losses++ 以便全局保存分数。

请记住,我是很多新手,因此我们将不胜感激。

【问题讨论】:

  • 滚动两个六面骰子不会产生 2 到 12 之间的均匀加权概率。您将不匹配的值传递给您的打印语句,这就是您最终得到 0 打印输出的原因 -调高你的警告级别!
  • 请不要这样编辑您的问题。它使人们的回答变得荒谬。您可以随意添加新信息,但请不要替换原来的信息。
  • @CarlNorum 对此感到抱歉,我什至没有想过这会给查看帖子的人带来什么影响。再次抱歉

标签: c random numbers generator


【解决方案1】:

我发现您在main 中的if 语句存在一个主要问题,例如:

if (r = 7 || 11)

您使用的是= 赋值而不是== 相等。下一个问题是您似乎对|| 的工作方式存在误解。您似乎想检查 r7 还是 11,实际上是:

if( (r == 7) || (r == 11) )

您还在这里的do 循环中创建了一个本地temproll

 int temproll;
 do
 {
      int temproll = randomgenerator();
      ^^^^^^^^^^^^
 }while (temproll != 7 || point);

这意味着您在do 循环中生成的值一旦您离开就会丢失,随后的if 语句将检查未定义的值。据我所知,while 的意思可能是这样的:

 while (temproll != 7 && temproll != r );

这意味着temproll 不是7 也不是r

最后打印出来的输赢也需要修正:

printf("%lf",&wins);
printf("%lf",&losses);

lf 格式适用于double,您使用的是wins 的地址而不是值,它应该是:

printf("%d",wins);
printf("%d",losses);

【讨论】:

  • +1。而|| 不是那样工作的。
  • @CarlNorum 是的,我之前就发过帖子了
  • 这不是布尔值 ||也可以。 r==2 || r==3...
  • 那么 (r==2 || r==3) 会起作用吗? @JoeFrambach
【解决方案2】:

你的代码中有一堆逻辑错误

 if (r == 7 || r ==11) {
    //^^^^should be logical equal not assignment and r== cannot be skipped for 11
    wins++;
 }
 else if (r = 2 || 3 || 12) {
  //similar error as above
    losses++;
 }
 else if (r = 4 || 5 || 6 || 8 || 9 || 10) {
  //similar error as above
    int point = r;
    int temproll;
    do
    {
         int temproll = randomgenerator();

    }while (temproll != 7 || point); //^^same error here

    if (temproll = 7) {
        //^^should be temproll ==7
        losses++;
    }
    else if (temproll = point) {
        //similar error
        wins++;
    }

更新后,这里有一个问题:

    int temproll;
    //remove line below
    //int *tr = &temproll;
    do
    {
         //*tr = randomgenerator();
         //replace this line with:
         temproll = randomgenerator();

    }while (temproll != 7 || temproll != point);

输赢的打印语句有错误:

 printf("%d",&wins);
 //^^^^^^^^^^^remove &
 printf("\nLosses\n");
   printf("%d",&losses);
  ///^^^^^^^^^same thing, remove &

你当前的代码永远不会结束,因为这里有死循环:

 else if (r == 4 || r == 5 || r == 6 || r == 8 || r == 9 || r == 10) {
    int point = r;  //so r cannot be 7, otherwise, will not enter this if block
    int temproll;
    int *tr = &temproll;
    do
    {
         *tr = randomgenerator();

    }while (temproll != 7 || temproll != point);
    //you will need temproll ==7 and temproll ==point to exit this loop
    //this means point ==7. however, pointer can never be 7. dead loop, keep running...
 }

【讨论】:

  • @WhozCraig 是的,它们是逻辑错误,所以我更新了。谢谢!
  • 谢谢你,我现在更新代码!
  • @KaneCharles 不客气
  • 你有什么资源可以推荐给我用来学习一些基本的 C 语言吗? Uni 在推荐可靠来源以了解基础知识方面并没有多大帮助。 @tacp
  • @KaneCharles 尝试阅读 Dennis Ritchie 撰写的经典书籍:amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/…
猜你喜欢
  • 2012-02-29
  • 2015-12-24
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多