You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# .NET MAUI中存储按钮选择的颜色并与数组对比

解决Mastermind游戏中存储用户颜色选择的问题

首先,你需要在页面类里定义几个核心变量:一个数组存储用户的每一步颜色猜测,一个整数记录当前正在编辑的猜测位置(Mastermind通常是4-6个位置的猜测,这里以4个为例),再加上答案数组用于后续对比。

// 存储用户的颜色猜测,长度可根据游戏规则调整
private Color[] _userGuess = new Color[4];
// 记录当前正在设置颜色的位置索引,从0开始
private int _currentPegIndex = 0;
// 示例答案数组,实际可改为随机生成
private Color[] _answer = new Color[] { Colors.Red, Colors.Blue, Colors.Green, Colors.Yellow };

接下来修改你的点击事件代码,把选中的颜色存入数组对应位置,同时可以自动切换到下一个猜测位置(如果还有剩余位置):

private void TapGestureRecognizer_Tapped_1(object sender, EventArgs e)
{
    BoxView b = (BoxView)sender;
    // 将选中的颜色存入当前索引对应的数组位置
    _userGuess[_currentPegIndex] = b.Color;
    
    // 更新当前显示的peg颜色
    currentGuessPeg.BackgroundColor = b.Color;
    currentGuessPeg.BorderColor = Colors.Transparent;
    GridColourPicker.IsVisible = false;

    // 切换到下一个猜测位置(如果还有未设置的位置)
    if (_currentPegIndex < _userGuess.Length - 1)
    {
        _currentPegIndex++;
        // 这里可以更新currentGuessPeg为下一个要编辑的peg控件
        // 示例:currentGuessPeg = yourGuessGrid.Children[_currentPegIndex] as BoxView;
    }
}

然后添加提交按钮的点击事件,实现猜测与答案的对比逻辑(遵循Mastermind的评分规则:黑色标记=颜色+位置都正确;白色标记=颜色正确但位置错误):

private void SubmitGuess_Clicked(object sender, EventArgs e)
{
    // 先检查用户是否填完所有位置
    if (_currentPegIndex < _userGuess.Length - 1)
    {
        DisplayAlert("提示", "请完成所有位置的颜色选择", "确定");
        return;
    }

    int blackPegs = 0;
    int whitePegs = 0;

    // 创建临时数组避免修改原数组
    Color[] tempAnswer = (Color[])_answer.Clone();
    Color[] tempGuess = (Color[])_userGuess.Clone();

    // 先统计颜色+位置都正确的黑色标记
    for (int i = 0; i < tempAnswer.Length; i++)
    {
        if (tempGuess[i].Equals(tempAnswer[i]))
        {
            blackPegs++;
            tempGuess[i] = Colors.Transparent; // 标记已匹配
            tempAnswer[i] = Colors.Transparent;
        }
    }

    // 再统计颜色正确但位置错误的白色标记
    for (int i = 0; i < tempGuess.Length; i++)
    {
        if (!tempGuess[i].Equals(Colors.Transparent))
        {
            for (int j = 0; j < tempAnswer.Length; j++)
            {
                if (tempGuess[i].Equals(tempAnswer[j]))
                {
                    whitePegs++;
                    tempAnswer[j] = Colors.Transparent;
                    break;
                }
            }
        }
    }

    // 显示本轮猜测结果
    DisplayAlert("猜测结果", $"黑色标记:{blackPegs},白色标记:{whitePegs}", "确定");

    // 判断是否猜对
    if (blackPegs == _answer.Length)
    {
        DisplayAlert("恭喜", "你猜对了!游戏胜利!", "确定");
        ResetGame();
    }
    else
    {
        // 重置状态,准备下一轮猜测
        _currentPegIndex = 0;
        Array.Clear(_userGuess, 0, _userGuess.Length);
        // 重置当前编辑的peg为第一个位置
        // currentGuessPeg = yourGuessGrid.Children[0] as BoxView;
    }
}

// 重置游戏的方法
private void ResetGame()
{
    _currentPegIndex = 0;
    Array.Clear(_userGuess, 0, _userGuess.Length);
    // 随机生成新答案
    Random random = new Random();
    Color[] availableColors = new Color[] { Colors.Red, Colors.Blue, Colors.Green, Colors.Yellow, Colors.Orange, Colors.Purple };
    for (int i = 0; i < _answer.Length; i++)
    {
        _answer[i] = availableColors[random.Next(availableColors.Length)];
    }
}

关键说明

  • _userGuess数组专门存储用户每个位置的颜色选择,索引对应猜测位置的顺序,确保数据和界面操作一一对应。
  • _currentPegIndex用来跟踪当前编辑的位置,避免颜色存错数组位置。
  • 提交时的对比逻辑严格遵循Mastermind规则,先匹配完全正确的项,再匹配颜色正确的项,防止重复统计。
  • 如果有多个猜测peg控件,建议将它们放入Grid或StackLayout中,通过索引切换当前编辑的控件,这样更灵活易维护。

内容的提问来源于stack exchange,提问作者Timmy Forde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:40:31