61

Re: Потрібно спростити

ur_naz написав:

То чому модератори окремого форума мають бути краще?

Для чого потрібен форум, що котиться в прірву?

62

Re: Потрібно спростити

P.Y. написав:
ur_naz написав:

То чому модератори окремого форума мають бути краще?

Для чого потрібен форум, що котиться в прірву?

не панікуйте, воно котиться в прірву вже 5 років, все добре  *OK*

63

Re: Потрібно спростити

0xDADA11C7 написав:

мені ще тільки віртуальних дегенератів не вистачає у житті.

Дегенерати навколо (чи реальні, чи віртуальні) — річ неминуча. Підписались на модераторство? Отже, терпіть — вам доведеться мати справу з ними частіше, ніж пересічному користувачеві. Головне самому не опуститись до рівня дегенерата.

Подякували: ch0r_t1

64 Востаннє редагувалося ur_naz (17.05.2021 21:07:27)

Re: Потрібно спростити

скільки пам'ятаю модератори тут не виконували свою функції, принаймні повністю

65

Re: Потрібно спростити

P.Y. написав:
ur_naz написав:

То чому модератори окремого форума мають бути краще?

Для чого потрібен форум, що котиться в прірву?

Нуар і декаданс жеж.
https://static.wixstatic.com/media/b3e1e4_3ca7c87184ca418abed7e0478937395e~mv2.jpg/v1/fill/w_1387,h_806,al_c,q_85,usm_0.66_1.00_0.01/b3e1e4_3ca7c87184ca418abed7e0478937395e~mv2.webp

Подякували: ch0r_t1

66

Re: Потрібно спростити

Цікаві ви люди.
Ну, гаразд. ВВажайте, що ви мене згвалтували.

Ось є функція, котра вираховує шкоду одного юніта іншому. На вхід приймає e - юніт 1, t - юніт 2, n - 0 (лучник) або 1 (воїн ближнього бою).
Наприклад лучник має такі параметри
        attackMin: 1,
        attackMax: 2,
        shootMin: 1,
        shootMax: 3,
При цьому attack приміняється в ближньому бою (нанесення удару шаблею).
А shoot - це стрільба луком.

function getDamageData(e, t, n) {
    var r = {
        damage: 0,
        kills: 0,
        injury: 0,
        demonKills: 0,
        retaliate: !1,
        failed: !1,
        isRanged: n
    };
    units[e.unit].half && Math.random() >= .9 && (r.demonKills = Math.ceil(t.quantity / 2));
    var i = units[e.unit].attackMin,
        s = units[e.unit].attackMax;
    n ? !units[e.unit].magic || !units[t.unit].magicImmunity ? (units[e.unit].shootMin && (i = units[e.unit].shootMin), units[e.unit].shootMax && (s = units[e.unit].shootMax)) : r.failed = !0 : r.retaliate = t.canRetaliate;
    var o = Math.round(Math.random() * (s - i)) + i;
    o *= e.startTurnQuantity;
    var u = units[e.unit].skillLevel + 5 - units[t.unit].skillLevel;
    return o = Math.floor(o * u / 10), o = Math.floor(o * moraleDamageModifier[e.morale]), e.side == 0 && (hasArtefact("Sword of Prowess") && (o = Math.floor(o * 1.5)), hasArtefact("Training Sword") && (o = Math.floor(o * 1.1)), hasArtefact("Bow of Marksmanship") && n && (o = Math.floor(o * 1.25))), t.side == 0 ? (hasArtefact("Ring of Heroism") && Math.random() > .9 && (o *= 4 / 3), hasArtefact("Shield of Protection") && (o = Math.floor(o / 4), o *= 3), hasArtefact("Shield of Assurance") && (o = Math.ceil(o * .9))) : Math.random() > .9 && (o *= .75), r.damage = o, o += t.injury, o += units[t.unit].hitPoints * r.demonKills, r.kills = Math.floor(o / units[t.unit].hitPoints), r.injury = o - r.kills * units[t.unit].hitPoints, r.kills > t.quantity && (r.kills = t.quantity), r
} 

Я ж хочу, щоб все було простіше. Всі чотири параметри я замінив одним ataka: 2. При цьому функція стала такою.

function getDamageData(e, t, n) {
    var r = {
        damage: 0,
        kills: 0,
        injury: 0,
        demonKills: 0,
        retaliate: !1,
        failed: !1,
        isRanged: n };
    units[e.unit].half && Math.random() >= .9 && (r.demonKills = Math.ceil(t.quantity / 2));
    var i = units[e.unit].ataka,
        s = units[e.unit].ataka;
    n ? !units[e.unit].magic || !units[t.unit].magicImmunity ? (units[e.unit].ataka && (i = units[e.unit].ataka), 
        units[e.unit].ataka && (s = units[e.unit].ataka)) : r.failed = !0 : r.retaliate = t.canRetaliate;
    var o = i;
    o *= e.startTurnQuantity;
    var u = units[e.unit].skillLevel + 5 - units[t.unit].skillLevel;
    return o = Math.floor(o * u / 10), o = Math.floor(o * moraleDamageModifier[e.morale]), e.side == 0 && (hasArtefact("Sword of Prowess") && (o = Math.floor(o * 1.5)), hasArtefact("Training Sword") && (o = Math.floor(o * 1.1)), hasArtefact("Bow of Marksmanship") && n && (o = Math.floor(o * 1.25))), t.side == 0 ? (hasArtefact("Ring of Heroism") && Math.random() > .9 && (o *= 4 / 3), hasArtefact("Shield of Protection") && (o = Math.floor(o / 4), o *= 3), hasArtefact("Shield of Assurance") && (o = Math.ceil(o * .9))) : Math.random() > .9 && (o *= .75), r.damage = o, o += t.injury, o += units[t.unit].hitPoints * r.demonKills, r.kills = Math.floor(o / units[t.unit].hitPoints), r.injury = o - r.kills * units[t.unit].hitPoints, r.kills > t.quantity && (r.kills = t.quantity), r }

Деякі умови стали безглуздими, а обчислення стали зайвими.
Тобто код можна і навіть треба спростити. Що тут не зрозуміло??
Один рядок я спростив. Було var o = Math.round(Math.random() * (s - i)) + i; а стало просто var o = i;
Решту спрощень я попросив зробити, бо не впораюсь.

67

Re: Потрібно спростити

А чому всі мовчать??
Вимагали, вимагали інформацію, а коли отримали, то мовчите...
Джаву скріпт забули??

68

Re: Потрібно спростити

може не завжди s == i...

69 Востаннє редагувалося koala (19.05.2021 06:16:58)

Re: Потрібно спростити

Я тут навмання бачу кілька способів мініфікації, що заважають читаності:
1. заміна імен змінних на однолітерні
2. скорочення !1 === false, !0 === true
3. використання && та ?: замість if - else
4. не знаю, наскільки це мініфікація, але замість ; використовується ,

function getDamageData(attacker, defender, isRanged) {
    var result = { //r, швидше за все, результат. Перейменовуємо r=>result
        damage: 0,
        kills: 0,
        injury: 0,
        demonKills: 0,
        retaliate: false,
        failed: false,
        isRanged: isRanged //тут видно, що n - це ознака, чи є це ушкодженням здаля. Перейменовуємо n=>isRanged
    };
    units[attacker.unit].half && Math.random() >= .9 && (result.demonKills = Math.ceil(defender.quantity / 2));
    var i = units[attacker.unit].attackMin,
        s = units[attacker.unit].attackMax; //оcкільки атака береться лише для units[e.unit], то e - нападник, перейменовуємо e=>attacker, t=>defender
    if (isRanged)
        !units[attacker.unit].magic || !units[defender.unit].magicImmunity ? (units[attacker.unit].shootMin && (i = units[attacker.unit].shootMin), units[attacker.unit].shootMax && (s = units[attacker.unit].shootMax));
    else
        result.failed = true: result.retaliate = defender.canRetaliate;
    var o = Math.round(Math.random() * (s - i)) + i;
    o *= attacker.startTurnQuantity;
    var u = units[attacker.unit].skillLevel + 5 - units[defender.unit].skillLevel;
    //наступний вираз складається з купи підвиразів, розділених орепаторами , - тобто значення return буде останнім. Переносимо return в кінець, замінюємо коми на ;
    o = Math.floor(o * u / 10);
    o = Math.floor(o * moraleDamageModifier[attacker.morale]);
    attacker.side == 0 && (hasArtefact("Sword of Prowess") && (o = Math.floor(o * 1.5)), hasArtefact("Training Sword") && (o = Math.floor(o * 1.1)), hasArtefact("Bow of Marksmanship") && isRanged && (o = Math.floor(o * 1.25)));
    defender.side == 0 ? (hasArtefact("Ring of Heroism") && Math.random() > .9 && (o *= 4 / 3), hasArtefact("Shield of Protection") && (o = Math.floor(o / 4), o *= 3), hasArtefact("Shield of Assurance") && (o = Math.ceil(o * .9))) : Math.random() > .9 && (o *= .75);
    r.damage = o;
    o += defender.injury;
    o += units[defender.unit].hitPoints * r.demonKills;
    r.kills = Math.floor(o / units[defender.unit].hitPoints);
    r.injury = o - r.kills * units[defender.unit].hitPoints;
    r.kills > defender.quantity && (r.kills = defender.quantity);
    return r;
}

продовжу завтра.

Подякували: ch0r_t1

70

Re: Потрібно спростити

Ну а ось як мені її спростили

function getDamageData(e, t, n) {
    var r = {
        damage: 0,
        kills: 0,
        injury: 0,
        demonKills: 0,
        retaliate: !1,
        failed: !1,
        isRanged: n };
    units[e.unit].half && Math.random() >= .9 && (r.demonKills = Math.ceil(t.quantity / 2));
    var i = units[e.unit].ataka;

    if(!n) {r.retaliate = t.canRetaliate;}
    var o = i;
    o *= e.startTurnQuantity;
    var u = units[e.unit].skillLevel + 5 - units[t.unit].skillLevel;
    return o = Math.floor(o * u / 10), o = Math.floor(o * moraleDamageModifier[e.morale]), e.side == 0 && (hasArtefact("Sword of Prowess") && (o = Math.floor(o * 1.5)), hasArtefact("Training Sword") && (o = Math.floor(o * 1.1)), hasArtefact("Bow of Marksmanship") && n && (o = Math.floor(o * 1.25))), t.side == 0 ? (hasArtefact("Ring of Heroism") && Math.random() > .9 && (o *= 4 / 3), hasArtefact("Shield of Protection") && (o = Math.floor(o / 4), o *= 3), hasArtefact("Shield of Assurance") && (o = Math.ceil(o * .9))) : Math.random() > .9 && (o *= .75), r.damage = o, o += t.injury, o += units[t.unit].hitPoints * r.demonKills, r.kills = Math.floor(o / units[t.unit].hitPoints), r.injury = o - r.kills * units[t.unit].hitPoints, r.kills > t.quantity && (r.kills = t.quantity), r }

71

Re: Потрібно спростити

Вибачте, а яка кінцева мета вашого "спрощення"? Ви викидаєте суттєві деталі алгоритму - випадкові коливання ушкоджень, вплив магії... задля чого? Що ви хочете отримати в результаті? Я вам можу дати остаточно "спрощений" алгоритм:

function getDamageData(e, t, n) {
    return {
        damage: 0,
        kills: 0,
        injury: 0,
        demonKills: 0,
        retaliate: !1,
        failed: !1,
        isRanged: n };
}

Він нічого не обчислює, просто повертає результат, який не відповідає тому, який був на початку, хоча містить усі ті ж поля. Вас це влаштовує? Чому ні?

72

Re: Потрібно спростити

Э два варіанта гри.
В одному боєць володіє чатирма параметрами удару, а в другому варіанті параметр лише один.
Кінцева мета перетворити перший варіант в другий.

73 Востаннє редагувалося koala (19.05.2021 17:03:33)

Re: Потрібно спростити

elektryk написав:

Э два варіанта гри.
В одному боєць володіє чатирма параметрами удару, а в другому варіанті параметр лише один.
Кінцева мета перетворити перший варіант в другий.

Все одно не розумію. Якщо є два варіанти гри - то нащо ви розбираєте код для першого варіанту, коли вам потрібно розбирати код другого? Чи ви маєте на увазі, що другий варіант існує виключно у вашій голові? Тоді треба не переробляти мініфікований обфускований код, а писати новий, за вашими правилами. Опишіть їх - тоді можна буде кодити.

Подякували: 0xDADA11C7, Q-bart, leofun013

74

Re: Потрібно спростити

Коало, ціную Ваш гумор, проте другий варіант реально існує.
От тільки він екзефікований, а автор (москляка!) вихідний код не дає.

75 Востаннє редагувалося koala (20.05.2021 09:56:31)

Re: Потрібно спростити

Боюся, допомогти вам таки нереально.
Є два методи дослідження поведінки програм: метод чорної коробки, коли досліджується залежність поведінки програми від вхідних  параметрів, і метод білої коробки, коли досліджується код. Ви ж намагаєтеся проводити дослідження методом сусідньої коробки. Успіхів вам.

Подякували: ReAl1

76

Re: Потрібно спростити

koala написав:

Боюся, допомогти вам таки нереально.
Є два методи дослідження поведінки програм: метод чорної коробки, коли досліджується залежність поведінки програми від вхідних  параметрів, і метод білої коробки, коли досліджується код. Ви ж намагаєтеся проводити дослідження методом сусідньої коробки. Успіхів вам.

Ну, а тепер правда:
Я майже все дослідив методом чорної скриньки.
А сусідня скринька дуже-дуже близька сусідка з відкритим кодом.
Тож переробити цей код під першу програму цілком реально річ для спеціаліста.

77

Re: Потрібно спростити

Як спеціаліст вам скажу. Завжди легше написати з нуля, ніж переробляти старий код. Навіть якщо його сам писав рік тому.

Подякували: flatliner, leofun01, dot3

78

Re: Потрібно спростити

elektryk написав:

Я майже все дослідив методом чорної скриньки.

І тиждень говорите про все, що завгодно, крім цього. Кастую в гілку P.Y. із лайком Електрика і поясненням, наскільки токсичною (для Електрика: москальською) є така поведінка.

Vo_Vik написав:

Як спеціаліст вам скажу. Завжди легше написати з нуля, ніж переробляти старий код. Навіть якщо його сам писав рік тому.

Чому? Якщо поведінка функцій однакова для конкретного типу атаки, то тут достатньо буде перевіряти, чи це той тип атаки. Просто обгортка. Не оптимально, але ж заявлена мета не оптимізація, а відтворення поведінки. Та й алгоритм, зрештою, лінійний.

79

Re: Потрібно спростити

Тому що легше написати функцію по технічному завданні, ніж по коду догадуватись, що вона робить і думати чи вона робить те що треба чи ні.

80

Re: Потрібно спростити

Але тут техзавдання включає "як у тій функції".
Наприклад, є функція, що визначає, куди може ходити шахова фігура. Нам треба написати функцію, що визначає, куди ходить тура. Звісно, можна переписувати правила рокірування з нуля; але можна просто передавати у першу функцію туру і не морочити собі голову.

Подякували: leofun011