检查我点击的标签是否是标签模式的一部分

Checking if a label I click, is a part of a pattern of labels

我正在制作一个关于记住标签模式的游戏,标签会随着颜色的变化而出现。然后用户必须按正确的顺序单击显示的标签。

模式被随机选择后,它进入一个名为 'pattern' 的列表。我的问题是;我该如何做到这一点,以便我的 label_Click 事件处理程序可用于检查是否以正确的顺序为整个列表单击了正确的标签。对不起,我的代码很笨拙,没有注释,我才开始编程。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace Spil
{
    public partial class Form1 : Form
    {
        Random rnd = new Random();
        Label[] labelArray;
        int turn = 1;
        int lives = 3;
        List<Label> pattern = new List<Label>();

        public Form1()
        {
            InitializeComponent();

            labelArray = new Label[] { label1, label2, label3, label4, label5, label6, label7, label8, label9 };
        }

        private void DisplayOrder()
        {
            for (int i = 0; i < labelArray.Length; i++)
            {
                labelArray[i].BackColor = Color.Blue;
                labelArray[i].Click += label_Click;
            }

            for (int i = -2; i < turn; i++)
            {
                int chosenNumber = rnd.Next(0, 9);
                labelArray[chosenNumber].BackColor = Color.Green;
                Thread.Sleep(1000);
                labelArray[chosenNumber].BackColor = Color.Blue;
                pattern.Add(labelArray[chosenNumber]);
            }
        }

        private void label_Click(object sender, EventArgs e)
        {
            Label clickedLabel = sender as Label;
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            System.Timers.Timer t = new System.Timers.Timer(100);

            t.Elapsed += t_Elapsed;

            t.Start();
        }

        void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            ((System.Timers.Timer)sender).Stop();

            DisplayOrder();
        }
    }
}

为了跟踪匹配的用户标签点击,您需要跟踪轮次,这样您就知道当用户单击标签时要查找的索引模式。

所以对于第一个 click/turn,你可以检查是否 pattern[0] == clickedLabel。如果用户是正确的,您可以将索引增加到 1,因为这是您希望被点击的下一个标签。

您可以通过对代码进行一些修改来跟踪这一点,如下所示。 注意:它只显示跟踪用户尝试的修改,其余原始代码保持不变。

public partial class Form1 : Form
{
    // A user is allowed a maximum of 3 guesses per label.
    private const int MaxTries = 3;

    // The number of guesses for the current label.
    private int _triesOnCurrentLabel;

    // The number of labels guessed correctly so far.
    // This is also the index into the patterns list.
    private int _numberGuessedRight;

    // The game is over if the user guessed all labels
    // or used more than the maximum number of tries on a label.
    private bool _gameOver;

    // ... other stuff

    private void label_Click(object sender, EventArgs e)
    {
        Label clickedLabel = sender as Label;
        if (!_gameOver)
        {
            if (pattern[_numberGuessedRight] == clickedLabel)
            {
                // The user guessed right.
                _triesOnCurrentLabel = 0; // reset, 3 tries for next label.
                _numberGuessedRight++;
                _gameOver = _numberGuessedRight == pattern.Count;
                if (_gameOver)
                {
                    // Show the user a message? "YOU WON"
                }
            }
            else if (++_triesOnCurrentLabel >= MaxTries)
            {
                // User used up all tries on the current label.
                _gameOver = true;
                // Show the user a message? "Game over YOU LOSER"
            }
        }
    }

    // ... the rest
}