Нужно связать два текста кнопок друг с другом?

#c#

#c#

Вопрос:

У меня есть две панели макета таблицы с 26 кнопками каждая. Мне нужно связать два текста кнопок друг с другом. У меня есть два списка, содержащих один язык для одного набора кнопок и другой язык для другого набора кнопок. Я попытался связать два списка вместе, чтобы установить их переводы, но это не сработало. Так, например, если вы нажмете на одну кнопку, появится текст «Привет», а другая кнопка «Салют». Если это совпадение, они должны либо исчезнуть.

 Random random = new Random();

List<string> EngBasicPhrases = new List<string>()
{
    "Hello", "How are you?", "Hot",  "Thank you", "Welcome",
    "Let's go", "My name is...", "Cold", "Good luck",
    "Congratulations", "Bless you","I forgot","Sorry","I'm fine",
    "It's no problem","Don't worry","Here it is","What?","Of course",
    "Boy","Girl","Man","Woman","Friend","Almost","Late"

};

List<string> FrBasicPhrases = new List<string>()
{
    "Salut","Ca va?","Chaud", "Merci", "Bienvenu", "Allons-y","Je m'appelle","Du froid",
    "Bonne chance","Felicitations","A vos souhaits","J'ai oublie","Desole","Je vais bien",
    "Ce n'est pas grave","Ne t'en fais pas","Voila","Comment?","Bien sur","Un garcon","Une fille",
    "Un home","Une femme","Un ami","Presque","En retard"
};

Button firstClicked, secondClicked;

public Game()
{
    InitializeComponent();
    AssignWordsToSquares();
    EngBasicPhrases.AddRange(FrBasicPhrases);

}

private void Button_Click(object sender, EventArgs e)
{
    if (firstClicked != null amp;amp; secondClicked != null)
        return;

    Button clickedButton = sender as Button;

    if (clickedButton == null)
        return;

    if (clickedButton.ForeColor == Color.Black)
        return;

    if(firstClicked == null)
    {
        firstClicked = clickedButton;
        firstClicked.ForeColor = Color.Black;
        return;
    }

    secondClicked = clickedButton;
    secondClicked.ForeColor = Color.Black;

    CheckForWinner1();

    if (firstClicked.Text == secondClicked.Text)
    {
        firstClicked = null;
        secondClicked = null;
    }
    else
        timer1.Start();
}

private void CheckForWinner1()
{
    Button button1;
    for (int i = 0; i < tableLayoutPanel1.Controls.Count; i  )
    {
        button1 = tableLayoutPanel1.Controls[i] as Button;

        if (button1 != null amp;amp; button1.ForeColor == button1.BackColor)
            return;
    }
    MessageBox.Show("Congratulations!");
}

private void Button_Click2(object sender, EventArgs e)
{
    if (firstClicked != null amp;amp; secondClicked != null)
        return;

    Button clickedButton = sender as Button;

    if (clickedButton == null)
        return;

    if (clickedButton.ForeColor == Color.Black)
        return;

    if (firstClicked == null)
    {
        firstClicked = clickedButton;
        firstClicked.ForeColor = Color.Black;
        return;
    }

    secondClicked = clickedButton;
    secondClicked.ForeColor = Color.Black;

    CheckForWinner2();

    if (firstClicked.Text == secondClicked.Text)
    {
        firstClicked = null;
        secondClicked = null;
    }
    else
        timer1.Start();
}


private void CheckForWinner2()
{
    Button button2;


    for (int i = 0; i < tableLayoutPanel2.Controls.Count; i  )
    {
        button2 = tableLayoutPanel2.Controls[i] as Button;

        if (button2 != null amp;amp; button2.ForeColor == button2.BackColor)
            return;
    }

    MessageBox.Show("Congratulations!");
}

private void timer1_Tick(object sender, EventArgs e)
{
    timer1.Stop();

    firstClicked.ForeColor = firstClicked.BackColor;
    secondClicked.ForeColor = secondClicked.BackColor;

    firstClicked = null;
    secondClicked = null;


}

private void AssignWordsToSquares()
{
    Button button1 = button2;

    int randomNumber;

    for (int i = 0; i < tableLayoutPanel1.Controls.Count; i  )
    {
        if (tableLayoutPanel1.Controls[i] is Button)
            button1 = (Button)tableLayoutPanel1.Controls[i];
        else
            continue;

        randomNumber = random.Next(0, EngBasicPhrases.Count);
        button1.Text = EngBasicPhrases[randomNumber];

        EngBasicPhrases.RemoveAt(randomNumber);
    }

    for (int i = 0; i < tableLayoutPanel2.Controls.Count; i  )
    {
        if (tableLayoutPanel2.Controls[i] is Button)
            button2 = (Button)tableLayoutPanel2.Controls[i];
        else
            continue;

        randomNumber = random.Next(0, FrBasicPhrases.Count);
        button2.Text = FrBasicPhrases[randomNumber];

        FrBasicPhrases.RemoveAt(randomNumber);
    }
}

  

Комментарии:

1. Dictionary<int, string> Может быть достаточно. Один и тот же ключ, одна и та же строка на двух разных языках. Вы могли бы использовать свойство тега кнопок, чтобы назначить ключ словаря. Сравните тег выбранной кнопки в первом наборе с тегом кнопки в другом языковом наборе.

2. Я все еще не уверен в намеренном варианте использования. Это игра слов, в которой пользователь должен нажимать кнопки с соответствующим значением? Или предполагается, что это просто заменяет слова на кнопках на основе моего выбора языковых предпочтений?

3. Это игра с памятью на разных языках 🙂

Ответ №1:

Хорошо, итак, у вас, похоже, есть два списка для сравнения по порядку. Итак, на самом деле вам нужно сопоставлять не слова, а индексы обоих списков. Это имеет смысл. Но тогда все становится запутанным.

Ваш код прямо сейчас выполняет следующее:

  • Создайте список английских фраз
  • Создайте список французских фраз
  • Запустить форму
  • перебирайте кнопки английской панели
    • добавьте случайную английскую фразу к кнопке на панели управления
    • удалить фразу из английского списка
  • перебирайте кнопки французской панели
    • добавьте случайную французскую фразу к кнопке на панели управления
    • удалить фразу из французского списка
  • Добавьте все оставшиеся французские фразы в список оставшихся английских фраз (в любом случае этот шаг кажется ненужным)

Итак, теперь ваша форма загружена. Если у вас на панелях меньше кнопок, чем слов в вашем списке, возможно, в результате на обеих панелях будут слова, которые невозможно сопоставить.

Теперь вы сталкиваетесь с этим:

 private void Button_Click2(object sender, EventArgs e)
{
[...]
    if (firstClicked.Text == secondClicked.Text)
    {
        firstClicked = null;
        secondClicked = null;
    }
[...]
  

это единственное место, где я вижу попытку сравнить значения кнопки. Но к этому моменту они уже никогда не будут совпадать. «Hello» — это строка, которая никогда не будет соответствовать, например, «Salut». И, поскольку списки больше не являются неповрежденными, их нельзя использовать для их сопоставления. В противном случае вы могли бы просто найти фразы в их соответствующих списках и проверить, совпадают ли индексы.

Чтобы разрешить это, вам нужно изменить способ добавления текста кнопки в свой код. Вместо того, чтобы использовать список напрямую, создайте массив из своего списка. Что-то вроде этого:

     string[] phrases= EngBasicPhrases.ToArray();
    for (int i = 0; i < tableLayoutPanel1.Controls.Count; i  )
    {
        if (tableLayoutPanel1.Controls[i] is Button)
            button1 = (Button)tableLayoutPanel1.Controls[i];
        else
            continue;

        randomNumber = random.Next(0, phrases.Count - 1);
        button1.Text = phrases[randomNumber];

        phrases.RemoveAt(randomNumber);
    }

    phrases= FrBasicPhrases.ToArray();
    for (int i = 0; i < tableLayoutPanel2.Controls.Count; i  )
    {
        if (tableLayoutPanel2.Controls[i] is Button)
            button2 = (Button)tableLayoutPanel2.Controls[i];
        else
            continue;

        randomNumber = random.Next(0, phrases.Count);
        button2.Text = phrases[randomNumber];

        phrases.RemoveAt(randomNumber);
    }

  

Есть некоторые другие проблемы в том, как вы работаете с переменными и пытаетесь использовать цвета для определения состояния кнопки или вывода значения. Но я дам вам поработать с ними. Я рекомендую использовать точки останова и пошагово выполнять код, чтобы видеть состояние ваших переменных и перехватывать события.

Комментарии:

1. Как вы сравниваете 2 слова сейчас?

Ответ №2:

Я бы использовал Dictionary. Я бы связал значения следующим образом:

 button1.Text == dict[button2.Text]