C#实现洗牌算法:原理与完整代码示例

追风的人
追风的人
发布时间:2026-10-14| 4人浏览过
原创

本文展示如何使用 C# 实现一个简单的洗牌游戏。通过遍历扑克牌数组并与随机位置的牌交换,模拟真实的洗牌过程,帮助理解数组操作与随机算法在实际编程中的应用。

洗牌游戏的核心逻辑

棋牌类游戏中,"洗牌"是将有序的牌堆打乱成随机顺序的关键步骤。在计算机程序中,这通常涉及两个关键因素:

  1. 面值(Rank):如 A、2、3... K。
  2. 花色(Suit):如红桃、方块、梅花、黑桃。

标准的洗牌算法(如 Fisher-Yates Shuffle 的简化版)原理是:遍历数组中的每一个位置,生成一个随机索引,然后交换当前位置与随机索引位置的元素。这样能确保每张牌出现在任意位置的概率大致均等。

C# 代码实现步骤

第1步:定义扑克牌数据结构

首先创建一个 Card 类来封装牌的面值和花色,并重写 ToString() 方法以便打印输出。

public class Card
{
  private string mianzhi;
  private string leixin;
  
  public Card(string m, string l)
  {
    mianzhi = m;
    leixin = l;
  }
  
  public override string ToString()
  {
    return leixin + " " + mianzhi;
  }
}

第2步:初始化52张牌

在 Program 类中,定义存储所有牌的数组以及面值与花色的字符串数组。通过循环组合生成52张牌。

class Program
{
  private static Card[] allCards = new Card[52];
  private static string[] ms = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
  private static string[] ls = { "红桃", "方块", "梅花", "黑桃" };
  
  private static void Init()
  {
    for (int i = 0; i < allCards.Length; i++)
    {
      // 利用模运算自动循环面值和花色
      allCards[i] = new Card(ms[i % 13], ls[i % 4]);
    }
  }
}

第3步:实现洗牌算法

这是核心部分。使用 System.Random 生成随机数,遍历数组并交换元素。

  private static void Shuffle()
  {
    Random r = new Random();
    Card tempCard;
    // 依次遍历每个位置
    for (int i = 0; i < allCards.Length; i++)
    {
      // 生成 0 到 51 之间的随机索引
      int ran = r.Next(52);
      
      // 执行交换操作
      tempCard = allCards[i];
      allCards[i] = allCards[ran];
      allCards[ran] = tempCard;
    }
  }

第4步:显示结果与主程序入口

添加辅助方法用于打印牌面,并在 Main 方法中按顺序调用初始化和洗牌功能。

  private static void ShowAllCards()
  {
    foreach (var item in allCards)
    {
      Console.Write(item.ToString() + " ");
    }
    Console.WriteLine(); // 换行
  }

  static void Main(string[] args)
  {
    // 1. 初始化
    Init();
    Console.WriteLine("--- 初始化顺序 ---");
    ShowAllCards();
    
    Console.WriteLine("\r\n--- 洗牌后顺序 ---");
    // 2. 洗牌
    Shuffle();
    
    // 3. 显示洗牌结果
    ShowAllCards();
    
    Console.ReadKey();
  }

运行结果验证

程序运行时,首先会打印出按顺序排列的52张牌,随后打印洗牌后的随机序列。洗牌后的序列看起来无序且每次运行结果不同,即表示算法生效。

上述代码展示了如何在控制台环境中处理集合数据。虽然这是一个简化的示例,但它涵盖了面向对象的基本概念(类、属性)、数组操作、随机数生成以及基本的交换算法。实际应用中,可以使用更优化的洗牌库或算法(如标准 Fisher-Yates 算法),但核心思想一致。

以上就是 C# 实现洗牌算法的详细内容,更多关于 C# 基础编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。