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




