当前位置:首页 » 编程软件 » 牌顺编程

牌顺编程

发布时间: 2024-11-24 20:56:23

Ⅰ 扑克牌问题(c语言

其实这是典型的利用链表求解的问题,但是此题用链表的话还需要应用一个长度为13的数组做辅助,所以我直接用数组来进行演示,将在手中的牌进行标记,将放到桌子上的牌进行赋值。
我在很小的时候我的姥爷就曾给我表演过这个魔术,当时我自己用扑克牌弄了将近两个小时才终于知道了这13张牌的顺序是什么,有纤姿兴趣的话你可以自己试一试,很有意思。
下面的代码你可以进行调试来帮助理解整个过程
#include <stdio.h>
void main()
{
int poker[13];//十三张扑克牌
for(int i = 0;i<13;i++)//初始化
poker[i] = 0;//0代表牌还在手中,不为0代表放到了桌子上
int remain = 13;//手中剩余的扑克数
int j = 12;//从最下边开始抽牌
int order = 1;//当order为2时,将此时的牌放到桌子上
int number = 1;//从A开始
while(remain != 0)
{
if(j == -1)
{
j = 12;//返回最后一张牌
continue;
}
if(poker[j] != 0)//如果牌已不在手中,则到下一张牌
{
j--;
continue;
}
if(order == 2)
{
poker[j]= number++;//将扑克赋值
remain--;//手中剩余的牌数减1
order = 1;
continue;
}
order++;
j--;
}
//输出一开始小明手中扑克牌的顺序
for(i = 0; i < 13;i++)
printf("%d ",poker[i]);
}
想要写出一个程序重点在于理解这个过程,只有对这个过程熟悉了旁竖庆才有可能把运握它用代码来演示出来。

Ⅱ 用C语言编程把52个牌(除大小王)随机发给四个人,分开花色和大小顺序

#include<stdlib.h> #include<stdio.h> int comp(const void *j,const void *i); void p(int t,int b[],char n[]); int main(void) { static char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; int a[53],b1[13],b2[13],b3[13],b4[13]; int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i; while(t<=52) /*控制发52张牌*/ { m=rand()%52; /*产生0到51之间的随机数*/ for(flag=1,i=1;i<=t&&flag;i++)/*查找新产生的随机数是否已经存在*/ if(m==a[i]) flag=0; /*flag=1:产生的是新的随机数flag=0:新产生的随机数已经存在*/ if(flag) { a[t++]=m; /*如果产生了新的随机数,则存入数组*/ if(t%4==0) b1[b11++]=a[t-1]; /*根据t的模值,判断当前*/ else if(t%4==1) b2[b22++]=a[t-1]; /*的牌应存入哪个数组中*/ else if(t%4==2) b3[b33++]=a[t-1]; else if(t%4==3) b4[b44++]=a[t-1]; } } qsort(b1,13,sizeof(int),comp); /*将每个人的牌进行排序*/ qsort(b2,13,sizeof(int),comp); qsort(b3,13,sizeof(int),comp); qsort(b4,13,sizeof(int),comp); p(1,b1,n); p(2,b2,n); p(3,b3,n); p(4,b4,n); /*分别打印每个人的牌*/ return 0; } void p(int t,int b[],char n[]) { int i; printf("发给第%d个人的牌\n\006 ",t); /*打印黑桃标记*/ for(i=0;i<13;i++) /*将数组中的值转换为相应的花色*/ if(b[i]/13==0) printf("%c ",n[b[i]%13]); /*该花色对应的牌*/ printf("\n\003 "); /*打印红桃标记*/ for(i=0;i<13;i++) if((b[i]/13)==1) printf("%c ",n[b[i]%13]); printf("\n\004 "); /*打印方块标记*/ for(i=0;i<13;i++) if(b[i]/13==2) printf("%c ",n[b[i]%13]); printf("\n\005 "); /*打印梅花标记*/ for(i=0;i<13;i++) if(b[i]/13==3||b[i]/13==4) printf("%c ",n[b[i]%13]); printf("\n"); } int comp(const void *j,const void *i) /*qsort调用的排序函数*/ { return(*(int*)i-*(int*)j); }

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

#include
#include
#include
#include

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

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

程序就不写了,写下大致流程

//定义一个数组,或者列表,链表什么的随你
//共52个元素 记作card[52]
//card代表扑克牌的类,有花色(color 枚举,0,1,2,3),点数(枚举 A~K)等属性

card tmp;
for(int i=0;i<52;i++)
{
//计算一个0到52之间的随机数x
tmp=card[i];
card[i]=card[x];
card[x]=tmp;//其实就是交换两张牌
}
//循环下来肯定每张牌都被交换过,有它自己的新位置,也有可能凑巧还在原来的位置

//最后按下标顺序分四堆

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

实现了2副牌的发牌,和每个人的牌和底牌
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

struct CARD //牌
{
char suit[10]; /*花色*/
char face[10]; /*牌面*/
};
enum { posA, posB, posC, posD};//定义好每个人的位置
struct Postion
{
struct CARD getcard[25];//每人获得的牌
};
struct Postion postion[4];//分配四个位置

struct CARD leftCard[8]; //底牌
struct CARD card[54]; //54张牌
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","jack","Queen","King"};
/* 函数功能:将52张牌的顺序打乱,
函数参数:结构体数组wCard,表示52张牌
函数返回值:无
*/
void Shuffle(struct CARD *wCard)
{
int i,j;
struct CARD temp;

for (i=0; i<54; i++)
{
j=rand()%54;
temp=wCard[i];
wCard[i]=wCard[j];
wCard[j]=temp;
}
}
/*函数功能:发牌结果
函数参数:结构体数组wCard,表示有54张牌
函数返回值:无
*/
void Deal(struct CARD *wCard)
{
int i,aidx=0,bidx=0,cidx=0,didx=0;

Shuffle(card);//将牌打乱
/*************发第一副牌,只发50张,分别分给A,B,C,D四个位置 4张留底**************/
// 第一次发完50张后,A,B多一张,所以下面第二次让C,D排在前面,两次发完刚好各40张 */
for (i=0; i<50; i++)//发牌数
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==1)
postion[posB].getcard[bidx++]=wCard[i];
else if(i%4==2)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==3)
postion[posD].getcard[didx++]=wCard[i];
}

/**********剩下的四张作为底牌*********/
leftCard[0]=wCard[i++];
leftCard[1]=wCard[i++];
leftCard[2]=wCard[i++];
leftCard[3]=wCard[i++];

Shuffle(card);//再次将牌打乱
/*************发第二副牌,也只发50张,分别分给A,B,C,D四个位置,4张留底,一共8张底**************/
for (i=0; i<50; i++)//发牌数
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==1)
postion[posD].getcard[didx++]=wCard[i];
else if(i%4==2)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==3)
postion[posB].getcard[bidx++]=wCard[i];
}

/**********剩下的四张作为底牌,这样就一共为8张底牌*********/
leftCard[4]=wCard[i++];
leftCard[5]=wCard[i++];
leftCard[6]=wCard[i++];
leftCard[7]=wCard[i++];

}

/* 函数功能:将52张牌按黑桃、红桃、草花、方块花色顺序,面值按A~K顺序排列
函数参数:结构体数组wCard,表示不同花色和面值的52张牌
指针数组wFace,指向面值字符串
指针数组wSuit,指向花色字符串
函数返回值:无
*/
void FillCard(struct CARD wCard[],char *wSuit[], char *wFace[])
{
int i;

for (i=0; i<52; i++)
{
strcpy(wCard[i].suit, wSuit[i/13]);
strcpy(wCard[i].face, wFace[i%13]);
}
// wCard[53].face="Big"; //大小王
strcpy(wCard[52].suit, "Small");
strcpy(wCard[52].face, "ghost");
strcpy(wCard[53].suit, "Big");
strcpy(wCard[53].face, "ghost");
}

void print(char ch)//输出牌
{
int i;
switch(ch)
{
case 'A': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posA].getcard[i].suit, postion[posA].getcard[i].face);
}
break;
case 'B': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posB].getcard[i].suit, postion[posB].getcard[i].face);
}
break;
case 'C': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posC].getcard[i].suit, postion[posC].getcard[i].face);
}
break;
case 'D': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posD].getcard[i].suit, postion[posD].getcard[i].face);
}
break;
}

}

void outputLeftCard()//输出底牌
{
int i;
for(i=0; i<8; i++)
printf("%10s %5s\n", leftCard[i].suit, leftCard[i].face);
}

int main()
{
char pos;
srand(time(NULL));
FillCard(card,suit,face);
//Shuffle(card);
Deal(card);

printf("Please choose your position(A、B、C、D):");
scanf("%c", &pos);
print(pos);//输出你所在位置的牌
/**********下面输出的是,除了你之外其他人的牌**********/
if(pos !='A')
{
printf("A:\n");
print('A');
}
if(pos !='B')
{
printf("B:\n");
print('B');
}
if(pos !='C')
{
printf("C:\n");
print('C');
}
if(pos !='D')
{
printf("D:\n");
print('D');
}

printf("底牌为:\n");
outputLeftCard();//输出底牌

return 0;
}

Ⅵ c++编程,扑克牌洗牌,将一副扑克牌随机洗好,顺序输出54张扑克牌,求完整代码注:用C++写

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <time.h>
using namespace std;

// 输出辅助
const string strtype[6] = {"方块", "梅花", "红心", "黑桃", "小王", "大王"};
const string strnum[14] = {"", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};

struct Card
{
// type是花色,0~3分别表示不同的花色,4是小王,5是大王
// num是牌上的数字
int type, num;
}dat[54];

int main()
{
// 时间随机函数
srand((unsigned)time(NULL));

int cnt = 0;
for (int i = 0; i < 4; i ++)
for (int j = 1; j <= 13; j ++)
{
dat[cnt].type = i;
dat[cnt ++].num = j;
}

dat[cnt ++].type = 4;
dat[cnt ++].type = 5;

for (int i = 1; i < 54; i ++)
// 交换函数,可以证明这样交换出来的数列是随机的
// 这里就不展开了
swap(dat[i], dat[rand() % i]);

// 输出
for (int i = 0; i < 54; i ++)
{
cout << strtype[dat[i].type];
if (dat[i].type < 4) cout << strnum[dat[i].num];
cout << ' ';
}

cout << endl;

system("pause");
}

我测试过啦,运行的一次结果如下(当然是随机的):

方块10 黑桃6 梅花9 红心6 方块J 黑桃A 方块4 梅花3 黑桃K 梅花4 方块K 方块5 方块2
黑桃Q 方块A 红心K 梅花K 黑桃10 红心10 红心3 黑桃2 红心2 黑桃8 小王 方块Q 红心J
梅花6 梅花Q 红心9 方块7 梅花7 方块9 梅花J 红心A 红心4 大王 红心Q 红心8 方块6 黑
桃J 方块8 梅花A 方块3 红心7 黑桃7 梅花10 梅花2 黑桃5 红心5 黑桃3 黑桃9 黑桃4 梅
花5 梅花8
请按任意键继续. . .

希望能够帮到你!

热点内容
编译不能显示 发布:2024-11-24 23:40:52 浏览:698
人体编程 发布:2024-11-24 23:40:51 浏览:304
谜妹缓存的文件在哪 发布:2024-11-24 23:38:12 浏览:145
服务器自动清理缓存 发布:2024-11-24 23:37:14 浏览:662
中国移动网络如何查密码 发布:2024-11-24 23:37:06 浏览:580
计算机数据库试题 发布:2024-11-24 23:30:17 浏览:174
联想云教室连接不上服务器 发布:2024-11-24 23:24:31 浏览:895
七七源码 发布:2024-11-24 22:47:20 浏览:677
请访问其他页面 发布:2024-11-24 22:46:09 浏览:555
爱丢了编程 发布:2024-11-24 22:32:36 浏览:110