c语言扑克牌排序

codeblocks编译能通过的程序。。
codeblocks 没有编译器,都是自己添加的。

你这题也没说明白,怎么输入一张牌。 比如花色怎么表示,点数怎么表示.

定义一个扑克牌结构体。
struct Jack
{
int num; //点数。

char c; //用于显示的符号 。把输入的J,K 转换为num值为11,13. 其他类似。

int color; //花色 方块,梅花,红桃,黑桃。 分别为 0 ,1,2,3,

};

bool cmp( Jack a ,Jack b) // a>b 返回true . 否则返回false;
{
if(a.num > b.num ) return true;

if(a.num< b.num) return false;

if( a.color > b.color ) return ture ;

return false;

}

排序什么的,随便什么算法都可以了,遇到要比较的,就调用cmp这个函数。

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

❸ C语言:52张扑克牌问题

调试抄好,答案是7张

#include<stdio.h>
main()
{
int pk[53],i,j,count;
for(i=1;i<=52;i++)
pk[i]=0;/*0 up*/
for(i=2;i<=52;i++)
{
for(j=i;j<=52;j++)
if(j%i==0)
if(pk[j]==0)pk[j]=1;
else pk[j]=0;
}
count=0;
for(i=1;i<=52;i++)
if(pk[i]==0) count++;

printf("%d",count);
}

❹ 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语言编写纸牌发牌程序

发牌原程序见我的空间(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);

}

❻ c语言扑克牌

  1. 定义个字符数组,存放A-K牌面的字母 char ch[][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

  2. 牌的大小从A-K分别为 0-12

  3. 在输出牌的牌面字符时,输出ch数据中牌面值下标的字符串。如某牌数值是9,输出时如下:

    printf("%s", ch[9]);

  4. “%d\%c”是格式输出字符串,表示要输出一个整数(%d)一个字符(%c) ,后面的两个参数分别是整数,字符,和格式化字符串相对应。是转义符,对于要输出特殊字符时,需要在前面加上,比如输出时,就写成\;再如 " ,应写成";输出换行写成 ,输出回车写成 等。在这个题目中,和后面的%构不成特殊字符转义,所以不输出,删掉它也是一样的。

❼ 扑克牌问题(C语言)

/*
小明刚学会一个魔术:有 13 张扑克牌,,2,3,4,5,6,7,8,9,10,J,Q,K;
他先把扑克牌按他预先设计的方法排序;
只见他从下边拿出一张放到最上面,又从最下边拿出一张放到桌上是A;
然后又从下边拿出一张放到最上面,又从最下边拿出一张放到桌上是2;
……
依此类推,直到手里只有一张牌,翻开放到桌上正好为K。
求一开始小明手中扑克牌的顺序,要求用C语言编程。
*/
//其实,编写这个小程序,用不着链表,也不用熟悉游戏的过程,
//只要把顺序放在桌子上的扑克牌,按照前面所说的次序,反着次序收到手上即可。
//程序如下:

#include <stdio.h>
void main()
{
int on_t[13] = {13,12,11,10,9,8,7,6,5,4,3,2,1};//在桌上先摆好扑克牌.
int in_h[13] = {0}; //手上有十三张“空的”扑克牌.
int i, j;
for(i = 0; i < 13; i++) { //把桌上的逐张收到手上来.
for(j = i + 1; j >= 0; j--) in_h[j + 1] = in_h[j]; //先把手上的下移,腾出最上面的空.
in_h[0] = on_t[i]; //从桌子上拿一张,放到手上的最上面.
for(j = i + 1; j >= 0; j--) in_h[j + 1] = in_h[j]; //再把手上的下移,腾出最上面的空.
in_h[0] = in_h[i + 1]; //再把手上最下面的,移到最上面.
}
for(i = 0; i < 13; i++) printf("%d ", in_h[12 - i]);//输出.
}

程序执行后,显示出如下的数字序列:
10 6 13 5 9 4 11 3 8 2 12 1 7

左边的 10,是最上边的,最右边的 7,是最下边的。

游戏的时候,从最下面拿出 7 放在 10 的上面,再从下面拿出 1(A),放在桌子上;
然后再把下面的 12(Q) 放在最上面的 7 的上面,再从下面拿出 2,放在桌子上;
……
最后,手上最后的应该是 13(K),放在桌上即可。
呵呵,谁有兴趣,来试试这个次序有错没有。

做而论道的这个程序,好像比上边程序略微简单一些,变量,肯定是少了不少。

❽ C语言程序设计课程设计扑克牌游戏,怎么做

#include<conio.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int jisuan(int);
int comptotal;
char s1[]="A234567890JQK";
//char s2[4][5]={"红桃","黑桃","草花","方块"};
char s2[4]={3,4,5,6};
int poke[52];
int ch;
int win=0;
int computer[5],user[5];
int usertotal;
int users;
int k;
int main()
{ void xipai(int poke[]);
void ai();
int i,j;
////////////////////////////////////////////////////////上面是变量和声明
printf("\n这是简单的廿一点游戏:\n");
for(i=0;i<52;i++)
{
if(i%13==0)putchar('\n');
poke[i]=i;
printf("%c%c%c ",s2[i/13],s1[i%13]=='0'?'1':' ',s1[i%13]);
}
putchar('\n');

/////////////////////////////////////////////////////////主代码
k=0;
xipai(poke);
while(ch!=27)
{ comptotal=0;
usertotal=0;
if(k>=42)
{
printf("\n剩余牌数不足十张,重新洗牌");
xipai(poke);
k=0;
}

printf("\n\n\n\n\n\n\n\n新局开始:\n");
printf("现在共有牌%2d张\n",52-k);
if(win==0)
{
computer[0]=k++;
user[0]=k++;
printf("\n电脑做庄,要牌:");
ai();
}
else
{
printf("\n玩家做庄,要牌:\n\t回车要牌\n\t空格过牌");
user[0]=k++;
computer[0]=k++;
}

printf("\n玩家开始要牌:\n");
usertotal=jisuan(poke[user[0]]);
printf("%c%c%c 共%2d点\t",s2[poke[user[0]]/13],s1[poke[user[0]]%13]=='0'?'1':' ',s1[poke[user[0]]%13],usertotal);
users=0;
ch=1;
while(ch!=32&&users<4)
{
ch=getch();
switch(ch)
{
case 27:
goto end;
break;
case 32:
break;
case 13:
user[++users]=k;
usertotal+=jisuan(poke[user[users]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d点\t",s2[poke[k]/13],s1[poke[k]%13]=='0'?'1':' ',s1[poke[k]%13],usertotal);

k++;
if(usertotal>=21)ch=32;
break;
default:
break;
}
}
if(win==1)
{
printf("\n电脑开始要牌:\n");
ai();
}
printf("\n\n\n玩家的点数是%2d",usertotal);
printf("\n电脑的点数是%2d",comptotal);
printf("\n\n本局结算:");
if(comptotal>21&&usertotal<=21)
{
printf("\n\n电脑爆牌了");
win=1;
printf("\n恭喜,你赢了");
}

if(usertotal>21&&comptotal<=21)
{
printf("\n\n你爆牌了");
printf("\n下次小心点");
win=0;
}
if(usertotal>21&&comptotal>21)
{
printf("\n\n你们两个,怎么都这么不小心啊,都撑死了还要吗");
}
if(usertotal<=21&&comptotal<=21)
{
if(usertotal>comptotal)
{
win=1;
printf("\n\n不错,你赢了");
}
else if(usertotal<comptotal)
{
win=0;
printf("\n\n撑死胆大的,饿死胆小的,没胆子,输了吧");
}
else
printf("\n\n平了,算你走运");
}
getch();
}
end:
return 0;
}
void xipai(int poke[])
{
int y,tmp,i,j;
for(j=0;j<7;j++)
for(i=0;i<52;i++)
{
srand(time(0));
y=rand()%10;
tmp=poke[i];
poke[i]=poke[(y*i*i)%52];
poke[(y*i*i)%52]=tmp;
}

}
///////////////////////////////////////////////子函数
void ai()
{
int i;
comptotal=jisuan(poke[computer[0]]);
printf("\n%c%c%c 共%2d点\t",s2[poke[computer[0]]/13],s1[poke[computer[0]]%13]=='0'?'1':' ',s1[poke[computer[0]]%13],comptotal);
for(i=0;i<4;i++)
{
if(comptotal<17)
{
computer[i+1]=k++;
comptotal+=jisuan(poke[computer[i+1]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d点\t",s2[poke[computer[i+1]]/13],s1[poke[computer[i+1]]%13]=='0'?'1':' ',s1[poke[computer[i+1]]%13],comptotal);
}
}
}

int jisuan(int i)
{int dian;
switch(i%13)
{
case 0:
case 10:
case 11:
case 12:
dian=1;
break;
default:
dian=i%13+1;
}
return dian;
}

❾ c语言编程题!!急求!! 关于扑克牌(要完整代码最好有解释)

/*
* File: main.c
* Author: cmpltrtok
*
* Created on 2014年12月12日, 下午3:15
*/

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

/**
* 牌的数据结构。
* type对应花色,值为1到4。
* number对应大小,值为1到13。
* 2的值为1,3的值为2……10的值为9,J的值为10,Q的值为11,K的值为12,A的值为13。
* abs为“数值绝对大小”,由number + (4- type) * 13算出。用来给牌排序。
*/
struct card_structure{
int type;
int number;
int abs;
};
typedef struct card_structure card;

void my_input(char *c1, char *c2);
int my_analyze(char *c, card * cards);
int my_get_type_value(char type);
int my_get_number_value(char number);
void my_get_string(card * cards, char * buffer);
int my_compare (const void *a ,const void *b);
void my_tidy_cards(card * cards);
void my_get_winner(card * player1, card * player2);

/**
* 花色字典:1代表H,2代表S,3代表D,4代表C
*/
char g_types[5] = {' ', 'H', 'S', 'D', 'C'};
/**
* 牌的大小字典:2的值为1,3的值为2……10的值为9,J的值为10,Q的值为11,K的值为12,A的值为13。
* 注意!10由于是两个字符,所以用T代替。
*/
char g_numbers[14] = {' ', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};

/*
*
*/
int main(int argc, char** argv) {
char c1[20];/*字符数组1,存放玩家1的牌的字符串*/
char c2[20];/*字符数组2,存放玩家2的牌的字符串*/
my_input(c1, c2);/*输入牌*/
card player1[3];/*玩家1的牌的数组*/
card player2[3];/*玩家2的牌的数组*/
int result;
result = my_analyze(c1, player1);/*分析玩家1的牌的字符串,放入玩家1的牌的数组*/
if(!result){
printf("Player 1's card input Error!");
return -1;
}
result = my_analyze(c2, player2);/*分析玩家2的牌的字符串,放入玩家2的牌的数组*/
if(!result){
printf("Player 2's card input Error!");
return -1;
}
my_tidy_cards(player1);/*玩家1的牌按花色和大小排序*/
my_tidy_cards(player2);/*玩家2的牌按花色和大小排序*/
my_get_winner(player1, player2);/*判断赢家,并显示输出。*/
char s1[20];/*整理后的牌的字符串表示*/
char s2[20];
my_get_string(player1, s1);/*将玩家牌的数组转换为字符串。*/
my_get_string(player2, s2);
printf("A: %s\nB: %s\n", s1, s2);/*输出排序后的牌*/
return 0;
}

/**
* 让用户用键盘输入两个字符串到c1和c2两个字符数组。
* 作为玩家1和玩家2的牌。
* @param c1 char *
* @param c2 char *
*/
void my_input(char *c1, char * c2){
printf("Please input player 1's cards:\n");
gets(c1);
printf("Please input player 2's cards:\n");
gets(c2);
}

/**
* 将牌的字符串分析成数据结构
* @param c char * 牌的字符串
* @param cards card * 分析后的牌的数据结构地址
* @return int 1表示分析成功,0表示输入有误,分析失败。
*/
int my_analyze(char *c, card * cards){
int len = strlen(c);
int pos = 0;
int count = 0;
while(1){
if(pos + 1 > len - 1){
return 0;
}
char type_name = c[pos];
char number_name = c[pos + 1];
char number_name2 = c[pos + 2];/*这个可能是空格,也可能是大小为10的牌的号码10的那个0。*/
int type_value = my_get_type_value(type_name);
if(!type_value){
return 0;
}
int number_value = 0;
if('0' != number_name2){
number_value = my_get_number_value(number_name);
if(!number_value){
return 0;
}
pos += 3;
}else if('0' == number_name2 && '1' == number_name){
number_value = my_get_number_value('T');
pos += 4;
}else{
return 0;
}
cards[count].type = type_value;
cards[count].number = number_value;
cards[count].abs = number_value + (4 - type_value) * 13;
int j = 0;
for(;j < count; j ++){ /* 不允许有重复的牌 */
if(cards[j].abs == cards[count].abs){
return 0;
}
}
count ++;
if(count >= 3){
return 1;
}
}
}

/**
* 按花色获取值
* @param type char 花色字符。H、S、D或C。
* @return int 0到4。0代表错误,1代表H,2代表S,3代表D,4代表C。
*/
int my_get_type_value(char type){
type = toupper(type);
int len = sizeof(g_types) / sizeof(char);
int i;
for(i = 1; i < len; i ++){
if(g_types[i] == type){
return i;
}
}
return 0;
}

/**
* 按牌的大小获取值
* @param number char 牌的大小字符。2、3、4、……10、J、Q、K或A。注意!10由于是两个字符,所以用T代替。
* @return int 0到13。0代表错误。2的值为1,3的值为2……10的值为9,J的值为10,Q的值为11,K的值为12,A的值为13。
*/
int my_get_number_value(char number){
number = toupper(number);
int len = sizeof(g_numbers) / sizeof(char);
int i;
for(i = 1; i < len; i ++){
if(g_numbers[i] == number){
return i;
}
}
return 0;
}

/**
* 将牌的数据结构变为字符串。
* @param cards card * 牌的数据结构。
* @param buffer char * 字符输出缓存。
*/
void my_get_string(card * cards, char * buffer){
int i = 0;
int pos = 0;
for(;i < 3; i ++){
card cd = cards[i];
int type = cd.type;
int number = cd.number;
char type_name = g_types[type];
char number_name = g_numbers[number];
buffer[pos] = type_name;
if('T' == number_name){
buffer[pos + 1] = '1';
buffer[pos + 2] = '0';
buffer[pos + 3] = ' ';
pos += 4;
}else{
buffer[pos + 1] = number_name;
buffer[pos + 2] = ' ';
pos += 3;
}
}
buffer[pos] = 0;
}

/**
* 给牌做排序时要用到的比较函数。
* @param a const void *
* @param b const void *
* @return int
*/
int my_compare (const void *a ,const void *b) {
card *ca=(card * ) a,*cb = (card * )b;
int aa = ca->abs, bb = cb->abs;
if(aa > bb)return -1;/*倒序排列*/
else if(aa == bb) return 0;
else return 1;
}

/**
* 将牌的数组按牌的花色和大小排序。
* @param cards card * 牌的数组首地址
*/
void my_tidy_cards(card * cards){
qsort(cards, 3, sizeof(card), my_compare);
}

/**
* 判断赢家,并做显示输出。
* @param player1 card * 玩家1的牌的数组的首地址
* @param palyer2 card * 玩家2的牌的数组的首地址
*/
void my_get_winner(card * player1, card * player2){
int i = 0;
int v1, v2;
for(;i < 3; i ++){
v1 = player1[i].abs;
v2 = player2[i].abs;
if(v1 > v2){
printf("Winner is A!\n");
return;
}else if(v1 == v2){
continue;
}else{
printf("Winner is B!\n");
return;
}
}
printf("Winner is X!\n");
return;
}

❿ C语言编程题:扑克牌排序问题

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

typedefstructcard{
;//type0:梅花,1:方片,2:红桃,3:黑桃,4:王
intpoint;//type=0--3时,point=2--14,type=4时,point=0--1
}CARD;

voidsort(CARDa[],intn){
inti,j,k;
CARDt;
for(i=0;i<n-1;++i){
k=i;
for(j=i+1;j<n;++j){
if(a[k].point>a[j].point)
k=j;
}
if(k!=i){
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
}

voidshow(CARDa[],intn){
inti;
chartype[4][5]={"梅花","方片","红桃","黑桃"};
charpoint[]="JQKA";
for(i=0;i<n;++i){
if(a[i].type>=0&&a[i].type<=3){
printf("%s",type[a[i].type]);
if(a[i].point<11)printf("%d",a[i].point);
elseprintf("%c",point[a[i].point-11]);
}
else{
if(a[i].point)printf("大王");
elseprintf("小王");
}
}
printf(" ");
}

intHas(CARDa[],intn,CARDCard){
inti;
for(i=0;i<n;++i){
if(a[i].type==Card.type&&a[i].point==Card.point)
return1;
}
return0;
}

intmain(){
CARDarr[5],t;
inti,n=5,m;
srand((unsigned)time(NULL));
for(i=0;i<n;++i){
t.type=rand()%5;
if(t.type==4)t.point=rand()%2;
elset.point=rand()%13+2;
if(Has(arr,i,t))--i;
elsearr[i]=t;
}
m=n;
for(i=0;i<m;++i){//如果有大王,则排在最后
if(arr[i].type==4&&arr[i].point){
t=arr[i];
arr[i]=arr[m-1];
arr[m-1]=t;
--m;
}
}
for(i=0;i<m;++i){//如果有小王,也排在最后
if(arr[i].type==4){
t=arr[i];
arr[i]=arr[m-1];
arr[m-1]=t;
--m;
}
}
sort(arr,m);
show(arr,n);
return0;
}