Оператор Case достигает значения по умолчанию только при попытке вернуть новое значение в массив char[]

#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 это не то, что вы думаете. Однако вам нужно выполнить пошаговую отладку программы, чтобы выяснить, что это на самом деле.

Я настоятельно рекомендую вам изучить «отладку». Это очень ценный навык.