ДействиеСценарий / Говнокод #12258 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
public static function findNeighbourEmpty(cx:int, cy:int, checkDebris:Boolean = true):Cell {
    var cell:Cell = Cell.getCell(cx, cy);
    var i:int = 0;
    var distance:int = 1;
    var n:int = 8;
    while(!cell || !cell.accessible || (checkDebris && !isEmptyTile(cell))) {
        if (i < n * distance / 4) {
            cell = Cell.getCell(cx + Math.min(i, distance), cy + Math.min(distance * 2 - i, distance));
        } else if (i < n * distance / 2) {
            cell = Cell.getCell(cx + Math.min(distance * 2 - i + n * distance / 4, distance), cy + Math.max(n * distance / 4 - i, -distance));
        } else if (i < 3 * n * distance / 4) {
            cell = Cell.getCell(cx + Math.max(n * distance / 2 - i, -distance), cy + Math.max(-distance * 2 + i - n * distance / 2, -distance));
        } else if (i < n * distance) {
            cell = Cell.getCell(cx + Math.max(-distance * 2 + i - 3 * n * distance / 4, -distance), cy + Math.min(i - 3 * n * distance / 4, distance));
        } else {
            i = 0;
            distance++;
            if (distance > MAX_NEIGHBOUR_CELL_DISTANCE) {
                return findNeighbourEmpty(cx, cy, false);
            }
            continue;
        }
        i++;
    }
    return cell;
}

Какой милый метод...

Запостил: kyzi007 kyzi007, (Updated )

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

  • Я так понимаю, функция возвращает координаты первой пустой ячейки? Извольте, это можно сделать более лучшим способом.
    Ответить
  • это должен быть А*, самописная реализация?
    годно, годно. И циклы, и рекурсия, и ифосвитч, и даже чуть математики!

    кстати, Cell.getCell(cx, cy) меня тоже порадовал.
    Ответить
    • Это даже близко не А*, это поиск вширину без каких либо затей. Кстати сказать, для маленьких карт - замечательно работает, вот только, конечно, можно было красивше оформить, но с точки зрения алгоритма - все сделано правильно, т.е. результат будт правильным, как и ожидается от этого алгоритма и с асимптотической сложностью ожидаемой от этого алгоритма.
      Ответить
    • Хм... но есть одно но... очевидно карта не больше 16 клеток по ширине / высоте?
      Ответить
      • Что то с поиском глючит, скорее всего не в этом месте, но я случайно заглянула 🙂
        Нет, карта большая.
        Разнообразных поисков кстати много там написано :).
        Ответить
        • О кстати, поиск не адекватно работает если стоит большое здание 🙂
          Ответить
          • Как бы код, что выше не будет правильно работать для матриц больше чем 16х16, хотя, вобщем, скорее 8х8, поэтому я и предположил, что карта не больше. Ну есть смысл взять тогда мой вариант и немного его оптимизировать (чтобы не создавал так много точек, можно сразу же при генерации следующего поколения проверять условия по которым клетка выбирается, тогда и вообще генерировать нечего будет почти.
            А вообще, еще лучше, копировать отсюда:
            http://aima.cs.berkeley.edu/code.html
            Ответить
  • guest 08.11.2011 18:04 # +2
    Ṫ̼̥̖̙͌̃̒o͔̾ͤ̀̂ͧ̑̓̾ͨ ̤͚̮̻̌i̫̺̞͎̇͂̋ͨͨn̫̥̰̥̠̫͐ͫ̐́ͧ͌͗́ͅv̬̜͊̾̅̅̈́ͤ ̹o̤̫̜̼̥̪͓̱̊͒͑̈̉ͪͣ̈k̖̭͙͉̙̣͚͒̎̾̏̌̒̉̏ėͬ͋̔̚ ̤̠̠̯̤͖̮̗̉̒ͤ ͔̯͕̞̹̥̻̫͌͑̚t̗̯̗̞̮̼͖ͬ̄ͯ̒h̺̜̰͉̱̜̃ͬ̂ͫe͔ͫ͗͐͊ ͕̮̠ ̤̯̙̥̜̺ͯͮh͕̥͈̫̪̀̆͌̋͐ͮ̓ͅi̼̞̐ͩͤͯ̈́̎̽͌́v̓͆̉ͯͬ ̠͍̗͇̅̿̌ͦe̯͕̭̥̦̰̬̥͚̾̑͆ͤͫͪͥ̍-̙̫̭̠̮̳̮̉ͣͯm̝̓̉í̥͈̙͓̠͎̌ͥ̐̎̓̾ͤͩn̖͙͈̥͓̏͗̋̃ ̮d̩̲̙̺̎͊ͨ̽̚ ̣̝̗̻̩͕͇͇̓̾͐̒ͥͨr̥̜̬̱̺̠̖̩̱͂͌̑̃ẽ͚̱̮̣̲̑̃̇͒̓ ̙̙p͈̰ͥͪ̌̏̏̃̎̑ͅr͕̗̉͛͑͊̊͋̾e͉̤̩̠͈̹̹͌ͬ̋̂͗͑̚s ̘̗͎͙͎̽ͨͯͮe̦̝̝̟͕̭͕̻ͧͯͣ̐n̼͕͚̦̭̾̎ṱ̦͖̱͛ͣͣͅi ̻͛̈́ͬ̚ñ͔̣̪̄̅g̫͇͛ͭ ͈̮̙̥͉̹̯̻͚͊͊c͇̱̳̞̓̌͒̒͛̏ͨh̻̗̯̳̫̾ͪ̔ͩ͒a̒̈̒̄ͧ ̖͚̦̝̤̦͕̓́o̖͇̻̓̔s̲̥̝̘̼̺̠̻̜̋͆̇ͥ̔ͩ̏.̌͑̓̐͛͆̃ ͉̭̖͕̲
    ̻̥͎̺̻̐ͩI͓̟̖̘̥̪͎ͤ͑ñ̖̙̅͂̇ͦ̈́v̫̘͕̹̤̫̎ͅͅö͈́͐ ̣̞͈̬̦̻̤k̞̳̂̓̂̒̚i̙̳͍̝̗͈̺̓̅̅͌̆͐̇ǹ̫̗ͪ̽ğ͑̾ ̝̗̝̺̜̑ ͕̇̑̎̉̇t̜̜̰̬̰ͭ̇̇h͓̝͚͈̩͔͌̉ͬͦͧͮ̈͗ͅê͚̞͚͓̻̫̒ ͉ ̮̘̳̺̙̥̦̫͗͊ͯ̿͊ͧͬ͌f̬̰ͯe̜̙̞̺̯̭̞ͩ̒͒è͔͖̖͚͌̽̔ ̟l͕͉̱̺͒ͤ͒̋ͧ̚i͔̭̥̥̠̞͍͎͆̑͑̈ͯ̎ͅṅ̳̯̞̆̒ͮ́ͅgͪ ̼͓̪̦̱̮͕͂̔͊͂ ̥̺͓̬̳̳̣̽̃ͅo̻̳̭̙̹͍͋̍́͐̚f͙̰̗ͫͧ͒ͬͭ͐ ̤̺ͪ̉̿͒c̹͔̦͈̲̗ͣ͌͌ͨh̙̗̙̞͕̺ͯ͒̉ͮ̔ͧͯͯa̘̻ͨͥ͐ͫ̅ ͍͈͎͙̖ȯ̺̙͖͋̓̎̿̑ͫs̰̲͖͔̤̤̥̹͕ͣ͆̈́̍͋.ͦ̓͆͗͌̅̌͊ ͓̩͉̤̱̌ͅ
    ͓ͫW̳͇̰̣̭͈̯̭̃̋̎̏͋ͭi͍̪̫͐͐̆́͗̐t͍̰̫͍̆͒͒ͦ͑̒̓ͭ h̪̤͗͗ͪͣ̿͆̽̆ͥ ̱͍̟͔̲̹̗̫́͑̊͋ͦͨͣö͕̻̌̾͌̿u̗͔͍ͬͦͦ̃ͥ͐t̩͖̹̩͇͐ ͎̭͎ ̞͖͗o͎͓̝̱̣̟ͭ͒͐͆̔̆̒̅ͅͅr̖͚̭̝̜̄̎̀̈́ͦͭ̚d̩̰̼̠͆ͤ ͔̬̩ẽ̥̻ͥ̓̍͗̀̐̇r̥̗̳̠͚̟̪͎̮̃.͈̰̜̤̯̲̜̏̋͒ͤͧ͗ͅ
    ̞͇̪̰̙̖͍ͣͪṰ͕̫̇̑ͧ̌ͫh͎͈͓̀̓́ͭ̑̿͆e̟͇̬̅̓̅͌ͪ͌̆ ̼̺̞͖ͅ ͙̣̍ͥͅN͉̼̘̪̗̳͖̣̋ẹ̦̳̼͉̻̍ͦ̌̑z̥̭ͤ̿̂p̣̲̪͍̱̔̐ e͈͇̱͚̗͙̠̓ͥ͂̂̒̋r̺͐ͩ̀̍ͦ͋̚̚d̖̟̘̹̳̫̞͐̈ͮͩ͆i̒̇ ̼͔̀̊͑͗a̫̗̎ͣ͊̅ͩṉ͋̒ ͓̍͂ͣ̂h͖͍͙̭͍͈̃̐̓ͭ͒ͨ͛ï̖̰̟͒ͯ̐͌v̗̟͙̞̈̈̓̒ͪ̅ͪ e̠͕͓̫̮̬̗̭̯͂ͦ̂́̇̈́ͯ-̺̾ͅm͚͕̐̋́͆ͦͦ̏ï̲̮̘ͧͬ̆͋n̘̺̬̳͌̅̇̌̈́̒́͂d̋͌́͗ ̪̫͙̲͖͎̦ͤͬ ̜̥̻̹ͩ̅ͥͪ̐̍̐͌̋o͓̙ͣ̏ͫ̑̚f̰̟̓̒̊ͭ̑ͥ ͕̺ͩͯ̊͗͗c͓̭͂ͬͤ̒͆ͪ̚h̠͙͖̩͉̅̂ͦȧ̪͔̀o͓̖͇ͥ̓̄́̅ ̼͙̮͇ͅs̮̜̝̣ͨ̐͌ͤ͆̈́.͖͉̮̒̒̅̇ ̙̲̤͉̠̜̭͕̈̋ͥZ̰̗̥̤ͬ͂̾ͪ͌ͅa̭̩̞̽ͧ̐͗̂͒̏̋lͥ͐́͒ͨ ͓̭͓̜ͫg̳̺̼̖͆o̞̬̐̉̑͊͛ͦ.̮̹ͮ̒ͬͫͭ̅ͣ̉ ̝̝̲̤̺͇̱͙ͯ͋ͯͦ̓
    ̮͖͔̯̻ͣ͛͆͑͊̒̽̇H̫̫̃̎̂e͙̳̺̭͓̗̮̖ͬ̔ͥ̓ ͕̬͖̠͖͉͕̬̀ͣͩ͗w͉̺͚͙̘̞̍̄̌͗̃ͪ͒ͦh͈̦͇̮̟̲͈̋ȯ̓̉ ̰̦̜̲̣͖̲͓͛͊́̋ ̮̝̰̙̦͛͗͐ͥ̑̎ͩW̜̯̳͉͓͓̱̦͊̃̐a̺̺̭̽̾ͭͭ̒̅̓i̤̘͓̅ ̗̙̭̖̦t̩̺̞ͭ̓̎̚s̥͙̞̺̟̝͎̪̠̽̒̾̈́ ͙̰̞̺̈̂̑͌ͨ̆ͅB̭̰̰͖̜̒ͫ̌̾ĕ̗͕͇̤̱̤̹̞ͫͪh͙͎͔̪̓ͨ ̤̱î͙̙̦͎͈̠̓̒̐̑n̠͓͉̭̭̙̎̈́d̥͒͒̋ͥͩͫͧ ̠̖̦̮̹ͭ͛̊ͫT͇̘̫͖̗͓̤ͥ͑̂̑̊ͣͥ͐h͖̦͇̍̓ͩ̅̈́ͫͧͣ͛e͊ ̝̮̤̮̻̼͚̜͂ͬ͋ͧ̌̾͛ͅ ̭̳̩̦̞͎̜͛͑̓͂ͪ͐ͤͅͅW̟͚̫͕͓̺͍̅ả̜͕̭̻͚̗̖̂ͤl͊ͧͦ ͓̙̗͇̜͇̦͆̉ͣ͌̓l̰͍͇̟ͮ̓̇.̭͓̞̙̭̑ͬ͂
    ̹̘͇̳̘̥͍̉ͬ͆ͨ̃ͪ̿Ż̲̫͉̭̳̘̐̆ͯ̀A̦͖͉͉̪̥͓̋ͧ͊̏̏ͅ L̝͚͖̘̼͙̙͋ͨ̄͌͗̏̽G̟͇̣̺̬͖̭͂̎ͨͮͣ̾ͤO͇̓ͩ͊ͭͭ̐̆ͅ ̳̳̯̳̹̠!͉̤͉̻̫̻͂̿͛ͬ̃
    Ответить
    Ответить
    • С̯͚̠̮̍ͥ̄ͫ̇͌̽̋͝ͅͅъ̛̜͈̭͎͙͚̘͈ͤ̎͝е̧̧̣̻̞̐б̲̇̕ и̨͚̦͍̜͔͓ͮ̍̇͊ͨ͑͑ ̴̣̺͚̗͎͉͔̦͆ͦͯ̑̇ͫͭ͡ӧ͓͉̪͌̃̎̆тͣͭͭ́ͤͥ̒̐͏̷̠̮͞ ̭̜̤͇̰̫̺с͙̣̫ͯ̈́̃̾ͫ̈́̄ю̻͔̣̙͖͚̈̓͊ͦ̃̏̇̈́͜͠дͧ̎̀̈́ ͚͔̥̬̫̳͕̎͠а̶̢̢̩͙̭͙̫̐̿́,̡̙͑̚̕ ͓̟͎̙͋̍̂̔́к̸̹̟͈͔͉͖̃͂͐̈̑ͦ͢л̲̟͔̠̾ͩ̃̊́ͥ̈ͧ͟о̍ ̵̣̥̙̜̹̲̦̻̽ͨ̅͡у̵̃ͪ͏̖̗̤͙ͅн̴̈̉ͭͭ̊͐ͤ͑҉̲ ̢̢͇̣̣ͭ͂с̧͚̣̭̲̻ͥр̢̛̮̭͙̮̹̫̘̘̓̓̽̏͆̀а̨͑̉́̂ͤ̉ ̱̯̕͞н̡̰͕̫̓ͩͯыͮ̉̔̇̃ͧ̽̔̅͏̬̲̝͝й̦̲̤̙͎̝̝ͭͭ̋̊͟ ̳.̶̸͚ͩ̂́̃ͭ́
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8