正文

随机发牌程序2006-09-24 09:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wangsdong/18720.html

分享到:

#define N 52
#include <graphics.h>
#include <stdlib.h>
void Init(void);/*图形驱动*/
void Close(void);/*图形关闭*/
void Play(void);/*发牌的具体过程*/
void Rand(int i,int j);/*随机发牌函数*/
void Sort();
void DrawPuke(int kind,int x,int y,char num);/*画牌*/
char p[4][13]=
      {{'2','3','4','5','6','7','8','9','0','J','Q','K','A'},
       {'2','3','4','5','6','7','8','9','0','J','Q','K','A'},
       {'2','3','4','5','6','7','8','9','0','J','Q','K','A'},
       {'2','3','4','5','6','7','8','9','0','J','Q','K','A'}};
/*10用0来表示*/
struct Pai
{
   char num;
   char kind;
   int realnum;
   int link;
}newp[52];
/****主函数*****/
void main(void)
{
   Init();/*初始化*/
   Play();
   getch();
   cleardevice(); /*清屏*/
   Sort(); /*排序*/
   Close(); /*关闭*/
   exit(0);
}
/**随机发牌函数,i和j代表行和列,共4行13列*/
void Rand(int i,int j)
{
   int kind,num;
   char n;
   randomize();/*随机种子数*/
   while(1)/*循环条件是可以有牌发为止*/
   {
      kind=random(4);/*生成4以内的随机数*/
      num=random(13); /*生成13以内的随机数*/
      if(p[kind][num]!=-1)/*牌发好以后相应位置的元素置-1*/
      {
     n=p[kind][num];/*从扑克牌中取数*/
     p[kind][num]=-1;
     newp[j*4+i].kind=kind;/*将牌的花色保存*/
     newp[j*4+i].num=n; /*将牌的面值符号保存*/
     newp[j*4+i].realnum=num; /*将牌的对应十进制数值保存*/
     break;
      }
   }
   DrawPuke(kind,i,j,n);/*显示牌*/
}
/*画牌函数,kind花色, i代表行,j代表列,num表示面值符号 */
void DrawPuke(int kind,int i,int j,char num)
{
   char str[3];
   bar(50+j*45-15,50+i*100-30,50+j*45+15,50+i*100+30);/*画空牌*/
   setcolor(BLUE);
   rectangle(50+j*45-13,50+i*100-28,50+j*45+13,50+i*100+28);
   switch(kind)/*花式的判断*/
   {
      case 0:setcolor(BLACK);sprintf(str,"%c",3);break;/* a黑桃*/
      case 1:setcolor(RED);sprintf(str,"%c",3);break;/* ?红心*/
      case 2:setcolor(RED);sprintf(str,"%c",4);break;/* ¨方块*/
      case 3:setcolor(BLACK);sprintf(str,"%c",5);break;/* §草花*/
   }
   settextstyle(0,0,1);
   outtextxy(50+j*45-11,50+i*100-26,str);/*显示牌的左上角花色*/
   outtextxy(50+j*45+5,50+i*100+20,str); /*显示牌的右下角花色*/
   if(num!='0')/*输出其它牌*/
   {
      settextstyle(0,0,2);
      sprintf(str,"%c",num);
      outtextxy(50+j*45-5,50+i*100-5,str);/*显示牌的大小*/
   }
   else/*输出10的时候*/
   {
      sprintf(str,"%d",10);
      outtextxy(50+j*45-6,50+i*100-5,str);
   }
}
void Play(void)/*发牌的具体过程*/
{
   int i,j;
   for(j=0;j<13;j++)
   {
      for(i=0;i<4;i++)
      {
     Rand(i,j);/*随机发牌*/
     delay(10000);/*延时*/
      }
   }
}
/*基数排序*/
void Sort()
{
   int i,j,k,t,p,f[13],e[13];
   for(i=0;i<N;i++) /*将52张牌链起来*/
      newp[i].link=i+1;
   newp[N-1].link=-1;
   for(i=0;i<4;i++)/*初始化队列*/
   {
      f[i]=-1;
      e[i]=0;
   }
   p=0; /*第一次分配*/
   do{
      k=newp[p].kind;
      if(f[k]==-1)
         f[k]=p;
      else
         newp[e[k]].link=p;
      e[k]=p;
      p=newp[p].link;
   }while(p!=-1);
   j=0;  /*第一次收集,将52张牌链接起来*/
   p=f[j];
   t=e[j];
   for(k=j+1;k<4;k++)
   {
      newp[t].link=f[k];
      t=e[k];
   }
   newp[t].link=-1;
   cleardevice();
   for(i=0;i<4;i++) /*输出第一次分配结果*/
   {
      p=f[i];
      for(j=0;j<13;j++)
      {
     DrawPuke(i, i, j,newp[p].num);
     p=newp[p].link;
      }
   }
   getch();
   cleardevice();
   p=f[0];/*保存第一次排序后数据的起始位置,进行第二次分配*/
   for(i=0;i<13;i++)/*初始化队列*/
   {
      f[i]=-1;
      e[i]=0;
   }
   do{
      k=newp[p].realnum;
      if(f[k]==-1)
     f[k]=p;
      else
     newp[e[k]].link=p;
      e[k]=p;
      p=newp[p].link;
   }while(p!=-1);
   j=0;  /*第二次收集,将52张牌链接起来*/
   p=f[j];
   t=e[j];
   for(k=j+1;k<13;k++)
   {
      newp[t].link=f[k];
      t=e[k];
   }
   newp[t].link=-1;
   for(j=0;j<13;j++) /*输出第二次分配结果*/
   {
      p=f[j];
      for(i=0;i<4;i++)
      {
     DrawPuke(i, i, j,newp[p].num);
     p=newp[p].link;
      }
   }
}
/*图形驱动*/
void Init(void)
{
   int gd=DETECT,gm;
   initgraph(&gd,&gm,"c:\\tc");
   cleardevice();
}
/*图形关闭*/
void Close(void)
{
   getch();
   closegraph();
}

阅读(5691) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册