扑克随机发牌

Q:http://zhidao.baidu.com/question/42036677.html
  
A:
  功能:
   1、可选是否包含大小王
   2、可选发牌列数
   3、避免使用大数组,为此付出的代价是多一层循环。
   4、便于扩展,比如可以扩展到10种花色的扑克(^_^),两副牌等等。
  
  调试环境:VC6+WinXP,Win-TC2+WinXP
  随机算法部分来源于本空间的“猜扑克问题
  
  代码如下,转载请注明出处(http://hi.baidu.com/crazycola):
  
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

#define WITH_JOKER 0 // 是否包含大王、小王
#define COLUMN 4    // 发牌的列(堆)数

void main( void )
{
    int i1, j, total;
    int *iArr;
    int tag = 0;
    char* pok_C[] = { "黑桃", "红桃", "梅花", "方块" };
    char* pok_N[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };

    total = (WITH_JOKER)?54:52;
    srand( (unsigned)time( NULL ) );
    iArr = (int*)malloc(total*sizeof(int));

    for( i1=0; i1<total; i1++ )
    {
        iArr[i1]=rand()%total;
        if( i1==0 ) continue;
        do {
            tag = 0;
            for( j=0; j<i1; j++ )
                if( iArr[j] == iArr[i1] )
                {
                    iArr[i1]=rand()%total;
                    tag = 1;
                }
        } while( tag==1 );
    }

    for( i1=0; i1<total; i1++ )
    {
        switch(iArr[i1])
        {
            case 53: printf("JokerB\t"); break; // 大王
            case 52: printf("JokerA\t"); break; // 小王
            default: printf("%s%s\t",pok_C[iArr[i1]%4],pok_N[iArr[i1]%13]); break;
        }
        if(i1%(COLUMN)==((COLUMN)-1)) printf("\n");
    }

    free(iArr);

}

posted @ 2009-07-01 16:24  Owen Wilson  阅读(282)  评论(0编辑  收藏  举报