#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();
}
正文
随机发牌程序2006-09-24 09:59:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/wangsdong/18720.html
阅读(5865) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论