Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Кейсы до определенного значения (https://forum.zone-game.info/showthread.php?t=23557)

mego4el 11.10.2012 16:30

Кейсы до определенного значения
 
Доброго вечера , небольшой вопрос по кейсам. (см код ниже).
Хочу сделать так, что бы 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;
                                        }


Ashe 11.10.2012 16:35

Re: Кейсы до определенного значения
 
http://kostin.ws/java/java-switch-and-more-logic.html

mego4el 11.10.2012 17:03

Re: Кейсы до определенного значения
 
Видел, читал. но ответа на вопрос так и не нашел. Вопрос мой вообще-то в другом..

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

допустим у меня 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)?

YK_Sirius 11.10.2012 17:58

Re: Кейсы до определенного значения
 
Код:

if(var > 4 && var < 299)
  { /* Code */}
else if(var > 299 && var < 10000)
  { /* Code */ }

И так далее. Как вариант.

Yorie 11.10.2012 22:20

Re: Кейсы до определенного значения
 
first-post:
Свернуть ↑Развернуть ↓


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

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

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

Если нужно несколько таких ренджей, то спасет, наверное, только if. Switch не обладает гибкостью, однако, в целом, работает немного быстрее, чем if, но этого не будет в Вашем случае - Вы просто раздуете код.

DiagoD 11.10.2012 22:50

Re: Кейсы до определенного значения
 
Если вы все же хотите зарисовать кейс для души то у вас есть 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

n3k0nation 12.10.2012 08:13

Re: Кейсы до определенного значения
 
Цитата:

Сообщение от Yorie (Сообщение 234576)
Switch не обладает гибкостью, однако, в целом, работает немного быстрее, чем if

В байткоде джавы, свитч разворачивается в большой цикл, с кучей прыжков по коду. Он в любом случае не может быть быстрее примитивной операции if/goto.
Если не верите мне, то можно посмотреть ассемблерный код теста, после прогонки jit'ом.

Ashe 12.10.2012 08:44

Re: Кейсы до определенного значения
 
http://www.ashishpaliwal.com/blog/20...ich-is-better/

Исходя из этого можно сказать, что существенной разницы между if-else и switch - нет, а остальное - дело вкуса, удобства, опыта.

Yorie 12.10.2012 17:46

Re: Кейсы до определенного значения
 
Цитата:

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.


Текущее время: 13:48. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot