нужен совет по формуле расчета боя
| |
creativengised | Дата: Четверг, 23 Января 2014, 18:00 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Добрый день уважаемые гуру!
Сразу хочу сказать о том, что я не прошу готовый код, а всего лишь совет о том, как лучше реализовать формулы расчета боя.
Итак. Скажу чего у меня имеется.
1. Есть БД с таблицей users, где помимо регистрационных данных хранятся всевозможные параметры игрока. Полей много. Но если я правильно понимаю, то в расчете урона и отъема хп и выноса, будут задействованы такие как: Сила = 3 Ловкость = 3 Инстинкт = 3 Жизнь = 3 *(3 - стартовое значение навыка, которое игрок будет увеличивать)
Жизнеспособность - зависит от Жизнь*6 + то, что дадут предметы Выносливость - зависит от Сила*6 + то, что дадут предметы
Урон(Мин-Макс) = 1-2 + то, что дадут предметы
Защита_головы + то, что дадут предметы Защита_корпуса + то, что дадут предметы Защита_пояса + то, что дадут предметы Защита_ног + то, что дадут предметы
Крит - базовый берет от Инстинкт*3 + то, что дадут предметы АнтиКрит - базовый берет от Инстинкт*3 + то, что дадут предметы Уворот - базовый берет от Ловкость*3 + то, что дадут предметы АнтиУворот - базовый берет от Ловкость*3 + то, что дадут предметы
Это так сказать те параметры, которые я уже создал и более менее прописал как они считаются, что от чего зависит. (очень надеюсь, что двигаюсь в +/- верном направлении)
Что еще есть? Есть форма, в которой игрок делает выбор. Куда ударить (1 вариант) Что защитить (2 варианта) и в какой позиции он находится в Атакующей или Защитной
После чего из формы через POST уходят данные и попадают на страницу боя.
Вот тут собственно говоря у меня загвоздка случилась. Формул много и в разных играх они по разному прописываются. Потому хотел бы попросить ваших советов, как лучше рассчитать урон игрока, и главное в какой последовательности.
Мне видится картина примерно так (подчеркиваю примерно!!! и именно потому пишу сообщение о помощи)
ЕСЛИ игрок1 походил (т.е. выставил ход) проверяем попал игрок1 или промазал (5% вероятность, что игрок2 увернется)+(Уворот игрок2 + влияние от позиции Защита)-(АнтиУворот игрока1 + влияние от позиции Атака) по логике при защитной стойке уворот должен работать лучше, так же как АнтиУворот при атакующей
ЕСЛИ игрок1 попал, то проверяем обычный удар или критический (5% вероятность, что удар критический)+(Крит игрока1 + влияние от позиции Атака)-(АнтиКрит игрока2 + влияние от позиции Защита) так же как и с уворотом, Крит скорее прилетит при атаке, а ослабить его может как раз Защита соперника
ЕСЛИ удар Крит, урон игрока1 = ВОТ ТУТ у меня как раз сложность... и так, и этак пробовал, что-то все не то. Нужен совет опытных игроделов ЕСЛИ удар Обычный (не Крит) ну вообщем то же нужен совет
+ у меня есть 2 блока, которые выставил игрок, надо бы как то и их учесть, только в каком моменте? допустим удар игрока 1 пришелся в блок 1(голова) переменную по броне я знаю она = $defense_head и значение берет из БД. Вопрос в том, где ее лучше подставить и как правильно вычислить влияние брони. Предположим 2 варианта. Броня_головы = 0 (вообще нет шляпы) и Броня_головы = 5 (надета какая-то шапка). Насколько я правильно понимаю, броня поглощает урон но не выше, своего значения и не всегда на свое максимальное значение, а скорее всего от 1 до своего значения.. Ну эт я так думаю, вот тут нужен ваш совет.
ЕСЛИ удар пробил броню - условие при котором удар пробивает броню (то же надо) дальше понятно, что нужно отнять от Здоровья игрока2 тот урон игрока1 который получился в финале + отнять у обоих немного Выносливости ЕСЛИ удар не пробил броню - условие при котором считается блокировка удара, ну и в любом случае отнять немного выносливости
Теперь. Пожалуй самое геморойное для моего пока неопытного разума. Вот допустим игрок1 завершил свой ход. Так же просчитали и игрока2. Есть некоторые данные и события. Размер урона, сколько хп осталось после удара, куда били, с атаки или с защиты, и все такое.
Все эти данные хотелось бы поместить в лог боя. Понимаю это mysql_query("UPDATE tablename SET .............."); Обновить то не вопрос. Но. Хотелось бы получить лог, который можно будет закрепить за игроками, которые в нем участвовали (где-то в завершенных боях) и главное не просто вбить туда события, а и вывести их потом с оформлением.
Поясню.
Допустим вбить в текстовое поле строку лога наподобии:
00:00:00 Игрок1 ударил с атаки, но Игрок2 увернулся 00:00:00 Игрок1 ударил с атаки, и Игрок2 от защиты нанес критический удар в корпус -10 (8/18)
и потом вывести его в лог НЕ проблема, но он выведется именно так, как и здесь, в черном варианте без оформления, а хотелось бы получить нечто такое:
00:00:00 Игрок1 ударил с атаки, но Игрок2 увернулся 00:00:00 Игрок1 ударил с атаки, и Игрок2 от защиты нанес критический удар в корпус -10 (8/18)
ВОТ тут я немного ломаю мозг. Как это получше создать? Нужен совет. Считаю лог боя неотъемлемой частью боя, и потому хотелось бы прикрутить его для дальнейших анализов.
Заранее благодарен за советы. И еще раз говорю, мне не нужен готовый код. А вот правильное направление мысли бы очень даже было надо Заранее спасибо!
p.s. в принципе намудрить чего-то с формулами и сам могу, но решил спросить как это сделать максимально корректно и пока нет мыслей насчет реализации лога с оформлением, хотя уж думал по разному и так пробовал и этак, все не то, слишком громоздко
User2 у меня сейчас как бы бот, генерирует удар, блоки и позицию, т.е. автоматом совершает ход, хотя вместо него могут так же использоваться данные от реального соперника
и еще в данной модели, у меня только 2 игрока участвуют, возможно это изначально неправильно, тут то же бы хотелось получить консультацию, ведь в перспективе может быть в команде больше, чем 1 игрок, допустим боевой зверь.
Сообщение отредактировал creativengised - Четверг, 23 Января 2014, 18:23 |
|
| |
maker-rus | Дата: Четверг, 23 Января 2014, 22:53 | Сообщение # 2 |
Гений
Сейчас нет на сайте
| Урон по игроку вычисляется стандартно так = урон + (если крит > 0)крит - броня, уклонение вычисляется перед ударом. То есть выглядит это так, до того, как будет вычисляться удар проверяем уклонение если > 0, то вычисляем урон. От урона отнимаем броню. Сам урон например, если он находится в промежутке, то есть так 10-18, то случайно от 10 до 18 выбираем число и обозначаем за урон. Лог можно выводить через тот же только со вставками html. Код echo "hello <font color='red'>world</font>" А в общем вот ссылка, здесь много чего интересно по этому поводу.
Сообщение отредактировал maker-rus - Четверг, 23 Января 2014, 23:04 |
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 01:25 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| maker-rus, спасибо в целом за ответ, но самое забавное то, что все, что вы ответили и я знаю. Вопрос же я задавал в целом для другого, как найти под мою конструкцию оптимальное решение? Ведь формул урона пожалуй столько же сколько типов игр, и если взять игру где на исход влият все юниты то формула будет одна, а если взять как например Carnage или БК, то там считается иначе. У меня скорее ближе к Carnage конструкция.
впрочем вот наваял сам, с комментариями чего для чего
Код //если игрок 1 и игрок 2 походили if((!empty($u1_attack))AND(!empty($u1_defense1))AND(!empty($u1_defense2))AND(!empty($u1_position)) AND(!empty($u2_attack))AND(!empty($u2_defense1))AND(!empty($u2_defense2))AND(!empty($u2_position))){ if($u1_position==1)$u1_critical_hit*=2; //позиция Атака дает прирост Криту *2 if($u1_position==1)$u1_anti_dexterity*=2; //позиция Атака дает прирост АнтиУвороту *2 if($u1_position==2)$u1_anti_critical_hit*=2; //позиция Защита дает прирост АнтиКриту *2 if($u1_position==2)$u1_dexterity*=2; //позиция Защита дает прирост Увороту *2 if($u2_position==1)$u2_critical_hit*=2; //позиция Атака дает прирост Криту *2 if($u2_position==1)$u2_anti_dexterity*=2; //позиция Атака дает прирост АнтиУвороту *2 if($u2_position==2)$u2_anti_critical_hit*=2; //позиция Защита дает прирост АнтиКриту *2 if($u2_position==2)$u2_dexterity*=2; //позиция Защита дает прирост Увороту *2
//ИГРОК1 $u1_event1="$u1_login ударил"; //проверка попал игрок1 в противника или нет $dexterity=rand(1,100); //определим случайное значение уворота $trigger=rand(1,($u2_dexterity-$u1_anti_dexterity)); //триггер = Уворот игрока2 - АнтиУворот игрока1 //уворот сработает либо при 5% if($dexterity<=5){ $u1_event2=", но $u2_login увернулся"; } //либо если значение триггера окажется выше случайного числа elseif($dexterity<=$trigger){ $u1_event2=", но $u2_login увернулся"; } //проверка обычный удар или критический else{ $critical_hit=rand(1,100); //определим случайное значение уворота $trigger2=rand(1,($u1_critical_hit-$u2_anti_critical_hit)); //триггер = Крит игрока1 - АнтиКрит игрока2 //крит сработает либо при 5% if($critical_hit<=5){ //если удар попал в блок1 if($u1_attack==$u2_defense1){ $u1_event2=", но $u2_login заблокировал удар"; } //если удар попал в блок2 elseif($u1_attack==$u2_defense2){ $u1_event2=", но $u2_login заблокировал удар"; } else{ //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости) $damage=(rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))))*2; $u1_event3=" и нанес критический урон -$damage"; } } //либо если значение триггера окажется выше случайного числа elseif($critical_hit<=$trigger2){ //если удар попал в блок1 if($u1_attack==$u2_defense1){ $u1_event2=", но $u2_login заблокировал удар"; } //если удар попал в блок2 elseif($u1_attack==$u2_defense2){ $u1_event2=", но $u2_login заблокировал удар"; } else{ //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости) $damage=(rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))))*2; $u1_event3=" и нанес критический урон -$damage"; } } else{ //если удар попал в блок1 if($u1_attack==$u2_defense1){ $u1_event3=", но $u2_login заблокировал удар"; } //если удар попал в блок2 elseif($u1_attack==$u2_defense2){ $u1_event3=", но $u2_login заблокировал удар"; } else{ //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости) $damage=rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))); $u1_event3=" и нанес урон -$damage"; } } } //ИГРОК2 }
ИГРОК2 пока не прописывал, еще с 1м не полностью разобрался, но надеюсь разберусь. Но все же буду очень благодарен за дельные советы в этом направлении. Ведь наверняка есть люди, которые эти алгоритмы уже прописывали и знают о подводных камушках. Заранее спасибо, за совет, а не за ссылку на гугл.
maker-rus а насчет вывода лога, то как бы не вижу проблем как его показать в хтмл или пхп коде, сложность в другом, как корректно создать таблицу в БД и какие туда вложить поля кроме id-поединка?
Может быть надо связывать несколько таблиц? У кого есть опыт буду рад выслушать концепцию. Понимаю, что лог должен дописываться в таблицу и выводится по строчно с сортировкой по времени. Ок. Еще раз говорю, чернобелую запись лога я могу соорудить, вписав в текст без всяких переменных просто текст и выведя его потом из БД. Это не проблема.
НО! Хочется получить лог с переменными, которые можно оформить различными стилями. А для этого я так понимаю, уже простого текста не достаточно. Да и потом ведь в поединке может участвовать более, чем 2 участника, отсюда и вопрос с перспективой, как грамотно выстроить таблицу для лога боя?
Сообщение отредактировал creativengised - Пятница, 24 Января 2014, 01:37 |
|
| |
lvovand | Дата: Пятница, 24 Января 2014, 02:55 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| заменил бы кучу if на switch - case, правильнее и удобнее
Для логов можешь задать в таблице id игроков, кто кого ударил, и числовые значения типов ходов и результатов ходов, а соответствующий им текст в файле конфига или в другой таблице, и не надо будет кучу лишнего текста сохранять
Разработка и продвижение сайтов. Дизайн
|
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 08:09 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| lvovand, если я понял правильно (насчет логов) то это должно выглядеть примерно так?
id login hod event1 event2 event3 event4 event5 1 vasya 1 2 1 0 1 22
где каждое число под эвентом(событием) = какой-то фразе например ударил, увернулся, нанес урон, значение урона и тп
а потом это считать в обычный лог и вывести, подставляя нужные слова и фразы
так?
|
|
| |
lvovand | Дата: Пятница, 24 Января 2014, 12:11 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| creativengised, да, сдинственно я думал что и второй игрок туда же
id id_player1 event_player1 id_player2 event_player2
1 10 100 1 1 2 2 условно, Вася ударил а Петя увернулся.
И в анчале пишешь, что хранишь все игровые данные вместе с регистрационными, я бы лучше сразу игровые в отдельную таблицу выносил, вдруг придумаешь сделать несколько персонажей у одного игрока и придется глобально переделывать
Разработка и продвижение сайтов. Дизайн
|
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 12:52 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| lvovand, была задумка сделать отдельно таблицу char (персонаж) но честно говоря смены чаров не подразумевается, и чтобы не накосячить с данными решил хранить их в таблице юзеров, идейку с логом понял - огромное спасибо, постараюсь реализовать!
Действительно ларчик просто открывался
Хотя наверно поспешил ((( вот смотри допустим есть ход Васи и такая строка (row) Вася ударил а Петя увернулся. а следующий ход Вася попадает и уже получается Вася ударил и нанес урон ХХХХ т.е. еще одна строка (row) вот тут я честно говоря теряюсь, по идее в одной временной таблице боя такое можно реализовать, добавляя нужные строки, но я не думаю, что резонно создавать под каждый поединок таблицу.
Видимо я не до конца понял конструкцию БД. Хотя идея в целом понятна и действительно удобна, подменять текст числовыми значениями.
Прошу если не затрудтнит lvovand, можно схематично изобразить таблицу и что откуда вызывается?
Может быть я немного коряво понимаю, но структура БД должна быть такой:
таблица Battles где id = просто id записи как таковой... дальше id_battle (где записывается уникальный номер поединка) и дальше события Event1 Event2 Event3 и тд... а параллельно сделать таблицу куда добавлять id (тот самый уникальный id поединка) user1_id user2_id тогда можно повытаскивать, но почему то мне кажется, что это утопия, т.к. если юзеров в бою окажется больше 2х, то куда вписывать третьего? А если 100 юзеров в каком нибудь хаоте? Может быть наоборот у юзера хранить где-то запись о проведеном поединке? Но тогда это уже 3я дополнительная таблица причем каждому юзеру
Сообщение отредактировал creativengised - Пятница, 24 Января 2014, 13:32 |
|
| |
lvovand | Дата: Пятница, 24 Января 2014, 13:29 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| схема примерно уже наверно понятна, а чтобы был урон или уворот, добавишь просто еще полей для результата хода
id id_player1 event_player1 res_player1 id_player2 event_player2 res_player2
и результат урон, или уворот пишешь в те поля, из-за пары полей новую таблицу скорее всего нерезонно
Разработка и продвижение сайтов. Дизайн
|
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 16:38 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
|
lvovand, все получилось, осталось мелочи доработать, но главное, что хотел получилось спасибо за совет!
|
|
| |
|