求解发牌算法!
题目是这样的:
用C语言编写一段程序:现有一副出去大小王的牌共52张,将这副牌随即发给四个玩家,并打印出来。现有一个random函数产生一个0到1之间的小数可以调用。
谢谢指教!
问题点数:20、回复次数:6Top
1 楼fangrk(加把油,伙计!)回复于 2002-03-25 15:31:49 得分 5
random(52):产生一个int属于[0,51]。
int card[52]初始化全部为0
int cardCount=0;
i=random(52);
如果card[i]==0{
i/4解释为牌号
i%4解释为花色
card[i]=1;
cardCount++;
}
重复循环,直到cardCount==51
效率不高Top
2 楼shornmao(毛豆子[死猫])回复于 2002-03-25 16:21:37 得分 2
按自然递增的顺序初始化整个数组,然后从第一个元素开始,依次与后续元素中的任一个元素(随机产生)交换。Top
3 楼Alex_C(广义上的好人)回复于 2002-03-25 16:29:35 得分 11
/*发牌程序*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
void shuffle(int[][13]);
void deal(const int[][13],const char *[],const char *[]);
main()
{
char *suit[4]={"Hearts","Diamonds","Clubs","Spades"};
char *face[13]={"Ace","Deuce","Three","Four",
"Five","Six","Seven","Eight",
"Nine","Ten","Jack","Queen","King"};
int deck[4][13]={{0}};
srand(time(NULL));
shuffle(deck);
deal(deck,face,suit);
getch();
return 0;
}
void shuffle(int wDeck[][13])
{
int card, row, column;
for (card=1;card<=52;card++){
row=rand()%4;
column=rand()%13;
while (wDeck[row][column]!=0){
row=rand()%4;
column=rand()%13;
}
wDeck[row][column]=card;
}
}
void deal(const int wDeck[][13],const char * wface[],
const char *wSuit[])
{
int card, row,column;
for (card=1;card<=52;card++)
for (row=0;row<=3;row++)
for (column=0;column<=12;column++)
if (wDeck[row][column]==card)
printf ("%5s of %-8s%c",
wface[column],wSuit[row],
card %2==0?"/n":"/t");
}
Top
4 楼missdeer(思鹿)回复于 2002-03-25 18:46:52 得分 2
用一个52个元素的数组,随机取出其中一个元素,然后将该元素与最后的一个交换,再随机取出一个1-51之间的元素,再和倒数第二个元素交换,再取出一个1-50之间的元素,再和倒数第三个元素交换……Top
5 楼fangrk(加把油,伙计!)回复于 2002-03-26 08:28:00 得分 0
missdeer(思鹿) 的方法不错!Top
6 楼lqqchen(李过)回复于 2002-03-26 17:32:03 得分 0
死猫和思鹿的方法是一样的.
都是有效的方法.
你可以拿副牌来模拟这种算法.Top




