За последние 24 часа нас посетили 22643 программиста и 1020 роботов. Сейчас ищут 706 программистов ...

Как должна выглядеть логика pvp?

Тема в разделе "Вопросы от блондинок", создана пользователем Вероломство, 12 мар 2021.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    Игрок 1
    10 юнитов с атакой 7, защитой 1 (70/10), юниты могут погибать

    Игрок 2
    10 юнитов с атакой 4, защитой 2 (40/20), юниты могут погибать
    5 построек с атакой 0, защитой 3 (0/15), постройки не разрушаются (постоянная защита)

    Как примерно нужно строить pvp?

    Чего не хотелось бы: не хотелось бы тупо отдавать победу, тому у кого атака больше.

    Чего хотелось бы: хотелось бы посчитать сколько юнитов погибнет с каждой стороны при таком раскладе :)

    p.s. может у кого опыт есть такой как это хоть примерно можно делается
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Вероломство тебе нужен хаос, а хаос посчитать невозможно, только прокрутить шаг за шагом.
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    unnamed.png
    @Вероломство
    Я как задрот со стажем, могу сказать как обычно это устроено в играх. Про защиту сам подумаешь, а атака вот.
    PHP:
    1. <?php
    2.  
    3. $unit1 = ['Нагибатор 3000 ', 7];
    4. $unit2 = ['Кошечка ', 4];
    5. $move = 3;
    6. $text = ['Ход ', 'наносит удар на '];
    7.  
    8. function attak( $unit )
    9. {
    10.     $dice = rand(1, 100);
    11.  
    12.     return $unit * $dice;
    13. }
    14.  
    15. $result = '';
    16.  
    17. for ($i = 1; $i <= $move; $i++)
    18. {
    19.     $atk_1 = attak( $unit1[1] );
    20.     $atk_2 = attak( $unit2[1] );
    21.  
    22.     $result .= $text[0] . $i . '<br/>';
    23.     $result .= $unit1[0] . $text[1] . $atk_1 . '<br/>';
    24.     $result .= $unit2[0] . $text[1] . $atk_2 . '<br/><br/>';
    25. }
    26.  
    27. echo $result;
    естественно в основном будет побеждать тот у кого атака больше. Но и второй чувак имеет шансы.
    Можно еще добавить шанс промаха, тогда вообще интересно будет) То есть добавить параметр, удачи и крит шанса)

    У меня еще выпало так, при верхнем коде, первому сильно не повезло))
    А по поводу защиты, в героях меча и магии 3 такая формула:
    То есть учитывается больше ли защита относительно атаки противника.
     
    #3 Artur_hopf, 12 мар 2021
    Последнее редактирование: 12 мар 2021
  4. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    это в какой гениальной игре так сделано? даже в линейке такого нет, это даже не БГ, там считается, тут какая-то лотерея с рандомом
    --- Добавлено ---
    @[vs] чёт не считается :)

    например

    юнит 7/1

    юнит 4/2 + защита построек +3 итого 4/5

    теперь первый атачит второго: 7 атаки против 5 защиты = нанёс 2 урона итого, ему прилетело в ответ 4 атаки против 1 защиты = нанёс 3 урона

    3 > 2 победил второй юнит первый юнит убит

    получается что вторые юниты поубивают всех первых без потерь

    короче я понял как сделать: нужно завести учёт урона, например 100 единиц и каждые >= 100 урона удалять юнита там или там
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Да и ещё надо рандом добавить
    --- Добавлено ---
    Шанс критического удара, заметно превышающего очки атаки.
     
    Вероломство нравится это.
  6. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    +++

    крит и уворот есть

    а рандом для чего? типа при ничьей кидать жребий кто победил? :)
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Вероломство крит и уворот выпадают по рандому. Плюс на каждый ход, урон и защиту можно варьировать в пределах нескольких процентов. То есть не считать результат по формуле, а прокручивать шаг за шагом с рандомами.
     
    Вероломство нравится это.
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    С рандомом со временем выясняется забавная штука, что криты (например) могут подолгу не выпадать или могут выпадать по много раз подряд. Это происходит потому, что при подбрасывании монетки шанс выпадения решки 50% не зависимо от всех предыдущих подбрасываний. В доте 2 эту проблему решили с помощью механики псевдорандома. Смысл в том, что на первый удар для события (например того же крита) вероятность выпадения низкая, для второго выше, для третьего еще выше и так повышается, пока крит не выпадет. После выпадения крита вероятность снова сбрасывается на минимальный показатель. Вероятности рассчитываются таким образом, чтобы для события с вероятность в 25 % событие срабатывало в среднем 1 раз в 4 атаки. Но игроки, естессно, абузят эту механику, набивая вероятность об мобов перед сражением с героями. Эту проблему можно решить установкой разных счетчиков, но о чем это я?
    Подобные баги живут в играх годами и никого не парят :)
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Apple ещё при Джобсе сделали рандом в режиме shuffle на айподах, потому что пользователи жаловались на чуть ли не целые альбомы подряд
     
  10. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @TeslaFeo Вы неправильно понимаете шанс выпадения, Вы хотите чтобы из 2-х подбрасываний с шансом 50% выпал шанс как минимум 1 раз, но почему-то молчите потом и не пишите в обратку, что у Вас при шансе 50% из двух раз выпало 2 раза, то есть шанс составил 100% каждый раз и превысил уровень Вашего шанса в два раза :)

    я тоже так канил раньше на обратки в играх, но так не делается, делается шанс на момент попытки, (в некоторых либо забагованных скриптах либо у непонимающих админов я встречал прокачку более 100% - это не логично)

    ещё очень часто делается для облегчения жизни пользователям, покупка чего-то с шансом, но в большом количестве (чтобы не долбить 100 покупок по одной) и пользователи ожидают, что сделав 4 покупки ЗА ОДИН РАЗ с шансом 25% им в любом случае выпадет призовая покупка, так как 25% * 4 = 100%

    это неправильное понятие шанса

    то есть вот у меня есть крит и его шанс в %, возможность его прокачивать до 100%, на данный момент прокачка - 25%, я делаю

    PHP:
    1. if (mt_rand(1, 100) <= $user->krit_chance) echo 'Сработал ШАНС нанесения крита, добавьте ЗНАЧЕНИЕ крита к урону'; // ясен пень шанс крита - это НЕ ЗНАЧЕНИЕ крита
    --- Добавлено ---
    @TeslaFeo и ещё вы писали, что при шансе 25% из 4-х ударов должен один быть с критом, а если за бой я нанёс всего 3 удара и учётка НЕ подогнала мне крит, то получается мой шанс составил 0% и эта очередная причина для какого-то необоснованного недоверия к разрабу :)

    шанс считается на каждую попытку
     
    #10 Вероломство, 13 мар 2021
    Последнее редактирование: 13 мар 2021