Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Кейсы до определенного значения
#1
Доброго вечера , небольшой вопрос по кейсам. (см код ниже).
Хочу сделать так, что бы rewardAmount установил значение в 50 после 20 кейса, и до определенного значения.

Что то вроде диапазона кейсов., где внутри нужно устанавливать тот же параметр

Т.е. примерно так
Код:
case 20: rewardAmount = 50; break;
       case 21: rewardAmount = 50; break;
       ...
       case 9999: rewardAmount = 50; break;
       //а здесь будет тот самый предел, типа:
       case 10000: rewardAmount = 0; break;

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

Код:
                    switch(Player.mobkill)
                    {
                        case 1: rewardAmount = 3; break;
                        case 2: rewardAmount = 6; break;
                        case 3: rewardAmount = 12; break;
                        case 4: rewardAmount = 18; break;
                        case 5: rewardAmount = 24; break;
                        case 6: rewardAmount = 30; break;
                        case 7: rewardAmount = 33; break;
                        case 8: rewardAmount = 36; break;
                        case 9: rewardAmount = 39; break;
                        case 10: rewardAmount = 42; break;
                        case 11: rewardAmount = 44; break;
                        case 12: rewardAmount = 46; break;
                        case 13: rewardAmount = 48; break;
                        case 14:
                            case 15:
                                case 16:
                                    case 17:
                                        case 18:
                                            case 19:
                                                case 20: rewardAmount = 50; break;

                        default: rewardAmount = 1;
                    }
[Изображение: ck.gif]
Ответ
#2
http://kostin.ws/java/java-switch-and-more-logic.html
Fortuna - non penis, in manus non recipe.
Ответ
#3
Видел, читал. но ответа на вопрос так и не нашел. Вопрос мой вообще-то в другом..

Как использовать все промежуточные кейсы, до первого брека, не вписывая каждое значение кейса?

допустим у меня 200-300 значений case:

Код:
case 1: var = 1;
case 2: var = 1;
case 3: var = 1;
...
case 299: var = 1;
case 300: var = 1;
case 301: var = 2;

Что бы каждый раз не писать var = 1, делаются вложенные кейсы

Код:
case 1:
case 2:
case 3:
...
case 300: var = 1;break;
case 301: var = 2; break;

Но каким образом можно не записывая каждое значение кейса сделать так, что бы он все-таки прошелся по этому кейсу (от 4 до 299)?
[Изображение: ck.gif]
Ответ
#4
Код:
if(var > 4 && var < 299)
  { /* Code */}
else if(var > 299 && var < 10000)
  { /* Code */ }
И так далее. Как вариант.
НЛО прилетело и оставило подпись здесь.
Ответ
#5
first-post

Оператор switch имеет довольно специфичную структуру на низком уровне и не предназначен для использования ренджей.

Также, Вы несколько неверно понимаете что такое case. Они не могут быть вложенными, но могут вести в один и тот же блок кода (что в Вашем случае как раз и происходит).

Если Вы точно знаете, что при mobKill равном 1 награда 10, при mobKill равном 2 награда 20, а во всех остальных случаях награда 500, то занесите ее в default.

Если нужно несколько таких ренджей, то спасет, наверное, только if. Switch не обладает гибкостью, однако, в целом, работает немного быстрее, чем if, но этого не будет в Вашем случае - Вы просто раздуете код.
// aka Deft
Ответ
#6
Если вы все же хотите зарисовать кейс для души то у вас есть 2 варианта:

1.
Код:
    switch(Player.mobkill)
    {
        case 1:
            rewardAmount = 3;
            break;
        case 2:
            rewardAmount = 6;
            break;
        case 3:
            rewardAmount = 12;
            break;
        default:
            if(Player.mobkill > 3 && Player.mobkill < 10)
                rewardAmount = 20;
            else
                rewardAmount = 1;
            break;
    }
2.
Код:
    switch(Player.mobkill)
    {
        case 1:
            rewardAmount = 3;
            break;
        case 2:
            rewardAmount = 6;
            break;
        case 3:
            rewardAmount = 12;
            break;
        case 4:
        далее куча case
        case последний:
            rewardAmount = 20;
            break;
        default:
                rewardAmount = 1;
            break;
    }
но в вашем случае скорей всего будет логичней использование if(...)->else if(...)->else
open-team.ru - Freya, HighFive...
Ответ
#7
Yorie Написал:Switch не обладает гибкостью, однако, в целом, работает немного быстрее, чем if

В байткоде джавы, свитч разворачивается в большой цикл, с кучей прыжков по коду. Он в любом случае не может быть быстрее примитивной операции if/goto.
Если не верите мне, то можно посмотреть ассемблерный код теста, после прогонки jit'ом.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#8
http://www.ashishpaliwal.com/blog/2009/0...is-better/

Исходя из этого можно сказать, что существенной разницы между if-else и switch - нет, а остальное - дело вкуса, удобства, опыта.
Fortuna - non penis, in manus non recipe.
Ответ
#9
Цитата:Iteration -> 100 1000
if-else 8 ms 69 ms
switch finite 3 ms 34 ms
switch sparse 7 ms 21 ms
Из Вашей же ссылки.
Цитата:The finite switch statement was converted to tableswitch
Table-свитчи используются не только в Java и дают небольшой выигрыш в "многоэтажных" проверках, в предыдущем посте слово "немного" было важным. Я не говорил о десятикратном увеличении скорости выполнения. Switch из первого поста как раз является finite.
// aka Deft
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Запрет определенного итема Altino 7 1,805 08-29-2014, 07:37 PM
Последний пост: Daan Raven
  Удалить Определенного Нпц Из Спаунлиста mego4el 3 3,289 03-02-2011, 03:04 PM
Последний пост: ANZO

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)