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