模擬撲克牌的洗牌發牌

2021-07-13 17:50:04 字數 2647 閱讀 7781

在記憶體中模擬出一副牌,然後模擬洗牌,發牌等動作

流程:構建一副牌儲存到乙個陣列中–>洗牌–>建立玩家–>向玩家發牌–>輸出每個玩家的牌

#include 

#include

#include

#include

#include

//一副牌的數量

#define card_count 54

//定義撲克的花色, 黑,紅,梅,方,小王 ,大王

enum color;

//定義撲克結構體

typedef

struct card

card;

//定義玩家

typedef

struct player

player;

//分完牌後呼叫的函式的型別

typedef

int (*pcompare)(card*, card*);

//原始一副牌所在的陣列

card pokers[card_count];

//初始化一副牌

void initonepoker()

//剩下的大王和小王

pokers[i].val = i/4 + 1;

pokers[i].color = joker1;

//大王

pokers[i+1].val = i/4 + 2;

pokers[i+1].color = joker2;

}//洗牌,引數是最原始的一副牌,返回洗完後的牌

card** shuffle(card* pokers)

else

}free(pokers2);

//返回洗完牌後的陣列

return retpokers;

}//發牌

//players是玩家陣列,playercount是玩家數量,shuffledcard是洗完後的一副牌

void dispatchcards(player** players, int playercount, card** shuffledcard)

//輪流向每個玩家發牌

for (int i=0; i//取當前玩家

player* curplayer = players[i%playercount];

//向玩家發牌

curplayer->cards[curplayer->cardscount] = shuffledcard[i];

//玩家手中實際的牌數增加

curplayer->cardscount++;

}}//排序函式

//cards是要排序的牌,每一項是牌的指標,cardscount是牌的數量,compare_fun是比較函式

void sortcards(card** cards, int cardscount, pcompare compare_fun)

}if (flag)

break;

}}//比較函式1:先比較點數再比較花色(公升序)

int compare1(card* a, card* b)

}//比較函式2:比較點數再比較花色(降序)

int compare2(card* a, card* b)

}//獲取牌的名字

//返回牌的名字字串,呼叫著用完之後要free()之

char* getcardname(const card* card)

//存放點數名字

char valstr[16] = "";

switch (card->val)

//動態分配足夠的空間

char* ret = (char*)malloc(sizeof(char)*16);

//將兩個字串合併到ret中

sprintf(ret, "%s%s", colorstr, valstr);

return ret;

}//列印玩家手中的牌

void printcard(player** players, int n)

printf("\n");

}}int main()

//把n個放在乙個陣列中,以便傳入發牌函式中

player** players = (player**)malloc(sizeof(player*)*n);

for (int i=0; i//發牌

dispatchcards(players, n, shuffledpokers);

//洗後的牌用完了,釋放掉

free(shuffledpokers);

//列印玩家手中的牌

printcard(players, n);

//釋放玩家手中的牌陣列

for (int i=0; ifree(players[i]->cards);

}//釋放每個玩家所在的陣列

free(players);

players = null;

//釋放每個玩家的資訊

洗牌 發牌演算法 打亂撲克牌順序

洗牌的演算法有很多,這裡主要介紹下幾種主要的演算法。方法一 每次找乙個隨機的位置,然後將這54個數放到找的位置中。步驟 1.用乙個整型陣列記錄各個位置是否已經放置了數,如果放置了則不為0,否則為0。所以在演算法開始的時候,初始化此陣列每個元素的值都為0.2.每次產生乙個0 53之間的數,看這個位置是...

撲克牌模擬

題意 東東有 a b 張撲克牌。每張撲克牌有乙個大小 整數,記為a,範圍區間是 0 到 a 1 和乙個花色 整數,記為b,範圍區間是 0 到 b 1 撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。一手牌 的意思是你手裡有5張不同的牌,這 5 張牌沒有誰在前誰在後的順序之分,它...

撲克牌的隨機發牌程式

乙個撲克牌遊戲 準確的說就是 鬥地主 本來是打算取0 53的隨機數,取過的就做乙個標識,迴圈直至全部完。但是細想一下,效率實在是太低了,最後決定用亂序的方式,感覺還不錯。不知道還有沒有更好的辦法,請大家多多指教!using system using system.collections namesp...