當前位置:首頁 » 編程軟體 » 牌順編程

牌順編程

發布時間: 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:24:31 瀏覽:894
七七源碼 發布:2024-11-24 22:47:20 瀏覽:676
請訪問其他頁面 發布:2024-11-24 22:46:09 瀏覽:555
愛丟了編程 發布:2024-11-24 22:32:36 瀏覽:109
linux分割行 發布:2024-11-24 22:11:02 瀏覽:577
獲取ftp文件 發布:2024-11-24 21:54:20 瀏覽:521
資源平滑演算法 發布:2024-11-24 21:54:18 瀏覽:58
vs和vc編譯器哪個好使 發布:2024-11-24 21:54:07 瀏覽:805
愛課程適用於什麼安卓系統 發布:2024-11-24 21:54:02 瀏覽:39
51單片機編譯 發布:2024-11-24 21:50:05 瀏覽:367