在記憶體中模擬出一副牌,然後模擬洗牌,發牌等動作
流程:構建一副牌儲存到乙個陣列中–>洗牌–>建立玩家–>向玩家發牌–>輸出每個玩家的牌
#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...