c语言模拟扑克牌自动发牌
时间: 2023-07-09 17:26:16 浏览: 204
扑克牌发牌程序
5星 · 资源好评率100%
好的,为了模拟扑克牌自动发牌,我们需要定义一个扑克牌的结构体,以及一个存放所有扑克牌的数组。以下是一份简单的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CARD_NUM 52
/* 扑克牌结构体 */
struct card {
int rank; // 牌面大小,2~10表示2~10,11表示J,12表示Q,13表示K,14表示A
char suit; // 花色,'S'表示黑桃,'H'表示红心,'D'表示方块,'C'表示梅花
};
/* 初始化扑克牌,将52张牌加入到cards数组中 */
void init_cards(struct card *cards)
{
int i, j;
for (i = 0; i < 4; ++i) {
for (j = 2; j <= 14; ++j) {
cards[i * 13 + j - 2].rank = j;
switch (i) {
case 0:
cards[i * 13 + j - 2].suit = 'S';
break;
case 1:
cards[i * 13 + j - 2].suit = 'H';
break;
case 2:
cards[i * 13 + j - 2].suit = 'D';
break;
case 3:
cards[i * 13 + j - 2].suit = 'C';
break;
default:
break;
}
}
}
}
/* 随机洗牌,打乱cards数组中的牌 */
void shuffle_cards(struct card *cards)
{
int i, j;
struct card temp;
srand(time(NULL)); // 以当前时间作为随机数种子
for (i = CARD_NUM - 1; i > 0; --i) {
j = rand() % (i + 1); // 生成0~i之间的随机数
temp = cards[i];
cards[i] = cards[j];
cards[j] = temp;
}
}
/* 发牌,从cards数组中摸n张牌,存放到hand数组中 */
void deal_cards(struct card *cards, int n, struct card *hand)
{
int i;
for (i = 0; i < n; ++i) {
hand[i] = cards[CARD_NUM - i - 1];
}
}
/* 打印牌面,将card结构体转换为字符串输出 */
void print_card(struct card c)
{
if (c.rank >= 2 && c.rank <= 10) {
printf("%d%c ", c.rank, c.suit);
} else {
switch (c.rank) {
case 11:
printf("J%c ", c.suit);
break;
case 12:
printf("Q%c ", c.suit);
break;
case 13:
printf("K%c ", c.suit);
break;
case 14:
printf("A%c ", c.suit);
break;
default:
break;
}
}
}
/* 打印手牌,将hand数组中的所有牌打印出来 */
void print_hand(struct card *hand, int n)
{
int i;
for (i = 0; i < n; ++i) {
print_card(hand[i]);
}
printf("\n");
}
int main()
{
struct card cards[CARD_NUM];
struct card hand[5];
init_cards(cards);
shuffle_cards(cards);
deal_cards(cards, 5, hand);
print_hand(hand, 5);
return 0;
}
```
这份代码定义了一个扑克牌的结构体,包含了牌面大小和花色两个属性;并定义了初始化牌、洗牌、发牌、打印牌面等函数。在主函数中,我们初始化52张牌,随机洗牌,发5张牌给手牌,最后打印手牌。
在运行程序时,每次输出的手牌都是不同的,因为我们使用了随机数生成器来打乱牌的顺序。
阅读全文