CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

C数组问题,送分!!!

楼主lxas(八云)2001-04-24 16:41:00 在 C/C++ / C语言 提问

编写一个程序,运行掷骰子游戏1000次,并回答:  
  a)第一次掷骰子,第二次掷骰子,……第二十次掷骰子、以及第二十次之后赢的游戏各有多少次。  
  b)第一次掷骰子,第二次掷骰子,……第二十次掷骰子、以及第二十次之后赢的游戏各有多少次。  
  c)一次游戏的平均投掷次数是多少?  
  游戏规则:  
  游戏者投掷两颗骰子,第一次投掷后如果两颗的和为7或11,那么游戏者就赢了,如果和为2、3或12游戏者就输了、如果为4、5、6、8、9、10,那么这就为游戏者的点数。要想赢的话,必须继续投掷骰子,直到取得自己的点数为止,但是,如果掷出7,那么游戏者就输了。  
  我写了下面的程序,可是老是觉得不是很好,请各位帮我看一下,有没有更简单的方法?  
   
  #include<stdio.h>  
  #include<stdlib.h>  
  #include<time.h>  
  #define   SIZE   21  
   
  int   rollDice   (void);  
   
  main()  
  {  
        int   win[SIZE]={0},   loose[SIZE]={0},   i,   gameStatus,   myPoint,  
                total,   count,   a,   sum;  
   
        srand(time(NULL));  
   
   
        for(count=1;   count<=1000;   count++)  
        {  
              total=rollDice();//第一次投掷  
              switch(total)  
              {  
    case   7:   case   11://第一次就赢了  
          gameStatus=1;  
          win[0]++;  
          break;  
   
    case   2:   case   3:   case   12://第一次就输了  
          gameStatus=2;  
          loose[0]++;  
          break;  
   
    default://记下点数  
          gameStatus=0;  
          myPoint=total;  
          //printf("%d",   myPoint);  
          break;  
              }  
    i=0;  
    while(gameStatus==0)//计算投掷次数  
   
    {  
          i++;  
          total=rollDice();  
          if   (total==myPoint)  
          {  
                gameStatus=1;  
                win[i]++;  
                if(i>20)  
      win[20]++;  
          }  
          else   if   (total==7)  
          {  
  gameStatus=2;  
  loose[i]++;  
  if(i>20)  
        loose[20]++;  
          }  
    }  
   
    if   (gameStatus==1)  
          printf("w(%d)\t",   i+1);  
    else  
          printf("l(%d)\t",   i+1);  
        }  
              for(a=0;   a<=SIZE-1;   a++)  
              {  
    if(a>=20)  
    {  
          printf("win   over   20:%4d--",   win[a]);  
          printf("loose   over   20:%4d--",   loose[a]);  
    }  
    else  
    {  
          printf("win[%d]:%4d--",   a+1,   win[a]);  
          printf("loose[%d]:%4d--",   a+1,   loose[a]);  
    }  
              }  
              for(i=0;   i<=SIZE-1;   i++)//计算总共投掷次数  
              {  
    sum+=(win[i]+loose[i]);  
              }  
                printf("\nThe   average   is:%f",   (float)sum/1000);  
   
        return   0;  
  }  
   
  int   rollDice   (void)  
  {  
        int   die1,   die2,   workSum;  
   
        die1=1+(rand()%6);  
        die2=1+(rand()%6);  
        workSum=die1+die2;  
        return   workSum;  
  }  
   
  另外还有两个问:  
  1,赢的机会是否会随着投掷次数的增加而上升?  
  2,赢得游戏的运气怎样?  
  问题点数:25、回复次数:18Top

1 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-04-24 16:47:00 得分 0

lookTop

2 楼lxas(八云)回复于 2001-04-24 18:48:00 得分 0

回答我   !!!  
  Top

3 楼ddaallii(大李)回复于 2001-04-24 19:18:00 得分 0

我看的眼好花!!Top

4 楼ddt2000(尘土飞扬)回复于 2001-04-24 19:32:00 得分 0

我劝你还是学一下《数据结构》,写的什么?Top

5 楼lxas(八云)回复于 2001-04-24 22:15:00 得分 0

唉,   没办法.我也知道最后自已也不知道写的是些什么东东,可是又不想在C上花费太多时间.  
  想马上转C++又不想半途而废!!苦恼啊苦恼!!各位给我想个方好吗?Top

6 楼wjzhuang(程序猪)回复于 2001-04-24 23:18:00 得分 0

明天再看!Top

7 楼ddt2000(尘土飞扬)回复于 2001-04-25 17:22:00 得分 0

对不起!!!Top

8 楼ddszhan(高等数学)回复于 2001-04-25 19:07:00 得分 0

慢慢来,你写的源代码很有创意吗!Top

9 楼cnss(飞碟)回复于 2001-04-25 20:18:00 得分 15

好象错不少,连题意都没法完成,我改一下试试  
   
  #include<stdio.h>  
  #include<stdlib.h>  
  #include<time.h>  
  #define   SIZE   21  
   
  int   rollDice   (void);  
   
  void   main()  
  {  
  int   win[SIZE]={0},   loose[SIZE]={0},   i,   gameStatus,   myPoint,  
  total,   count,   a,   sum;  
  srand(time(NULL));  
  sum=0;  
  for(count=1;   count<=1000;   count++)  
  {  
  total=rollDice();//第一次投掷  
  sum++;  
  switch(total)  
  {  
  case   7:   case   11://第一次就赢了  
  gameStatus=1;  
  win[0]++;  
  continue;  
   
  case   2:   case   3:   case   12://第一次就输了  
  gameStatus=2;  
  loose[0]++;  
  continue;  
   
  default://记下点数  
  gameStatus=0;  
  myPoint=total;  
  //printf("%d",   myPoint);  
  }  
  i=0;  
  while(gameStatus==0)  
  {  
  i++;  
  total=rollDice();  
  sum++;  
  if   (total==myPoint)  
  {  
  gameStatus=1;  
  if(i<20)  
  win[i]++;  
  else   if(i>=20)  
  win[20]++;  
  }  
  else   if   (total==7)  
  {  
  gameStatus=2;  
  if(i<20)  
  loose[i]++;  
  else   if(i>=20)  
  loose[20]++;  
  }  
  }  
  }  
  for(a=0;   a<=SIZE-1;   a++)  
  {  
  if(a>=20)  
  {  
  printf("win   over   20:%4d     ",   win[a]);  
  printf("loose   over   20:%4d     ",   loose[a]);  
  }  
  else  
  {  
  printf("win[%d]:%4d     ",   a+1,   win[a]);  
  printf("loose[%d]:%4d     ",   a+1,   loose[a]);  
  }  
  }  
  printf("\nThe   average   is:%f",   (float)sum/1000);  
  }  
   
  int   rollDice   (void)  
  {  
  return   2+rand()%6+rand()%6;  
  }Top

10 楼cnss(飞碟)回复于 2001-04-25 20:27:00 得分 0

最后两个问题:不会,胜率总是49%左右Top

11 楼RainWindy(风雨交加)回复于 2001-04-25 22:24:00 得分 10

#include   <stdio.h>  
  #include   <string.h>  
  #include   <stdlib.h>  
  #include   <dos.h>  
  #include   <time.h>  
  #define   FAIL                 0                       //   失败  
  class   Game  
  {  
          private:  
                  long         lAccount;       //   游戏试玩次数  
   
                  long         lSuccess;     //   成功次数  
  long         lFailed;       //   失败次数  
   
          public:  
                  long         array[21];     //   存放是在第几次赢的次数  
                  Game(long   lNum){lAccount   =   lNum;   lSuccess   =   lFailed   =   0;   memset(   array,   0,   sizeof(long)   *   21   );};     //   构造函数  
                  void         Run();             //   主运行函数  
                  short       GetRand();     //   取随机点数  
                  short       Account();     //   进行一次输赢的函数,返回在第几次赢,返回0是输  
                  void         Disp();           //   输出结果  
  };  
   
  void         Game::Run()  
  {  
          long         i;  
          short       nDots;  
          short       nPos;  
          for(   i   =   0l;   i   <   lAccount;   i++)  
          {  
                  nPos   =   Account();  
                  if(   nPos   ==   FAIL   )  
  lFailed++;  
                  else  
                  {  
                          lSuccess++;  
                          if(   nPos   >   20   )         //   在二十次后  
                                  array[20]++;  
                          else  
                                  array[nPos   -   1]++;  
                  }  
          }  
  }  
   
  short       Game::GetRand()  
  {  
          short   nDots   =   0;  
          nDots   =   rand()%6   +   1;  
          nDots   +=   rand()%6   +   1;  
          return   nDots;  
  }  
   
  short       Game::Account()  
  {  
          short   i   =   0;         //   第一次掷骰子  
          short   nDots   =   GetRand();  
          short   nSuccNum   =   0;  
          switch(   nDots   )  
          {  
                  case   7:  
                  case   11:  
                          return   1;       //   Succ  
                  case   2:  
                  case   3:  
                  case   12:  
                          return   0;       //   Fail  
                  default:  
                  {  
                          nSuccNum   =   nDots;  
                          break;  
                  }  
          }  
  for(   i   =   1;   i   <   lAccount;   i++   )           //   查找下一个成功的时候  
          {  
                  nDots   =   GetRand();  
                  if(   nDots   ==   nSuccNum   )   //   成功  
                          return   i   +   1;       //   Succ  
                  else   if(   nDots   ==   7   )  
                          return   0;               //   Fail;  
          }  
  }  
   
  void         Game::Disp()  
  {  
          short   i   =   0;  
          printf(   "\nTotal   Account:%lu",   lAccount);  
          for(i   =   0;   i   <   21   &&   i   <   lAccount;   i++)  
                  printf(   "\nSuccess   At   %2d   Account:%8lu",   i   +   1,   array[i]);  
          printf(   "\nThe   Rate   of   uccess:%.2f",   (double)lSuccess   /   lAccount);  
  }  
   
  void         main(short   argv,   char   *argc[])  
  {  
          long         Account   =   1000l;  
          unsigned   long   timerptr   =   (unsigned   long)(time(NULL)   *   18.2   );  
          timerptr   %=   0xffff;  
          srand(timerptr);  
          if(argv   >   1)  
                  Account   =   atol(argc[1]);  
          if(Account   <   10l   )  
                  Account   =   10;  
  //Account   =   2;  
  //for(   long   i   =   0   ;   i   <   20;   i++)  
  //{  
          Game   TGame(Account);  
          TGame.Run();  
          TGame.Disp();  
  //         Account   *=   2;  
  //         if(   Account   >=   0x7fffffff)  
  //                 break;  
  //         printf("\n\n");  
  //}  
  }Top

12 楼lxas(八云)回复于 2001-04-25 23:59:00 得分 0

谢谢各位了,不过RainWindy()的因为我还没学C++所以不大看得懂。我会好好珍藏的,等到学了  
  C++在慢慢研究!!Top

13 楼lxas(八云)回复于 2001-04-26 00:03:00 得分 0

我觉得程序里面太多if……else……,程序能不能精简一点啊?各位。Top

14 楼RainWindy(风雨交加)回复于 2001-04-26 15:23:00 得分 0

To:lxas  
  如果人生没有了选择而只是一条直线地发展,那将是什么样的世界呢!  
  现代程序不是说趆简单趆好,而是要从可读性和资源利用来考虑。Top

15 楼RainWindy(风雨交加)回复于 2001-04-26 15:23:00 得分 0

To:lxas  
  如果人生没有了选择而只是一条直线地发展,那将是什么样的世界呢!  
  现代程序不是说趆简单趆好,而是要从可读性和资源利用来考虑。Top

16 楼lxas(八云)回复于 2001-04-27 14:56:00 得分 0

收到!!  
   
  Top

17 楼ddt2000(尘土飞扬)回复于 2001-04-30 18:23:00 得分 0

这属于《概率论》范畴的问题,  
  为什么用c语言写成这样Top

18 楼hp1200(我是菜鸟,请多指教。)回复于 2001-07-29 18:07:29 得分 0

upTop

相关问题

  • 送分了,C#里怎么声明Point类型的数组?
  • 数组分析.
  • 简单数组问题,等于送分!
  • 初学乍练C#,关于锯齿数组空间分配?
  • C++数组问题多多,分数多多!菜鸟勿扰!
  • 各位大哥,关于C++动态分配数组的问题?
  • c动态数组问题——解决==满分赠!谢谢!
  • C#中指针与数组的问题 (高分求助)
  • 在C语言中如何动态分配二维数组?
  • a b c d 四个数组,

关键词

  • 函数
  • 游戏
  • game
  • ndots
  • 掷骰子
  • loose
  • gamestatus
  • 游戏者
  • rolldice
  • getrand

得分解答快速导航

  • 帖主:lxas
  • cnss
  • RainWindy

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo