IPB

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Исходники игры
sergroj
сообщение 27 Aug 2012, 11:24
Сообщение #41

В миру GrayFace
Сообщений: 2 529
Спасибо сказали: 817 раз




Цитата(IvanSav @ 27 Aug 2012, 04:51) *
Учитывая что размер исходников будет в районе 100k строк (это размер кода vcmi) выискивать то не знаю что в этом море текста просто нереально.

Ну да, найти то не знаю что еще никому нигде не получалось. А такие конкретные вещи - без проблем.


--------------------
ДНК банана на 50% состоит из человека.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
IvanSav
сообщение 27 Aug 2012, 12:18 (Сообщение отредактировал IvanSav - 27 Aug 2012, 12:50)
Сообщение #42

VCMI developer
Сообщений: 377
Спасибо сказали: 690 раз




Цитата
Код позволил бы понять, что всё, относящееся к объектам, в Героях в первую очередь привязано к клеткам, это фундаментальная штука, а не маленькая фишка. :-)

Ну я подозревал это с тех пор как узнал об этой баге.
Самая интересная часть это додуматься связать эту фишку с фонтаном - заметить что у фонтана есть две клетки, вспомнить про эту фишку, сделать выводы.
Цитата
Это легко проверяется без кода.

Согласен. Это я привел просто для примера. Но шанс что кто-то начнет высматривать как устроены родные земли (это же очевидно!) довольно мал.
Цитата
А вот, скажем, смертельный взгляд могучих горгон у вас как работает?

Сам код вот:
http://sourceforge.net/apps/trac/vcmi/brow...?rev=2848#L5258
В этой части кода я не очень разбираюсь, так что могу и ошибиться.
mean = кол-во горгон / 10
если mean вышел больше 1 - берем случайное значение с распределением Пуассона - http://ru.wikipedia.org/wiki/Распределение_Пуассона
затем с вероятностью 10% добавляем еще одно существо.
EDIT: вероятность = 10 * кол-во горгон. Если горгон 10+ - гарантировано убъет одно существо.

Работает только с живыми - на это проверка отдельно стоит.

Кстати - там бага. mean всегда будет целым - нужно было к double привести


--------------------
Слава Україні!
Go to the top of the pageAdd Nick
 
+Quote Post
Vizit0r
сообщение 27 Aug 2012, 12:22 (Сообщение отредактировал Vizit0r - 27 Aug 2012, 12:22)
Сообщение #43

Immortal
Сообщений: 1 437
Спасибо сказали: 2149 раз




вот так и ошибки находятся)


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Эроласт
сообщение 27 Aug 2012, 12:32 (Сообщение отредактировал Erolast - 27 Aug 2012, 12:32)
Сообщение #44

Зануда
Сообщений: 2 238
Спасибо сказали: 2899 раз




Зато, имея исходники, можно было бы сделать нормальную поддержку для Win 7 и нормальный запуск не_в_аккаунте_администратора


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 12:55 (Сообщение отредактировал Sav - 27 Aug 2012, 12:58)
Сообщение #45

Immortal
Сообщений: 9 448
Спасибо сказали: 4000 раз




Вот как действует смертельный взгляд в игре:
За каждое существо в атакующем стеке берётся случайное число от 1 до 100 и считается, сколько всего выпало чисел, меньших или равных 10 (т. е. у каждого существа в стеке 10% шанс убить).
Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму. Т. е. горгоны никогда не убивают больше (1 + [количество атакующих]/5 (с округлением вверх)) существ взглядом.
Ну и потом количество урезается до количества существ в атакуемом стеке, если надо.
При этом эффект срабатывает в обход функций наложения заклинания, поэтому единственное условие срабатывания - флаг "живое существо" у атакованного (ну и выпавший хотя бы у одного существа шанс убить).

Предполагаю, что первый пункт воспроизводится распределением Пуассона (хотя я недостаточно знаком с этими вещами, чтобы, бегло просмотрев статью, сказать наверняка). А вот второй пункт - никак.

Цитата(Erolast)
Зато, имея исходники, можно было бы сделать нормальную поддержку для Win 7 и нормальный запуск не_в_аккаунте_администратора

Насколько я понимаю, проблема тут исключительно в использовании реестра. А это исправлено в Эре, исходники которой в свободном доступе.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
IvanSav
сообщение 27 Aug 2012, 13:04
Сообщение #46

VCMI developer
Сообщений: 377
Спасибо сказали: 690 раз




Erolast,
Помню как разработчики с gog.com жаловались что сегодня запустить то, что было сделано под 95ю/98ю винду сложнее чем то, что было сделано под дос. И это имея исходники - там ужасный код, который нереально портировать.
С тройкой подозреваю все не настолько плохо но не удивлюсь если через несколько лет это изменится.

А VCMI под линухой вполне себе умеет запускаться без админа и с правами только чтение на папку игры.

Sav,
Благодарю, ограничение проверю, все остальное уже и так как надо.


--------------------
Слава Україні!
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 11 Sep 2012, 10:36
Сообщение #47

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму. Т. е. горгоны никогда не убивают больше (1 + [количество атакующих]/5 (с округлением вверх)) существ взглядом.

Как называется функция округления вверх? Получается, 1 гр. горгона может убить 2 лазурика?
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 11 Sep 2012, 11:07
Сообщение #48

😸🧡✊✌️
Сообщений: 16 479
Спасибо сказали: 3376 раз




> Как называется функция округления вверх?
Обычно ceil().


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 11 Sep 2012, 11:52
Сообщение #49

Immortal
Сообщений: 9 448
Спасибо сказали: 4000 раз




Функции округления вверх не используется, просто (X + 9)/5.
Одна горгона двух не убьёт из-за механизма подсчёта. (X + 9)/5 - это просто максимум, срезающий слишком большие значения, в случае 1 горгоны он просто никогда не сработает.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 11 Sep 2012, 12:19 (Сообщение отредактировал AlexSpl - 11 Sep 2012, 12:26)
Сообщение #50

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Пока не встречал округления вверх в Героях, поэтому и спросил. Ещё недавно закончился турнир, в котором часть прохождения была завязана на абилке гр. горгон. Теперь некоторые игроки утверждают, что вероятность срабатывания абилки много меньше 10%. Решил вот поинтересоваться

Обычно в Героях значение, полученное в результате операций с дробными числами и отражающее перечислимые объекты, ограничивают снизу 1 (единицей), предварительно округлив вниз результат дробной операции. Вот и возникло у меня такое соображение: может, кол-во погибающих юнитов равно max(1, [N/5]), где N - количество атакующих горгон?

Ещё неясен момент с вероятностью:
Цитата
За каждое существо в атакующем стеке берётся случайное число от 1 до 100 и считается, сколько всего выпало чисел, меньших или равных 10 (т. е. у каждого существа в стеке 10% шанс убить).
Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму.

Какова вероятность того, что абилка сработает для 1, 10, 100, 1000 горгон?

Цитата
Ну и потом количество урезается до количества существ в атакуемом стеке, если надо.

Если ещё и этот момент учесть, то будет так: min(Nd, max(1, [Na/5])), где Na - количество атакующих гр. горгон, Nd - кол-во атакуемых гр. горгонами существ.
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 11 Sep 2012, 13:15
Сообщение #51

Immortal
Сообщений: 9 448
Спасибо сказали: 4000 раз




Цитата(AlexSpl)
Обычно в Героях значение, полученное в результате операций с дробными числами и отражающее перечислимые объекты, ограничивают снизу 1 (единицей), предварительно округлив вниз результат дробной операции. Вот и возникло у меня такое соображение: может, кол-во погибающих юнитов равно max(1, [N/5]), где N - количество атакующих горгон?

Там нет никаких дробей, у горгон всё считается в целых числах. Грубо говоря:
Код
int x = 0;
for (int i = 0; i < gorgons_count; i++)
{
  if (1 + rand()%100 <= 10) x++;
}
x = min(x, (x + 9)/5);
x = min(x, enemy_count);

int killed_count = x;


Цитата(AlexSpl)
Какова вероятность того, что абилка сработает для 1, 10, 100, 1000 горгон?

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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 11 Sep 2012, 13:24 (Сообщение отредактировал AlexSpl - 11 Sep 2012, 13:27)
Сообщение #52

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Интересный фрагмент, сочетающий в себе и вероятность срабатывания абилки и кол-во убиваемых существ, т.е. вероятность того, что абилка не сработает равна P[killed_count == 0].

Выражение rand()%100 может принимать значения от 0 до 99. Надо будет прикинуть теперь вероятности.
Go to the top of the pageAdd Nick
 
+Quote Post
AVS
сообщение 11 Sep 2012, 13:30
Сообщение #53

VCMI developer
Сообщений: 97
Спасибо сказали: 78 раз




Цитата(AlexSpl @ 11 Sep 2012, 13:19) *
Ещё неясен момент с вероятностью:
Цитата
За каждое существо в атакующем стеке берётся случайное число от 1 до 100 и считается, сколько всего выпало чисел, меньших или равных 10 (т. е. у каждого существа в стеке 10% шанс убить).
Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму.

Какова вероятность того, что абилка сработает для 1, 10, 100, 1000 горгон?



Вроде так:
1) для 1 10%
2) для 10 65%
3) для 100 99,99%
4) для 1000 еще ближе к 100%
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 11 Sep 2012, 16:04 (Сообщение отредактировал AlexSpl - 12 Sep 2012, 13:20)
Сообщение #54

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Вроде так:
1) для 1 10%
2) для 10 65%
3) для 100 99,99%
4) для 1000 еще ближе к 100%

Так оно и есть, но это частный случай.

Вероятность того, что для N горгон сумма
Цитата
int x = 0;
for (int i = 0; i < gorgons_count; i++)
{
if (1 + rand()%100 <= 10) x++;
}

окажется равной S равна P[N, S] = C(N, S) * p^S * (1 - p)^(N - S),
где C(N, S) = N! / (S! * (N - S)!) - число сочетаний из N по S, p = 0,1 (10%).

Подставляя p = 0,1 в формулу, получим

P[N, S] = C(N, S) * 0,1^S * 0,9^(N - S)

Найдём теперь вероятность того, что N горгон убьют K существ только за счёт их абилки.
Цитата
x = min(x, (x + 9)/5);

Поэтому вероятность того, что N горгон убьют K существ только за счёт своей абилки равна:
Код
-- SUM{i} P[N, i], при K <= X;
-- 0,              при K > X,

где X = min(Nd, [(N + 9) / 5]),
Nd - кол-во существ в атакуемом отряде,
а суммирование осуществляется по всем i таким, что min(i, [(i + 9)/5]) = K.

min(i, [(i + 9) / 5]) =
Код
-- i = K при K < 2;
-- [(i + 9) / 5] = K при K > 2.


!!! Случай K = 2 следует рассмотреть отдельно, т.к. min(1, [(1 + 9)/5]) = 1, а не 2.

Упростим второе условие:
Код
K <= (i + 9) / 5 < K + 1
5K <= i + 9 < 5K + 5
5K - 9 <= i < 5K - 4

Т.к. i - целое число, то последнее неравенство можно заменить на эквивалентное:
5K - 9 <= i <= 5K - 5

Окончательно получим, что искомая вероятность P[N, killed_count == K] равна
Код
-- C(N, K) * 0,1^K * 0,9^(N - K),      при K < 2;
-- SUM{2 <= i <= 5} P[N, i],           при K = 2;
-- SUM{5K - 9 <= i <= 5K - 5} P[N, i], при 2 < K <= min(Nd, [(N + 9)/5]);
-- 0,                                  при K > min(Nd, [(N + 9)/5]).


Например, вероятность того, что для 10 горгон абилка не сработает равна
P[10, killed_count == 0] = C(10, 0) * 0,1^0 * 0.9^10 = 34,9%.
Go to the top of the pageAdd Nick
 
+Quote Post
AVS
сообщение 11 Sep 2012, 17:30 (Сообщение отредактировал AVS - 11 Sep 2012, 17:35)
Сообщение #55

VCMI developer
Сообщений: 97
Спасибо сказали: 78 раз




Интереснее матожидание количества убитых юнитов.

В VCMI именно от него и считают (1/10 от количества коров). В оригинале также получается?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 11 Sep 2012, 17:44 (Сообщение отредактировал AlexSpl - 12 Sep 2012, 13:23)
Сообщение #56

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
В VCMI именно от него и считают (1/10 от количества коров). В оригинале также получается?

Если это так, то это далеко не очевидно. Нужно проверять.

Поправил условия. Выделил частный случай K = 2.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 12 Sep 2012, 13:47
Сообщение #57

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Интереснее матожидание количества убитых юнитов.

M[10] = 1 * P[10, killed_count = 1] + 2 * P[10, killed_count = 2] + 3 * P[10, killed_count = 3], т.к. остальные слагаемые равны 0 (10 горгон убивают 3 юнита максимум).

P(10, killed_count = 0) =
= 0,9^10 = 0,3486784401;
P[10, killed_count = 1] =
= 10 * 0,1 * 0,9^9 = 0,387420489;
P[10, killed_count = 2] =
= P[10, 2] + P[10, 3] + P[10, 4] + P[10, 5] = 0,1937102445 + 0,057395628 + 0,011160261 + 0,0014880348 = 0,2637541683;
P[10, killed_count = 3] =
= P[10, 6] + P[10, 7] + P[10, 8] + P[10, 9] + P[10, 10] = 1 - (P[0] + P[1] + P[2]) = 0,0001469026.

Тогда M[10] = 0,387420489 + 2 * 0,2637541683 + 3 * 0,0001469026 = 0,9153695334.

Программа даёт:
Код
M[1] = 0.100000
M[2] = 0.200000
M[3] = 0.299000
M[5] = 0.490970
M[10] = 0.915370
M[15] = 1.247316
M[20] = 1.497930
M[50] = 2.354309
M[100] = 3.399622



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 13 Sep 2012, 09:16 (Сообщение отредактировал AlexSpl - 13 Sep 2012, 09:45)
Сообщение #58

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Начал проверять теорию на практике и обнаружил, что 100 Могучих Горгон убивают далеко не 3 существа в среднем, как обещает теория. На самом деле абилка Могучих Горгон работает не так, как описал Sav. Действительно, у каждого существа в отряде есть 10% шанс убить одно существо в атакуемом отряде, однако они не могут убить больше чем ceil(N/10) существ своей абилкой, где N - количество Могучих Горгон, ceil() - округление вверх (функция не вызывается явно). Т.е. 1 горгона убивает максимум ceil(1/10) = 1 существо, 10 горгон - ceil(10/10) = тоже 1 существо, 11 горгон - ceil(11/10) = уже 2 существа и т.д. Иными словами, всё намного проще...

Тогда вероятность P[N, K] того, что N горгон убьют K существ только за счёт своей абилки равна
Код
-- C[N, K] * 0,1^K * 0,9^(N - K),        при K < ceil(N/10);
-- 1 - SUM{0 <= i < ceil(N/10)} P[N, i], при K = ceil(N/10);
-- 0,                                    при K > ceil(N/10).


Математическое ожидание (M[N]) количества погибающих существ при атаке N горгонами (Mathcad):
Код
N   |  M[N]
---------------
1   |  0.100000
2   |  0.190000
3   |  0.271000
5   |  0.409510
10  |  0.651322
15  |  1.245066
20  |  1.486676
25  |  2.119910
30  |  2.362563
40  |  3.258807
50  |  4.167839
75  |  6.695542
100 |  8.813212
200 | 18.314546
500 | 47.328320

Как видно, отношение M[N] / N тем ближе к 0.1, чем больше количество горгон в отряде*
* Начиная с некоторого N, когда основной вклад в мат. ожидание вносит P[N, ceil(N/10)]

Теперь это больше похоже на правду.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 13 Sep 2012, 11:15 (Сообщение отредактировал Sav - 13 Sep 2012, 11:16)
Сообщение #59

Immortal
Сообщений: 9 448
Спасибо сказали: 4000 раз




Хм, я дейстительно ошибся на одно деление на 2, там и вправду ограничение (N + 9)/10.

Только непонятно - почему с гораздо более мягким ограничением сверху (N + 9)/5 для 100 горгон получилось всего 3 убийства в среднем?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 13 Sep 2012, 14:13 (Сообщение отредактировал AlexSpl - 13 Sep 2012, 14:14)
Сообщение #60

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Только непонятно - почему с гораздо более мягким ограничением сверху (N + 9)/5 для 100 горгон получилось всего 3 убийства в среднем?

Из-за описки:
Код
int x = 0;
for (int i = 0; i < gorgons_count; i++)
{
  if (1 + rand()%100 <= 10) x++;
}
x = min(x, (x + 9)/5);

Нужно:
Код
int x = 0;
for (int i = 0; i < gorgons_count; i++)
{
  if (1 + rand()%100 <= 10) x++;
}
x = min(x, (gorgons_count + 9)/5);


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 13 November 2025 - 22:08
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика