正文

随机发牌程序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();}

阅读(13662) | 评论(0)


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

评论

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