导航:首页 > 编程知识 > c编程怎么发牌

c编程怎么发牌

发布时间:2025-01-01 09:23:44

A. C语言编程——发牌洗牌模拟,求帮助

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define SUIT 52
#define HALF 26
#define COLOR ((char)13)

// 扑克牌的编码是一组13进制的数据,从0编到51
// 函数tell用于解释编码的内容
int tell(char card, char * description)
{
char i=0, j=0;
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","Jack","Queen","King"};
//题干比较奇怪,要求扣8张底牌,但是含大小王。正确的规则应该是不含大小王的情况下扣8张牌,每人11张牌就对了
//否则应该扣10张牌或者6张牌,否则每人发牌得到的牌数不相同(不是4的倍数)
//如需要,可自行定义JB=52,JA=53,SUIT=54,HALF=27即可。
//if (card > JB || card < 0 || !description) return 0;
//if (card == JB) { sprintf(description, "Big Joker"); return 1; }
//if (card == JA) { sprintf(description, "Little Joker"); return 1; }
i = card / COLOR; j = card % COLOR;
sprintf(description, "%s %s", suit[i], face[j]);
return 1;
}

//初始化牌,形成一个顺序牌
int init(char *poker)
{
char i = 0;
if (!poker) return 0;
for (i=0; i<SUIT; i++) poker[i]=i;
srand((unsigned)time(0));
return 1;
}

//洗牌,将当前牌分成上下两组,然后交叉,有右手先和左手先两种可能,这一个是左手先交换法
int wash_left_hand(char *poker)
{
char i=0, j=0, k=0;
char boker[SUIT];
if(!poker) return 0;
for(i=0; i<HALF; i++) {
j = i * 2; //上半组
boker[j] = poker[i];
k = i + HALF; //下半组
boker[j+1]=poker[k];
}//next i
memcpy(poker, boker, SUIT);
return 1;
}

//洗牌,将当前牌分成上下两组,然后交叉,有右手先和左手先两种可能,这一个是右手先交换法
//注意左右手先后顺序的区别在于变量j的奇偶变化
int wash_right_hand(char *poker)
{
char i=0, j=0, k=0;
char boker[SUIT];
if(!poker) return 0;
for(i=0; i<HALF; i++) {
j = i * 2; //上半组
boker[j+1] = poker[i];
k = i + HALF; //下半组
boker[j]=poker[k];
}//next i
memcpy(poker, boker, SUIT);
return 1;
}

//在当前牌的基础上洗一次牌,主要用随机函数的奇偶性确定用左手洗还是右手洗
int wash_once(char *poker)
{
return rand()%2?wash_left_hand(poker):wash_right_hand(poker);
}

//在当前牌的基础上随机洗若干次牌,至少8次,最多18次
int wash_full(char *poker)
{
int i = 0, j = 0, k = 0;
i = rand() % 10 + 8;
printf("\nTry to wash %d times.\n", i);
for (j=0; j < i ; j++) k+=wash_once(poker);
return k;
}

int main(void)
{
char choice = 0, i = 0, j = 0; char poker[SUIT], card[16];
init(poker);
do {
printf("\n\tWelcome to My Poker Game!\n");
printf("\t0-Wash.\n");
printf("\t1-Show A.\n");
printf("\t2-Show B.\n");
printf("\t3-Show C.\n");
printf("\t4-Show D.\n");
printf("\tany other number-quit.\n");
printf("Your Choice?");
scanf("%d", &choice);
if(choice <0 || choice >4) break;
if(choice ==0) {
wash_full(poker);
continue;
}//end if
i = (choice - 1) * 11; //注意用11张牌,扣8张底牌
printf("His card is...\n");
for(j = i; j<i+11; j++) {
tell(poker[j], card);
printf("%s\t", card);
}//next
printf("\n");
}while(1);
return 0;
}

B. 怎么用c语言模拟写发52张扑克牌,求源码

代码很长 就不打了
思路就是做一个数组
比如
int a[4][13];
代表四个人

然后 1~52 这52个数 代表牌

定义int a[52];
初始化为0 表示牌是否发出去
然后用rand()%52+1获取随机数 如果没发出去的 那么 分配给对应人。

C. C语言,扑克牌发牌程序。要求运用结构体。多谢帮忙^o^

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structPOKE
{
intnum;//小王-1,大王-2,A:1,J:11,Q:12,K:13
intcolor;//黑1,红2,梅3,方4,小王5,大王6
}s[54];

intmain()
{
inti,num,color;
memset(s,0,sizeof(structPOKE)*54);
srand((unsigned)time(0));
i=rand()%54;
s[i].num=-1;//小王
s[i].color=5;
while(1)
{
i=rand()%54;
if(s[i].num==0)
{
s[i].num=-2;//大王
s[i].color=6;
break;
}
}
intcount=2;
while(1)
{
num=rand()%13+1;
color=rand()%4+1;
i=rand()%54;
if(s[i].num==0)
{
s[i].num=num;
s[i].color=color;
count++;
if(count>=54)
{
break;
}
}
}
printf(" 顺序为: ");
for(i=0;i<54;i++)
{
switch(s[i].num)
{
case-1:putchar(1);break;
case-2:putchar(2);break;
case1:putchar('A');break;
case11:putchar('J');break;
case12:putchar('Q');break;
case13:putchar('K');break;
default:printf("%d",s[i].num);
}
switch(s[i].color)
{
case1: putchar(6);break;
case2:putchar(3);break;
case3:putchar(5);break;
case4:putchar(4);break;
default:printf("");
}
printf("");
}
return0;
}

D. C语言斗地主发牌程序,急求,谢谢

我爱吃的水果有很多,而我最爱吃的是葡萄。;;细雨如丝,茂密的葡萄藤贪婪地吮吸着春天的甘露。它们伸展着嫩绿的枝条,一片片掌形的叶子在雨雾中欢笑着。;;;;清明节过后,葡萄藤长出了一粒粒小籽,这就是葡萄花的花苞。过了几天,葡萄花开了,花小小的,白中带有一点黄,像一团团雪花。风把香气吹得四处飘散,引来了一群群辛勤的蜜蜂和翩翩起舞的蝴蝶。我走到葡萄藤下,闻到一阵清香,使人感到心旷神怡。;;;;春末夏初时,葡萄花纷纷凋谢,开花的地方又长出一粒粒小籽,这就是葡萄了。葡萄先是嫩绿色的,上面就像蒙上了一层“白霜”,粉扑扑的。然后渐渐变成紫色,一个个绿中透紫的珍珠,挂在葡萄藤上,闪着诱人的亮光。最后葡萄已经成熟了,一串串亮晶晶、紫红色的葡萄,挂满了葡萄藤,让人真想尝一尝。;;;摘下一颗葡萄,剥去它的表皮,便看见一颗诱人的晶球。把它放进嘴里,舌尖触到葡萄那晶莹透明的果肉,使人感到细腻。没有熟透的葡萄甜中带酸,熟透了就甜滋滋的,叫人越吃越想吃。;;;葡萄不但营养丰富,含有多种维生素,是水果中的佳品,而且还有一定的医药价值。;;;我真喜爱葡萄啊。

E. 如何用c语言编写纸牌发牌程序

发牌原程序见我的空间(http://hi..com/crazycola/blog/item/52402bd4b3f68705a08bb746.html),可选是否包含大小王,可选发牌列数。

以下为改过的版本,不包含大小王(即总数52张),只能发4堆。

另外附加了用户菜单,原程序中不含菜单部分。

代码如下:

---------------------------------------
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

int menu()
{
int choice;
printf("1 发牌/0 退出:");
scanf("%d",&choice);
return choice;
}

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" };

if(!menu()) exit(0);

total = 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++ )
{
printf("%s%s\t",pok_C[iArr[i1]%4],pok_N[iArr[i1]%13]);
if(i1%4==3) printf("\n");
}

free(iArr);

}

F. 如何求C语言扑克牌洗牌发牌,发的牌要从大到小排序,每个部分都要用

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 52 //牌张总数
#define M 13 //每花色张数
char hs[4]={5,4,3,6}; //花色数组:梅花、红心、方块、黑桃字符对应的ASCII码
char hx[]={"JQKA"}; // 对应11,12,13,14共四张大于10的牌符号
//生成顺序扑克牌数组: 1~52,梅花1~13,红心14~26,方块27~39,黑桃40~52

void newDeck(int *a) { int i; for ( i=0;i<N;i++ ) a[i]=i+1; }
//洗牌,将花色和顺序打乱
void Shuffle(int *a) { int s,i,j,t;
srand((unsigned int)time(NULL)); //利用当前时间生成随机数种子
s=rand()%11+5; printf("随机洗牌%d遍\n",s); //第1个随机数当成洗牌次数, 洗牌次数大于等于5,小于等于15
for ( i=0;i<s;i++ ) {
for ( j=0;j<N;j++ ) {
s=rand()%52; //随机数范围0~51,对应a数组下标
t=a[j]; a[j]=a[s]; a[s]=t; //第j张牌和第s张牌交换
}
}
}
//发牌并显示
void Deal(int a[N],int b[4][M]) { int i,j;
for ( i=0;i<4;i++ ) for ( j=0;j<M;j++ ) b[i][j]=a[i*M+j];
}
//理牌
void Collating(int a[4][M]) { int i,j,k,h;
for ( h=0;h<4;h++ )
for ( i=0;i<M-1;i++ )
for ( j=i+1;j<M;j++ )
if ( a[h][i]<a[h][j] ) {
k=a[h][i]; a[h][i]=a[h][j]; a[h][j]=k;
}
}
//显示
void Display(int a[4][M]) { int i,j,s;
for ( i=0;i<4;i++ ) {
for ( j=0;j<M;j++ ) {
s=a[i][j]-1; printf("%c",hs[s/M]);
s%=M; if ( s<9 ) printf("%d ",s+2); else printf("%c ",hx[s-9]);
}
printf("\n");
}
}
void main() { int Deck[N],hands[4][M];
newDeck(Deck); //新扑克牌
Shuffle(Deck); //洗牌
Deal(Deck,hands); //发牌
Collating(hands); //理牌
Display(hands); //显示
printf("\n\n"); system("pause");

}

G. 初学c语言,求一个自动发牌的程序。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
intcard[52];
voidDisplay(inti)//将0~51之间的数映射成牌号和花色
{
switch(i%4)
{
case0:printf("红桃");break;
case1:printf("黑桃");break;
case2:printf("梅花");break;
case3:printf("方块");break;
}
if(i/4+1<11)
printf("%d ",i/4+1);
elseif(i/4+1==11)
printf("%c ",'J');
elseif(i/4+1==12)
printf("%c ",'Q');
elseif(i/4+1==13)
printf("%c ",'K');
}
voidInitCard()
{
inti,j,temp;
srand((int)time(0));
for(i=0;i<52;i++)//随机生成52个数
{
temp=rand()%52;
for(j=0;j<i;j++)
{
if(card[j]==temp)break;
}
if(j==i)card[i]=temp;
elsei--;
}

for(i=0;i<52;i++)//初始化输出
{
if(i%5==0&&i!=0)printf(" ");
Display(card[i]);
}
}
voiddeal()
{
inti,j,temp;
srand((int)time(0));
for(i=0;i<52;i++)
{
temp=rand()%52;
for(j=0;j<i;j++)
{
if(card[j]==temp)break;
}
if(j==i)card[i]=temp;
elsei--;
}

for(i=0;i<52;i++)//发牌输出
{

if(i%5==0&&i!=0)printf(" ");
if(i%13==0&&i!=0)printf(" ");
if(i%13==0)
printf("第%d个玩家的牌: ",i/13+1);

Display(card[i]);
}
}
intmain(void)
{
intkey=0;
printf("================主菜单============== ");//菜单
printf("=============1、初始化扑克========= ");
printf("=============2、洗牌、发牌========= ");
printf("=============3、退出============== ");

while(key!=3)//选择菜单
{
printf("请输入菜单功能编号:");
scanf("%d",&key);

switch(key)
{
case1:InitCard();break;//初始化
case2:deal();//发牌
default:break;
}

printf(" ");
}
return0;
}

代码如上,测试结果:

基本思想就是,只要随机生成的数,发给谁都一样;所以初始化和发牌时候先随机生成52个不同的数0~51,初始化时,直接输出就可以了。发牌时按13一组一次分给一个人就可以了。

H. c语言编程用扑克牌洗牌和发牌

这是洗牌程序,你可以自己修改输出格式。
S,H,D,C 黑桃红桃方块草花
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct card {
int cdhs; //1,2,3,4
int point; //1,2,..13;
} CARD;

CARD cards[52];
void main()
{
int i,j,k,n;
int x[52],y;
int flag[52];
char p[13][5]={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
// char p[13][5]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
// char h[4][5] = {"S","H","D","C"};
char h[4][5] = {"D","C","H","S"};
// char h[4][6] = {'\06','\03','\05','\04'};

for (j=0;j<4;j++){
for (i=0;i<13;i++){
cards[j*13+i].cdhs= j %4 ;
cards[j*13+i].point= i %13;
}};

for (i=0;i<52;i++) flag[i]= -1;
srand((unsigned)time(NULL));
n=0;
while(1) {
y = (int) ( (float)rand() / ((float)(RAND_MAX)) * 53.0);
if (y < 52 && y >= 0) { if ( flag[y] == -1)
{ x[n]=y; flag[y]=1;n++; if (n>=52)break; };
}; // end if
};

for (k=0;k<4;k++)
for (i=0;i<12;i++)
for(j=i;j<13;j++){
if (x[i+k*13]< x[j+k*13]){y=x[i+k*13];x[i+k*13]=x[j+k*13];x[j+k*13]=y;};
}
printf("Person-1: ");
for (i=0;i<13;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\nPerson-2: ");
for (i=13;i<26;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\nPerson-3: ");
for (i=26;i<39;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\nPerson-4: ");
for (i=39;i<52;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\n");
system("pause");
}

阅读全文

与c编程怎么发牌相关的资料

热点内容
网络应用构图 浏览:598
万步有约查看数据如何看处方 浏览:458
福彩3d和值工具下载 浏览:433
连接配置文件不运行如何处理 浏览:893
ev3编程和python编程哪个好 浏览:156
ps中的文件能印刷吗 浏览:880
jsr303spring 浏览:755
qq密码画蝶 浏览:644
液晶电视如何变成网络电视 浏览:612
数控程序的编程方式叫什么 浏览:809
postgresql客户端工具 浏览:627
90版本巨宗武器选择 浏览:822
磁盘填0后文件名 浏览:261
数控8寸4牙怎么编程 浏览:633
修复一个坏道会损坏多少数据 浏览:939
linux时间配置文件 浏览:957
批量申请qq号是真的吗 浏览:970
ps4更新不了系统升级 浏览:140
win10用易升升级有残留 浏览:481
安卓怎么设置移动网络名字 浏览:164

友情链接