如何在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
相关产品推荐
相关产品推荐

