我有些工作如何,但我仍然有排序和制作对的问题,以便我可以确定胜利者。
配对它们(对是具有相同值的卡片)。例如,心灵之王&黑桃王牌搭配一对。 我然后计算那些对。最高配对的胜利。
这就是我试图配对的原因,但是我仍然坚持不懈地开始比较以进行配对。
这是我期望结果为每一手牌的方式:
手1: 六个黑桃,是黑色的 七颗钻石,是红色的 八个黑桃,是黑色的 十颗心,是红色的 黑桃皇后,是黑人 对数:0
手2: 三个黑桃,是黑色 五颗钻石,是红色的 五个俱乐部,是黑人 九颗钻石是红色的 钻石女王,是红色的 对数:1 最高配对是:五
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct card {
const char *face;
const char *suit;
const char *color;
};
typedef struct card Card;
typedef unsigned char pairs;
void fillDeck( Card * const, const char *[], const char *[] ,const char *[]);
void shuffle( Card * const );
void print( const Card * const );
pairs findpairs(card *hand); /* finds any pairs in a hand */
int main()
{
int hand,cd,winner;
card hands[5][5],handssorted[5][5];
pairs numpairs[5],highest;
Card deck[52];
const char *face[] = { "Ace", "Two", "Three", "Four", "Five","Six", "Seven",
"Eight", "Nine", "Ten","Jack", "Queen", "King"};
const char *suit[] = { "Hearts", "Diamonds", "Clubs", "Spades"};
const char *color[]= {"Black","Red"};
srand( time( NULL ) );
fillDeck( deck, face, suit, color );
print( deck );
printf("\n ---------------------------------------------------------- \n");
shuffle( deck );
print( deck );
for(cd=0;cd<5;cd++)
{
}
for(hand=0;hand<5;hand++)
{
/* sort the hands here */
numpairs[hand]=findpairs(handssorted[hand]);
printf("Hand %i:\n",hand+1);
/* print the hands here */
/* print the number and value of any pairs here */
}
/* determine the winner and print it */
system("pause");
return 0;
}
//----------------------------------------------------------------------------- void fillDeck( Card * const wDeck, const char * wFace[], const char * wSuit[],
const char * wColor[])
{
int i;
for ( i = 0; i <= 51; i++ ) {
wDeck[i].face = wFace[ i % 13 ];
wDeck[i].suit = wSuit[ i / 13 ];
wDeck[i].color = wColor[i%2];
// if ()
// wDeck[i].suit = wSuit[ i / 13 ];
}
}
//------------------------------------------------------------------
void shuffle( Card * const wDeck )
{
int i, j;
Card temp;
for ( i = 0; i <= 51; i++ ) {
j = rand() % 52;
temp = wDeck[ i ];
wDeck[ i ] = wDeck[ j ];
wDeck[ j ] = temp;
}
}
//---------------------------------
void print( const Card * const wDeck )
{
int i;
for ( i = 0; i <= 51; i++ ){
printf( "\t%s\t of \t%-8s is \t%s \n \t", wDeck[i].face,
wDeck[i].suit,wDeck[i].color,
( i + 1 ) % 2 ? '\t' : '\n' );}
}
//--------------------------------------------------------------------------
pairs findpairs(card *hand)
{
pairs numpairs=0;
for ( int i = 0; i <= 5; i++ ){
if (hand[i].face == )
}
return numpairs;
}
答案 0 :(得分:1)
print(deck)
数组的srand()
之后,您立即致电deck
。numpairs
,findpairs
和handssorted
未定义deck
。这真的是你想要的吗?onst
无效(可能是您的意思const
)fillDeck()
未填写每个.color
Card
成员
print()
中,您使用%c
格式说明符const char *
类型答案 1 :(得分:1)
这不是你问题的答案(我实际上不确定你在问什么),但我会指出你的改组算法不是随机的。
首先,使用%
将rand
限制为一系列值通常是一个坏主意。 (见Q13.16 from the comp.lang.c FAQ。)
其次,看起来您可能正在尝试实施Fisher-Yates shuffling algorithm,但您的实施是错误的。很容易看出你使用以前交换元素进行交换的方法存在问题;考虑改组三个元素{0,1,2}的牌组:
First iteration Second iteration
------------------------------------
{ 0, 1, 2 } { 1, 0, 2 }
{ 0, 1, 2 }
{ 0, 2, 1 }
------------------------------------
{ 1, 0, 2 } { 0, 1, 2 }
{ 1, 0, 2 }
{ 1, 2, 0 }
------------------------------------
{ 2, 1, 0 } { 1, 2, 0 }
{ 2, 1, 0 }
{ 2, 0, 1 }
第一列表示第一次迭代后的牌组的可能状态(您将deck[0]
与deck[rand() % 3]
交换)。
第二列表示第二次迭代后甲板的可能状态(您将deck[1]
与deck[rand() % 3]
交换)。
有9个同样可能的状态---但这显然是错误的,因为应该只有3个! = 6个排列。事实上,有几个州是重复的,这意味着他们有更高的发生概率。 (请注意,即使我已经进行了第三次迭代,你最终只有6个状态的27个状态,并且因为27不能被6整除,所以你最终会看到一些状态比其他状态更多。)
答案 2 :(得分:0)
这是我期望每只手的结果的方式
然后静态分配所需的牌。在你的模型中,每张卡片都有从0到51的唯一编号。如果牌组和手牌都是一组数字,那么操作就像从一组中删除数字并将其添加到另一组中一样简单。
您可能希望实现函数以使用此类int
集合,代表套牌,手牌等。
j = rand()%52;
如果您认真制作游戏,可能需要查看how to generate random numbers from a range too。