Оператор switch вложенный в другой. Как сократить?

259
09 сентября 2018, 02:30

Суть такова - есть динамическое кол-во игроков которое определяется юзером. Нам нужно сделать что бы при вызове метода менялся цвет игрока который сейчас будет ходить. Нельзя ли покороче и по-понятнее сделать метод ChangeColor?? Говорю спасибо на перед. P.S Оранжевый цвет ходящего.

void ChangeColor( )//Самый сложный и ужасный метод в моей жизни
    {
        switch (names.Count)
        {
            case 2:
                switch (counter)
                {
                    case 0:
                        label1.ForeColor = Color.Black;
                        label2.ForeColor = Color.Orange;
                        break;
                    case 1:
                        label2.ForeColor = Color.Black;
                        label1.ForeColor = Color.Orange;
                        break;
                }
                break;
            case 3:
                switch (counter)
                {
                    case 0:
                        label1.ForeColor = Color.Black;
                        label2.ForeColor = Color.Orange;
                        break;
                    case 1:
                        label2.ForeColor = Color.Black;
                        label3.ForeColor = Color.Orange;
                        break;
                    case 2:
                        label3.ForeColor = Color.Black;
                        label1.ForeColor = Color.Orange;
                        break;
                }
                break;
            case 4:
                switch (counter)
                {
                    case 0:
                        label1.ForeColor = Color.Black;
                        label2.ForeColor = Color.Orange;
                        break;
                    case 1:
                        label2.ForeColor = Color.Black;
                        label3.ForeColor = Color.Orange;
                        break;
                    case 2:
                        label3.ForeColor = Color.Black;
                        label4.ForeColor = Color.Orange;
                        break;
                    case 3:
                        label4.ForeColor = Color.Black;
                        label1.ForeColor = Color.Orange;
                        break;
                }
                break;
        }
    }

Метод который использует метод выше.

private void move_button_Click(object sender, EventArgs e)//Событие кнопки /ХОД/
{
    if (counter == names.Count)
    counter = 0;
    scores[counter] += CountScores ( );
    ChangeColor ( );
    counter++;
}
Answer 1

Лучше бы вообще отказаться от оператора switch, полностью переделав метод.

Предлагаю закинуть объекты labelXXX в один массив или список, в порядке возрастания номера игрока, и можно будет сделать такой вот компактный код:

List<Label> player_labels = new List<Label>();
static void ChangeColor()
{
    int next_player_index = (counter + 1) % player_count;
    for (int i = 0; i < player_labels.Count; i++)
        player_labels[i].ForeColor = (i == next_player_index) ? Color.Orange : Color.Black;
}

Так и универсальности больше: если возникнет необходимость создавать игру на 5 или 6 игроков, то не потребуется вносить изменения в данный метод.

READ ALSO
c# получение dom в winform

c# получение dom в winform

Хотел бы узнать есть ли какой либо другой элемент работы с DOM на с# кроме WebBrowserПричина следующая: WebBrowser использует движок IE и давально старый,...

223
Интерактивный режим для Explicit тестов

Интерактивный режим для Explicit тестов

Часто использую тесты Nunit в качестве песочницы

193
Как распарсить json c#?

Как распарсить json c#?

мне нужно каким то образом вытянуть нужные данные из jsonЯ искал очень много ответов но не нашел не один подходящий мне вариант

196