配对游戏开发问题:如何随机显示52张卡片各两张
Pairs配对游戏卡片显示问题解决指引
你当前的问题核心在于initgame方法里把memoryarray的所有元素都赋值为1,导致GImageArray组件给每个格子加载同一张编号为1的图片,所以所有卡片显示一模一样。要实现随机展示52张内的成对卡片,需要修改数组赋值逻辑,生成包含随机成对编号的二维数组,具体步骤如下:
核心修改思路
- 你的网格是6×6共36个位置,需要18对不同的卡片(从52张中随机选取18个不重复的编号,每个编号出现两次)
- 生成包含成对编号的列表后打乱顺序(洗牌),再填充到二维数组中
- 确保
GImageArray组件能根据数组中的编号正确加载对应图片
代码修改示例
替换原initgame方法的数组赋值逻辑,修改后的代码如下:
public void initgame() { // 计算需要的卡片对数:6×6网格共36个位置,对应18对 int pairCount = memoryarray.GetLength(0) * memoryarray.GetLength(1) / 2; List<int> cardNumbers = new List<int>(); Random random = new Random(); HashSet<int> usedCardIds = new HashSet<int>(); // 从1-52中随机挑选18个不重复的卡片编号,每个编号添加两次 while (usedCardIds.Count < pairCount) { int randomCardId = random.Next(1, 53); // 生成1到52的随机数 if (usedCardIds.Add(randomCardId)) { cardNumbers.Add(randomCardId); cardNumbers.Add(randomCardId); } } // 洗牌:打乱卡片列表的顺序,实现随机分布 for (int i = cardNumbers.Count - 1; i > 0; i--) { int j = random.Next(i + 1); // 交换元素位置 (cardNumbers[i], cardNumbers[j]) = (cardNumbers[j], cardNumbers[i]); } // 将打乱后的卡片编号填充到二维数组中 int currentIndex = 0; for (int row = 0; row < memoryarray.GetLength(0); row++) { for (int col = 0; col < memoryarray.GetLength(1); col++) { memoryarray[row, col] = cardNumbers[currentIndex++]; } } // 初始化图片数组组件 controlarray = new GImageArray(this, memoryarray, 35, 200, 10, 200, 10, imagepath); controlarray.Which_Element_Clicked += new GImageArray.ImageClickedEventHandler(Which_Element_Clicked); }
关键注意事项
- 确保你的
Cards文件夹中存在编号1到52的图片文件(比如1.png、2.png…52.png),如果图片命名规则不同(比如带前缀),需要调整GImageArray内部的图片路径拼接逻辑 - 洗牌步骤用了Fisher-Yates算法,保证随机分布的公平性
- 如果后续要调整网格大小,代码中的
pairCount计算会自动适配,无需手动修改
内容的提问来源于stack exchange,提问作者Harrison 2904
相关产品推荐
相关产品推荐

