1. C++ / Говнокод #14211

    +15

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    if( (Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 165 && Input.GetMouseY() <= 197) || (Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 205 && Input.GetMouseY() <= 237) ||
                (Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 85 && Input.GetMouseY() <= 117) || (Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 125 && Input.GetMouseY() <= 157) ||
    
               (Input.GetMouseX() >= 675 && Input.GetMouseX() <= 707 && Input.GetMouseY() >= 85 && Input.GetMouseY() <= 117) || (Input.GetMouseX() >= 675 && Input.GetMouseX() <= 707 && Input.GetMouseY() >= 145 && Input.GetMouseY() <= 177) ||
               (Input.GetMouseX() >= 675 && Input.GetMouseX() <= 707 && Input.GetMouseY() >= 205 && Input.GetMouseY() <= 237)||
    
               (Input.GetMouseX() >= 780 && Input.GetMouseX() <= 807 && Input.GetMouseY() >= 85 && Input.GetMouseY() <= 117) || (Input.GetMouseX() >= 780 && Input.GetMouseX() <= 807 && Input.GetMouseY() >= 125 && Input.GetMouseY() <= 157) ||
               (Input.GetMouseX() >= 780 && Input.GetMouseX() <= 807 && Input.GetMouseY() >= 165 && Input.GetMouseY() <= 197) || (Input.GetMouseX() >= 780 && Input.GetMouseX() <= 807 && Input.GetMouseY() >= 205 && Input.GetMouseY() <= 237) ||
    
               ...
    
            {
                int i; int e;
                if(Input.GetMouseX() >= 55 && Input.GetMouseX() <= 87 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 0;
                if(Input.GetMouseX() >= 95 && Input.GetMouseX() <= 127 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 1;
                if(Input.GetMouseX() >= 135 && Input.GetMouseX() <= 167 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 2;
                if(Input.GetMouseX() >= 175 && Input.GetMouseX() <= 207 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 3;
                if(Input.GetMouseX() >= 215 && Input.GetMouseX() <= 247 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 4;
                if(Input.GetMouseX() >= 255 && Input.GetMouseX() <= 287 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 5;
                if(Input.GetMouseX() >= 295 && Input.GetMouseX() <= 327 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 6;
                if(Input.GetMouseX() >= 335 && Input.GetMouseX() <= 367 && Input.GetMouseY() >= 210 && Input.GetMouseY() <= 242) i = 7;
    
                if(Input.GetMouseX() >= 55 && Input.GetMouseX() <= 87 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 8;
                if(Input.GetMouseX() >= 95 && Input.GetMouseX() <= 127 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 9;
                if(Input.GetMouseX() >= 135 && Input.GetMouseX() <= 167 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 10;
                if(Input.GetMouseX() >= 175 && Input.GetMouseX() <= 207 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 11;
                if(Input.GetMouseX() >= 215 && Input.GetMouseX() <= 247 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 12;
                if(Input.GetMouseX() >= 255 && Input.GetMouseX() <= 287 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 13;
                if(Input.GetMouseX() >= 295 && Input.GetMouseX() <= 327 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 14;
                if(Input.GetMouseX() >= 335 && Input.GetMouseX() <= 367 && Input.GetMouseY() >= 250 && Input.GetMouseY() <= 282) i = 15;
    
                ...
    
                if(Input.GetMouseX() >= 55 && Input.GetMouseX() <= 87 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 40;
                if(Input.GetMouseX() >= 95 && Input.GetMouseX() <= 127 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 41;
                if(Input.GetMouseX() >= 135 && Input.GetMouseX() <= 167 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 42;
                if(Input.GetMouseX() >= 175 && Input.GetMouseX() <= 207 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 43;
                if(Input.GetMouseX() >= 215 && Input.GetMouseX() <= 247 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 44;
                if(Input.GetMouseX() >= 255 && Input.GetMouseX() <= 287 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 45;
                if(Input.GetMouseX() >= 295 && Input.GetMouseX() <= 327 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 46;
                if(Input.GetMouseX() >= 335 && Input.GetMouseX() <= 367 && Input.GetMouseY() >= 410 && Input.GetMouseY() <= 442) i = 47;
    
               if(Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 85 && Input.GetMouseY() <= 117) e = 0; // Bracers
               if(Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 125 && Input.GetMouseY() <= 157) e = 1; // Hands
               if(Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 165 && Input.GetMouseY() <= 197) e = 2; // Sword
               if(Input.GetMouseX() >= 545 && Input.GetMouseX() <= 567 && Input.GetMouseY() >= 205 && Input.GetMouseY() <= 237) e = 3; // Off hand
    
               if(Input.GetMouseX() >= 675 && Input.GetMouseX() <= 707 && Input.GetMouseY() >= 85 && Input.GetMouseY() <= 117) e = 4; // Helmet
               if(Input.GetMouseX() >= 675 && Input.GetMouseX() <= 707 && Input.GetMouseY() >= 145 && Input.GetMouseY() <= 177) e = 5; // Chest
               if(Input.GetMouseX() >= 675 && Input.GetMouseX() <= 707 && Input.GetMouseY() >= 205 && Input.GetMouseY() <= 237)  e = 6; // Legs

    https://github.com/LaurentGomila/SFML/wiki/Tutorial%3A-Basic-Inventory-System

    Запостил: Crazy_penguin, 11 Декабря 2013

    Комментарии (44) RSS

    • бедный предсказатель ветвлений
      Ответить
      • Не жалей ты эту железку. Пожалей лучше людей это поддерживающих.
        Ответить
        • > Пожалей лучше людей это поддерживающих.
          Им очень прикольно будет менять размер иконок в инвентаре ;)
          Ответить
    • Вот интересно, а как оптимально задавать поиск по позиции значения мапящегося на интервал на тот случай, если отвязаться от проблематики иконок? Я бы с бустом задал это контейнерами boost::interval.
      Без буста бы записал массив соответствия интервала и значения, а по нему бы сформировал boost::unordered_multimap<позиция, значение>, но это не экономно для длинных интервалов. В общем не оптимальный частный случай. Явно должно быть что-то лучше.

      А вот с не дескретными интервалами это вообще жопа.
      Ответить
      • Можно написать скрипт на php, который сгененрирует двумерный массив чисел. Мегабайт памяти...
        Ответить
        • Боже, какой типаж! Браво, браво! Слушайте, я не узнаю вас в гриме! Кто Вы такой?
          Ответить
          • Бонд Джеймс Аристархович
            Ответить
            • Ассоциативные операции - одни из самых частых в средней энтерпрайзной программке. Почему наши компы до сих пор не умеют в O(1) аппаратный ассоциативный поиск? Это бы настолько прибавило производительности.
              Ответить
              • O(1) ассоциативный поиск? Ну, префиксное дерево. Только оно не аппаратное и константа у него дерьмовая.
                И O(1) у него на самом деле - это О(длина ключа). Но это очевидно для любой структуры - теоретический минимум, ибо как можно что-то найти по ключу, не считав все биты ключа?
                Ответить
                • Недостижимый детский идеал. Ультимативный пример - Царь. Он жаждал числодробилки с кучей флопсов любой ценой, при том совершенно забывая насколько медленна ОЗУ, откуда берутся все данные.

                  >>>Это бы настолько прибавило производительности.
                  Из разряда AssParallel хацкил всё сам нам паралеллит и наступит всеобщее многоядерное щастье.

                  Или достаточно использовать вычисления на видеокарте как замену CPU, вот только программеры - ленивые мудаки и не могут этого осилить. Это ведь так просто!
                  Ответить
                  • Есть идея, котаны: загружаешь за O(1) в каждый столбец таблицы элемент ключа (есть строка искомого ключа). Каждая ячейка памяти с элементов сравниваемого ключа сравнивает за О(1) своё содержимое с соответствующему ему элементом искомого ключа. Если все элементы строки совпали с элементами строки ключа, то строка за О(1) выставляет на шине свой адрес. И того за О(1) работает для одного совпавшего ключа или за О(n) для n совпавших ключей. Я щитаю это вин. Можно написать на вшдл или верилоге. Но лучше был бы аппаратный готовый девайс.
                    Ответить
                    • Здраствуйте. Я, Гумно. Хотел бы чтобы вы сделали девайс, опаратный суть такова... Пользователь может выставлять на шину данные, получать из памяти и записывать.
                      Если все элементы строки совпали с элементами строки ключа, то строка за О(1) выставляет на шине свой адрес. И того за О(1) работает для одного совпавшего ключа или за О(n) для n совпавших ключей. Можно писать на верилоге...

                      Так же чтобы в девайсе могли не только O(1) но и разрешать коллизии и если будет коллизия то будет O(N), так же передать содержимое но процессор может не перебирать а выбрать первый. Кешировать можно...
                      P.S. Я джва года хочу такой девайс.хеш-мапа. только аппаратная...
                      Ответить
                      • Емнип, этот опаратный девайс уже есть и работает в... кеше процессора. Тот самый ассоциативный поиск кешлайна за O(1). Ну вот разве что коллизии не обрабатываются.
                        Ответить
                    • > Есть идея, котаны
                      http://en.wikipedia.org/wiki/Content-addressable_memory
                      Ответить
                  • Далеко не все легко перебросить на ГПУ, 3,14др.
                    Ответить
                  • > Он жаждал числодробилки с кучей флопсов любой ценой, при том совершенно забывая насколько медленна ОЗУ, откуда берутся все данные.
                    Емнип, царь утверждал как раз обратное: что любая задача упрется именно в скорость памяти. Поэтому он даже покупал хасвелл, в надежде на новый, более шустрый, контроллер памяти.
                    Ответить
                  • Да, но если строк реально пипец дохрена, то оно может и выиграть.

                    Вычисления на видеокарте? Да там даже ифа нормального нету!
                    Ответить
                    • 314др слишком тупой, чтобы понять, что такое SIMD. VLIW уже дропнули.
                      Ответить
      • *дискретными
        Ответить
    • Input.GetMouSex
      Ответить
    • Я в скриптах самопального интерфейса для GTA SA так - же мутил :D
      Ответить
    • Ну еще не зрелый программист писал, я в универстетскую быль таким говном тоже грешил. Ничего руки выпрямятся. Самопальный гейдев, такой самопальный.
      Ответить
    • О. Знакомый подход. Я такое писал даже раньше, чем выучил массивы и циклы. :)
      Ответить
    • Итак. Кто так не писал - поднимите руку.
      Ответить
      • Суть в том, где это написано. Официальная документация sfml.
        Ответить
      • хотел смолчать - не сумею: я не писал. я не писал 100500 однотипных проверок с захардкоженными константами, особенно еще таких сложных. я всегда был слишком,слишком ленив.
        Ответить
    • собственно, задача сводится к проверке, в какой прямоугольник попадает точка. т.е. в итоге те же 4*х сравнений.
      впрочем, если у нас прямоугольник, разрезанный на прямоугольник (а-ля сетка) [что, вроде, вариант сабжа], то можно схалтурить и так избавиться от многих проверок. [по сабжу:] если это вообще квадраты, то вообще можно обойтись двумя формулами с целочисленным делением и остатком.
      в браузерках вообще видел халтуру: набор радиокнопок, что сводит сложность к константе (О(1))
      Ответить
      • > собственно, задача сводится к проверке, в какой прямоугольник попадает точка. т.е. в итоге те же 4*х сравнений.

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

        в случае неперекрывающихся отсортированых прямоугольников, задача решается в (почти) логарифмовое время. (в случае пекрывающихся, надо будет еще по z-order-у извращатся.)
        Ответить
      • > набор радиокнопок, что сводит сложность к константе (О(1))

        хехе. в браузере уже кто-то сделал алгоритм нахождения элемента по которому кликнули.
        Ответить
        • event.target, event.offset*?
          Ответить
          • а их заполняет кто? А.С. Пушкин? браузер эти поля заполняет, следовательно в браузере уже есть алгоритм. и он совсем не обязательно O(1).
            Ответить
    • Обоже, массив прямоугольников кнопок и математика аля входит ли точка здесь не пробегали?
      Ответить
    • По ссылке ещё много кода в подобном стиле

      int InventoryAdd(int ItemID)
      {
                  int i = 0;
                  int x = 0;
                  int y = 0;
                  while(i < 49)
                  {
                      if(Slot[i] == 0)
                      {
                          x = 55 + ((i % 7) * 40);
                          y = 210 + (i / 7) * 40);
      
                      if(ItemID == 1) { Item1.SetPosition(x,y); Item1Have[0] = 1; Item1Have[1] = i; Slot[i] = 1; return 0; }
                      if(ItemID == 2) { Item2.SetPosition(x,y); Item2Have[0] = 1; Item2Have[1] = i; Slot[i] = 1; return 0; }
                      if(ItemID == 3) { Item3.SetPosition(x,y); Item3Have[0] = 1; Item3Have[1] = i; Slot[i] = 1; return 0; }
                      if(ItemID == 4) { Item4.SetPosition(x,y); Item4Have[0] = 1; Item4Have[1] = i; Slot[i] = 1; return 0; }
                      }
                      i++;
                  }
      }
      Ответить
    • Всего - то и нужно тут, что построить BVH дерево контролов...мышка хоть лагать не будет в середине экрана, вдали от кнопок)
      Ответить
      • > http://en.wikipedia.org/wiki/Bounding_volume_hierarchy

        один раз нечто подобное писал - но не знал что уже есть готовые теории. спасибо.

        а как оно будет выглядеть для перекрывающихся объектов?
        Ответить
        • Ну тут либо 3D дерево с Z-буфером делать, либо какой - нибудь хак придумать...
          Ответить
        • А я делал довольно тупо: разбивал плоскость на клетки, в каждой из которых хранились ссылки на объекты, которые ее задевают. Размер клеток был таким, что в каждой из них было в среднем 10-20 объектов.
          Ответить

    Добавить комментарий