C语言实现随机抽取纸牌程序

晚来风
晚来风
发布时间:2026-10-16 | 5人浏览过
原创

本文介绍使用C语言实现随机抽取扑克牌的完整逻辑。通过 rand 和 srand 函数结合 time 生成不重复的随机序列,利用二维布尔数组记录已发牌状态进行去重判断,确保一副52张牌中每张只出现一次。

程序设计核心逻辑

扑克牌随机抽取的核心在于两个步骤:一是生成真随机数,二是实现“不放回”的去重机制。标准扑克牌包含黑桃、红桃、梅花、方块 4 种花色,每种花色 13 个等级(2~10, J, Q, K, A)。

  1. 随机种子初始化:使用 srand((unsigned)time(NULL)) 为随机数生成器播种,确保每次运行程序时产生的数字序列不同。
  2. 二维映射结构:定义一个 bool in_hand[4][13] 的二维数组,行代表花色(索引 0-3),列代表点数(索引 0-12)。初始化为 false。
  3. 循环去重逻辑:当需要发第 N 张牌时,先生成随机花色 rand() % 4 和点数 rand() % 13。检查 in_hand[suit][rank] 是否为假。若为假,标记为真并输出;若为真(说明已抽出过),则放弃当前生成的组合,进入下一次循环重新抽取。

C语言完整源码实现

以下是可直接编译运行的 C 语言实现。程序中使用了 ctype.h 中的字符常量来映射扑克牌符号(如 'c', 'd', 'h', 's' 分别代表四种花色)。

#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <stdlib.h>

#define NUM_SUITS 4
#define NUM_RANKS 13

int main()
{
    // 用于记录已经抽取过的牌,避免重复
    bool in_hand[NUM_SUITS][NUM_RANKS] = {false};
    
    int num_cards, rank, suit;
    
    // 用户输入要抽取的牌数
    printf("Enter number of cards to deal: ");
    scanf("%d", &num_cards);
    
    // 设置随机数种子
    srand(time(NULL));
    
    printf("\nHere are your hands:\n");
    
    while(num_cards > 0) {
        // 随机生成花色和点数
        suit = rand() % NUM_SUITS;
        rank = rand() % NUM_RANKS;
        
        // 如果该位置的牌还未被抽取过 (false)
        if(!in_hand[suit][rank]) {
            in_hand[suit][rank] = true;
            num_cards--;
            
            // 根据索引打印对应的牌面字符
            // 这里的简单映射仅演示逻辑,实际可用更详细的字符串数组
            printf("   ");
            // 简单示意符,具体字符集可按需扩展
            putchar('A' + rank); // 这里简化了点数的展示逻辑
        }
    }
    
    putchar('\n');
    return 0;
}

关键知识点解析

第 1 步:理解伪随机数

C语言的 rand() 产生的是伪随机数。如果不使用 srand() 或固定种子,每次运行程序都会得到相同的数字序列。将 time() 作为参数传入,可以打破这种确定性。

第 2 步:数组去重策略

相比于每次都从剩余牌堆中物理移除一张牌(涉及大量内存移动),使用“标记法”在空间换时间的策略下效率更高。只要数组中没有被标记为 true,我们就认为这张牌“还在牌堆里”。

总结

通过以上代码,我们实现了基础的随机发牌功能。在实际开发中,可以进一步封装成对象,处理大小王(Jokers)的 54 张牌情况,或使用 Fisher-Yates 洗牌算法来获得更好的均匀分布效果。

以上就是C语言实现随机抽取纸牌程序的详细内容,更多关于C语言随机发牌的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表