Re: Потрібно спростити
То чому модератори окремого форума мають бути краще?
Для чого потрібен форум, що котиться в прірву?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → JavaScript, TypeScript, ECMAScript → Потрібно спростити
Сторінки Попередня 1 2 3 4 5 6 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
То чому модератори окремого форума мають бути краще?
Для чого потрібен форум, що котиться в прірву?
ur_naz написав:То чому модератори окремого форума мають бути краще?
Для чого потрібен форум, що котиться в прірву?
не панікуйте, воно котиться в прірву вже 5 років, все добре
мені ще тільки віртуальних дегенератів не вистачає у житті.
Дегенерати навколо (чи реальні, чи віртуальні) — річ неминуча. Підписались на модераторство? Отже, терпіть — вам доведеться мати справу з ними частіше, ніж пересічному користувачеві. Головне самому не опуститись до рівня дегенерата.
скільки пам'ятаю модератори тут не виконували свою функції, принаймні повністю
ur_naz написав:То чому модератори окремого форума мають бути краще?
Для чого потрібен форум, що котиться в прірву?
Нуар і декаданс жеж.
Цікаві ви люди.
Ну, гаразд. ВВажайте, що ви мене згвалтували.
Ось є функція, котра вираховує шкоду одного юніта іншому. На вхід приймає 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;
Решту спрощень я попросив зробити, бо не впораюсь.
А чому всі мовчать??
Вимагали, вимагали інформацію, а коли отримали, то мовчите...
Джаву скріпт забули??
Я тут навмання бачу кілька способів мініфікації, що заважають читаності:
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;
}
продовжу завтра.
Ну а ось як мені її спростили
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 }
Вибачте, а яка кінцева мета вашого "спрощення"? Ви викидаєте суттєві деталі алгоритму - випадкові коливання ушкоджень, вплив магії... задля чого? Що ви хочете отримати в результаті? Я вам можу дати остаточно "спрощений" алгоритм:
function getDamageData(e, t, n) {
return {
damage: 0,
kills: 0,
injury: 0,
demonKills: 0,
retaliate: !1,
failed: !1,
isRanged: n };
}
Він нічого не обчислює, просто повертає результат, який не відповідає тому, який був на початку, хоча містить усі ті ж поля. Вас це влаштовує? Чому ні?
Э два варіанта гри.
В одному боєць володіє чатирма параметрами удару, а в другому варіанті параметр лише один.
Кінцева мета перетворити перший варіант в другий.
Э два варіанта гри.
В одному боєць володіє чатирма параметрами удару, а в другому варіанті параметр лише один.
Кінцева мета перетворити перший варіант в другий.
Все одно не розумію. Якщо є два варіанти гри - то нащо ви розбираєте код для першого варіанту, коли вам потрібно розбирати код другого? Чи ви маєте на увазі, що другий варіант існує виключно у вашій голові? Тоді треба не переробляти мініфікований обфускований код, а писати новий, за вашими правилами. Опишіть їх - тоді можна буде кодити.
Коало, ціную Ваш гумор, проте другий варіант реально існує.
От тільки він екзефікований, а автор (москляка!) вихідний код не дає.
Боюся, допомогти вам таки нереально.
Є два методи дослідження поведінки програм: метод чорної коробки, коли досліджується залежність поведінки програми від вхідних параметрів, і метод білої коробки, коли досліджується код. Ви ж намагаєтеся проводити дослідження методом сусідньої коробки. Успіхів вам.
Боюся, допомогти вам таки нереально.
Є два методи дослідження поведінки програм: метод чорної коробки, коли досліджується залежність поведінки програми від вхідних параметрів, і метод білої коробки, коли досліджується код. Ви ж намагаєтеся проводити дослідження методом сусідньої коробки. Успіхів вам.
Ну, а тепер правда:
Я майже все дослідив методом чорної скриньки.
А сусідня скринька дуже-дуже близька сусідка з відкритим кодом.
Тож переробити цей код під першу програму цілком реально річ для спеціаліста.
Я майже все дослідив методом чорної скриньки.
І тиждень говорите про все, що завгодно, крім цього. Кастую в гілку P.Y. із лайком Електрика і поясненням, наскільки токсичною (для Електрика: москальською) є така поведінка.
Як спеціаліст вам скажу. Завжди легше написати з нуля, ніж переробляти старий код. Навіть якщо його сам писав рік тому.
Чому? Якщо поведінка функцій однакова для конкретного типу атаки, то тут достатньо буде перевіряти, чи це той тип атаки. Просто обгортка. Не оптимально, але ж заявлена мета не оптимізація, а відтворення поведінки. Та й алгоритм, зрештою, лінійний.
Тому що легше написати функцію по технічному завданні, ніж по коду догадуватись, що вона робить і думати чи вона робить те що треба чи ні.
Але тут техзавдання включає "як у тій функції".
Наприклад, є функція, що визначає, куди може ходити шахова фігура. Нам треба написати функцію, що визначає, куди ходить тура. Звісно, можна переписувати правила рокірування з нуля; але можна просто передавати у першу функцію туру і не морочити собі голову.