#c# #arrays #winforms #char
#c# #массивы #winforms #char
Вопрос:
Я программирую игру hangman для школьного задания, и мой план состоял в том, чтобы создать пустой массив с заданной длиной для каждой сложности и случайным образом назначить им слово такой длины.
У меня были проблемы с этой функцией некоторое время, и я уже сделал много обходных путей (например, default: return defaultReturn;)
char[] defaultReturn = { 'E', 'R', 'R', 'O', 'R' };
char[] difficulty1 = new char[4];
char[] difficulty2 = new char[5];
char[] difficulty3 = new char[6];
char[] difficulty4 = new char[7];
char[] difficulty5 = new char[10];
char[] difficulty6 = new char[18];
public char[] RndWord(int difficulty)
{
Random rnd = new Random();
int rndSelect = rnd.Next(5);
switch(difficulty)
{
case 1:
switch(rndSelect)
{
case 0:
{
char[] difficulty1 = { 'C', 'A', 'S', 'A' };
return difficulty1;
}
case 1:
{
char[] difficulty1 = { 'S', 'A', 'G', 'A' };
return difficulty1;
}
case 2:
{
char[] difficulty1 = { 'T', 'E', 'S', 'E' };
return difficulty1;
}
case 3:
{
char[] difficulty1 = { 'V', 'I', 'D', 'A' };
return difficulty1;
}
case 4:
{
char[] difficulty1 = { 'G', 'U', 'M', 'E' };
return difficulty1;
}
default:
return defaultReturn;
}
case 2:
switch (rndSelect)...
case 3:
switch(rndSelect)...
case 4:
switch(rndSelect)...
case 5:
switch(rndSelect)...
case 6:
switch (rndSelect)...
default:
return defaultReturn;
}
}
Я вызываю функцию, когда вы нажимаете определенную кнопку, которая обновляет слово, которое вы в данный момент пытаетесь угадать.
private void btnDif_Click(object sender, EventArgs e)
{
switch(numDif.Value)
{
case 1:
RndWord(1);
lblWord.Text = String.Format("{0} {1} {2} {3}",
difficulty1[0], difficulty1[1],
difficulty1[2], difficulty1[3]);
break;
// other cases...
}
Теперь проблема в том, что метод никогда не достигает ни одного случая, кроме default (Редактировать: я протестировал его, и он достигает обоих случаев по умолчанию). Я не знаю, связана ли проблема с генерацией случайных чисел, вторым оператором case, массивом или чем-то еще полностью.
Комментарии:
1. Можете ли вы показать нам, как вы вызываете
RndWord
метод? Также это вложенныйswitch
оператор — о какомdefault
блоке вы говорите (внутреннем или внешнем)? Наконец, откуда вы знаете, что он достигает толькоdefault
блока? Вы выполняли отладку для подтверждения?2. О каком из случаев по умолчанию вы говорите? Тот, что внизу для сложности, или тот, что внутри сложности 1?
3. Вы понимаете
char[] difficulty1 = { 'C', 'A', 'S', 'A' };
, что объявляете и инициализируете совершенно новуюdifficulty1
переменную и возвращаете ее, а не изменяете ту, которую вы объявили в качестве переменной-члена?4. Спасибо @srk, я исправил недостающую информацию, которую вы просили.
5. @McAden Я создал дополнительные массивы выше в качестве обходного пути, иначе код не работал. Однако я не помню, в чем была ошибка.
Ответ №1:
Поскольку это домашнее задание, я не собираюсь решать проблему за вас, но я расскажу вам, что вы делаете неправильно. Я вижу 2 основные проблемы.
Первая проблема здесь связана с областью действия.
В качестве переменной-члена вы создаете difficulty1
. Затем дальше внутри вашего switch
оператора вы создаете новый. В этом суть проблемы. Вы объявляете и устанавливаете совершенно новую переменную с тем же именем.
char[] difficulty1 = { 'C', 'A', 'S', 'A' }; // the char[] at the beginning here denotes a declaration.
return difficulty1; // you're returning the local difficulty1, not the member variable
Затем вы возвращаете его, но в тот момент, когда вы вызываете эту функцию, вы отбрасываете возвращаемое значение.
RndWord(1);
Вызывая его, но не устанавливая возврат ни во что. Таким образом, у вас никогда не будет доступа к { 'C', 'A', 'S', 'A' }
.
Вторая проблема здесь заключается в достижении значения по умолчанию
Однако эта проблема не очевидна. Вам нужно будет выполнить то, что называется «отладкой». Добавьте точку останова в свой код и используйте F10 / F11 для «пошагового» выполнения вашей программы построчно.
Я предполагаю, что numDif.Value
это не то, что вы думаете. Однако вам нужно выполнить пошаговую отладку программы, чтобы выяснить, что это на самом деле.
Я настоятельно рекомендую вам изучить «отладку». Это очень ценный навык.