#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]