Четверг, 08 Декабря 2022, 05:28

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » Формулы, используемые в играх. (Это касается всех игроделов!)
Формулы, используемые в играх.
gil9redДата: Воскресенье, 01 Августа 2010, 15:42 | Сообщение # 1
частый гость
Сейчас нет на сайте
Я думаю для всех игроделов не секрет, что в играх используются игровые формулы:)
я решил создать эту тему для того что бы можно было и новичкам, и опытным узнать новые виды формул.
я сам только начал заниматься созданием игр, но моя первая игра была написана на С++.
это была классическая рпг, т.е. в нее входили статусы(сила, ловкость, и т.д.) и имелся прокач уровней.
если хотите, то можете скачать, я ссылку дам.

вот пример формулы, которую я увидел, когда смотрел игру на Game Maker(этот конструктор имеет скриптовый язык GCL, который похож на С++):
health-=40

это навело на мысль, что формулами новички не так хорошо владеют.
вот например, если после этой формулы дописать проверку:

health-=40
if ( health < 0) { health=0 }

то и результат будет красивее выглядеть, ведь жизни в минус уйти не могут:)

я напишу 3 формулы, взятые из моей игры:

chance_critical_bash = random( 100/agility.warrior )+1; // шанс крит.удара
if (chance_critical_bash == true)
{
damage*=2;
cout << "warrior ATAKYET KPuTOM -> life lich -"
<< damage;
} else
{
cout << "warrior ATAKYET -> life lich -"
<< damage;
}

То, что находится в фигурных скобках (они называются "операторскими") - Вам не понадобится. А сама формула, где присутствует рэндом, эта и важна.
Те, кто еще совсем новичок, могу объяснить:
т.к. это шанс крита, то в рэндоме присутствует частное значений 100 и ловкость героя. 100 - берется как 100% шанс.
Вот пример: если ловкость героя будет 20, то шанс нанесения крита будет равен 20%.
Теперь про само условие: true и false, я расскажу про них. false - это 0, теперь вы наверно подумаете, что true - 1? это почти так, оно любое положительное число. Хотя в логической математике true = 1.
Но с если вы хотите, то можно в условии поставить число, входящее в диапазон рэндома.
если ловкость = 20, то диапазон рандома будет следующим:
0, 1, 2, 3, 4, 5 это объясняется тем, что при выполнении формулы рандом имел значение 6, т.е. включал 0 и по возрастающей +1 (6 - количество цифр).
можно задать и др параметры рэндома, но я на этом подробно останавливаться не буду, те, кому это интересно, почитайте учебники по Я.П.

Аналогично формула уклонения:

chance_evasion = random( 100/agility.warrior )+1;
if (chance_evasion == true)
{
/*
внутри операторских скобок выполняются действия
если условие истинно
*/
}

и последняя формула, которую я опишу:
_damage = power_hero - def_opponent;
if(_damage<0)_damage=0;
life_opponent-=_damage;
if (life_opponent<0)life_opponent=0;

Думаю, с данной формулой вопросов не возникнет:)

Пожалуйста, оставляйте свои комментарии, пожелания, примеры Ваших формул, которые вы используете.

Сообщение отредактировал gil9red - Воскресенье, 01 Августа 2010, 16:06
ezhickovichДата: Воскресенье, 01 Августа 2010, 16:30 | Сообщение # 2
[Великий и могучий хозяинъ]
Сейчас нет на сайте
gil9red, Смысл в данной теме?
Она не повествует ничего нового...
Я думаю любое разумное существо окончившее более 8 классов знает эти формулы...
Если нет я ему не завидую...
Если вы взялись что-то описывать, то извольте делать это в полном объёме...

Quote (gil9red)
health-=40
if ( health < 0) { health=0 }

Неужели есть те кто не поверяют значения важных параметров после их изменения...???

В общем я крайне не благосклонно отношусь к бессмысленным статьям...
И я не думаю что от этой стать хоть кому-то толк...

Quote (gil9red)
_damage = power_hero - def_opponent;
if(_damage<0)_damage=0;
life_opponent-=_damage;
if (life_opponent<0)life_opponent=0;

Насколько всё примитивно...
Это самая сложная формула которая используется в вашей игре?



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
nilremДата: Воскресенье, 01 Августа 2010, 16:42 | Сообщение # 3
Просветленный разум
Сейчас нет на сайте
Quote (gil9red)
что true - 1? это почти так, оно любое положительное число.

gil9red, ты в курсе, что любое отрицательное число тоже true?


Windmill 2

WindMill 2D Game Engine
NimphomaniakДата: Воскресенье, 01 Августа 2010, 16:42 | Сообщение # 4
Квадрат
Сейчас нет на сайте
gil9red, о господи! Матерь Божья! Дева Мария! Пресвятая Богородица! твои формулы просто поразили мое воображение, ты стал моим идолом! я хочу читать твои уроки, делай это! да, да делай еще!




самая легкая книга по С++ тут
ApatiДата: Воскресенье, 01 Августа 2010, 18:53 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Зачем на человека набросились? Он в порыве альтруистических настроений поделился своим опытом, сделал хорошее дело.
Считаете его формулы примитивными? Исправьте это - выложите свои формулы.
WXZRWДата: Воскресенье, 01 Августа 2010, 20:47 | Сообщение # 6
Thousand faces conspiration
Сейчас нет на сайте
Quote (Apati)
Считаете его формулы примитивными?

Не то чтобы я любил поспорить, но господа, обратите внимание - формулы для вычисления урона, патронов, здоровья могут отличаться от проекта к проекту и часть из формулы строится в зависимости от игры и может оперировать любыми коэффициентами. Операторы условия или логики - это не является часть математической формулы - это фрагмент логики в целом. Все вместе - алгоритм вычисления чего-либо.

Можно было бы выложить базовые алгебраические и геометрические формулы, единые для всех случаев, как - операции над матрицами, векторами, кватернионами и чем угодно еще...

Такие вещи как здоровье, или возьмем - уклонение от удара, что пытался показать автор - довольно часто для уклонения делается целый алгоритм, задействующий не только сами формулы но и другие данные, как данные от искуственного интеллекта, данные о геометрии уровня и окружения и т.д., то есть может иметь размер несколько листов формата А4, размер шрифта 10, хотя бы Ариал.

Вычитание по формуле x = x - y, это уровень я не знаю точно... вероятно 5 класса и базовых уравнений. Надо ли об этом писать статью... это другой вопрос.

ApatiДата: Воскресенье, 01 Августа 2010, 21:58 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
WXZRW, то есть не надо выкладывать простые формулы, так как они слишком простые, а более сложные формулы являются частью логики игры и вырывать их из контекста было бы не правильно? В принципе я согласен. Хороший программист не тот, кто знает много формул, а тот, кто может сам при необходимости создать формулу или алгоритм. По этому если уж и писать статью, то ту, которая бы учила логическому мышлению. Или в которой бы изучались предметы геометрии, алгебры и логики, чтобы потом человек мог бы применить эти знания для создания собственных формул.
WXZRWДата: Воскресенье, 01 Августа 2010, 22:46 | Сообщение # 8
Thousand faces conspiration
Сейчас нет на сайте
Quote (Apati)
Хороший программист не тот, кто знает много формул, а тот, кто может сам при необходимости создать формулу или алгоритм.

Именно это я и подразумевал, то что в цитате жирным выделил. Нужно уметь делать свое, на основе базового и т.д.

Quote (Apati)
Или в которой бы изучались предметы геометрии, алгебры и логики, чтобы потом человек мог бы применить эти знания для создания собственных формул.

Да, базовые знания, на основе которых можно собрать что-то свое, под конкретный случай, так как может быть много нюансов и деталей, полностью стандартных алгоритмов обычно мало, часто надо либо оптимизировать либо скорректировать под определенные цели.

snamДата: Воскресенье, 01 Августа 2010, 23:14 | Сообщение # 9
частый гость
Сейчас нет на сайте
То ж хочу форумулу выкласть.

Пазла

Большая картина, поделенная на одинаковые квадратики.
Квадратики нужно перемешать, а потом геймер пусть собирает.
Создаем вторую картинку равную одному квадратику, это наш
буфер для обмена фрагментами мозаики в большой картинке.
Обмен простой. Щелчок мыши на картине.
Горизонтальную координату мыши делим на количество горизонтальных
фрагментов в картине, округляем до целого и умножаем на то же
количество фрагментов (тоже с вертикалью). Получили координаты
фрагмента в картине. Скопировали его в наш буфер. Второй щелчок мыши,
получили второй фрагмент, копируем его в первый, а из буфера во второй.
При перемешивании вместо координат мыши случайные числа в пределах
размера картины. Нашу изменяемую картину сравниваем с такой же,
только собранной и узнаем конец игры.
-----------------------------------------------------------------------
Не зная направление, даже у программистов со стажем на простых (с виду) играх, пупки развязываются.

SoWaДата: Воскресенье, 01 Августа 2010, 23:25 | Сообщение # 10
частый гость
Сейчас нет на сайте
Quote (gil9red)
chance_critical_bash = random( 100/agility.warrior )+1; // шанс крит.удара
if (chance_critical_bash == true) {
damage*=2; cout << "warrior ATAKYET KPuTOM -> life lich -" << damage;
} else {
cout << "warrior ATAKYET -> life lich -" << damage;
}

Аэээ, я глупый?
Условие всегда будет выполняться, или нет?
И если agility.warrior будет 0?


ActionScript-программист. Так же Flash Media Server, C#, PHP. Рисовать не умею и не люблю.
Ищу проект, желательно где есть грамотный менеджер, дизайнер и художник.


Сообщение отредактировал SoWa - Воскресенье, 01 Августа 2010, 23:27
snamДата: Понедельник, 02 Августа 2010, 11:16 | Сообщение # 11
частый гость
Сейчас нет на сайте
RTS (сценарий)

База:
1. Список юнитов, построек, пеньков - одномерный массив, типизированный или секционный, или двухмерный, один хрен.
Каждая секция характеристики игровой единицы, ids, id, x, y, w, h, сдвиги, актив, жизнь, атака, пространственный буфер (волна), ...
2. Глобальный пространственный буфер (гпб) - двух мерный массив, размер карты (пусто не пусто и для быстрого взаимодействия единиц).
3. Буфер (б) - равен одной секции база(1) - (для взаимодействия единиц с задержкой = кол. единиц).
4. N.

Логика:
Сканируем база(1), то есть циклим секции.
1. Виден по xy - отрисовываем (2D, 3D, фиолетово).
2. Подвижен - xy меткой в гпб.
3. Просмотр окружения в гпб (если надо).
4. В буфер (б) - характеристики первой единицы, только на следующем попадании процессора в этот цикл (база(1)) - второго, 3, 4... , прошли круг - по новой.
5. По xy и гпб (зона +- (то биш - если в гпб=пусто & id=враг & x(б)>x-30 & x(б)<x+30 & y(б)>y-30 & y(б)<y+30 то мочим пенька с координатами x(б) y(б))).
6. По xy и гпб (зона +-) жизни упс или обед - делаем ноги.
7. Подвижен + гпб - если не на финише перемещаем в точку финиша (обход препятствий, самое простое 2D - волна (8 сторон)).
8. Если ... то N=номер цикла (работа с секцией за пределами цикла).
9. В 2D, если не правильное наложение спрайтов - меняем соседние секции по координате y.
10. Выделение юнитов - по mx my (зона +-). Если в зоне - актив=true остальные курят.

Управление:
1. Работа с базой: стираем секции, ищем нулевые - заполняем, (меняем характеристики)...

-------------------------------------------------------------------------------------------------
Зная направление, даже у программистов со стажем на rts (простых с виду), пупки развязываются.

ezhickovichДата: Понедельник, 02 Августа 2010, 12:26 | Сообщение # 12
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (SoWa)
Условие всегда будет выполняться, или нет?

ДА...
т.к. chance_critical_bash всегда будет больше 0...



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
gil9redДата: Пятница, 06 Августа 2010, 14:15 | Сообщение # 13
частый гость
Сейчас нет на сайте
Постебаться все горазды, чем предложить что-то путное. если такие умные то покажите на конкретном примере, а флуд не нужно устраивать angry
к тому же, я только начал заниматься игроделанием, так что не надо на меня набрасываться, а помогите лучше советом.

Quote (Nimphomaniak)
gil9red, о господи! Матерь Божья! Дева Мария! Пресвятая Богородица! твои формулы просто поразили мое воображение, ты стал моим идолом! я хочу читать твои уроки, делай это! да, да делай еще!

Уважаемый, это просто кощунство, к вашему сведению.


В программировании нет совершенства, но к нему нужно стремиться. ©
ezhickovichДата: Пятница, 06 Августа 2010, 14:33 | Сообщение # 14
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (gil9red)
Уважаемый, это просто кощунство, к вашему сведению.

Quote (gil9red)
chance_critical_bash = random( 100/agility.warrior )+1; // шанс крит.удара
if (chance_critical_bash == true)
{
damage*=2;
cout << "warrior ATAKYET KPuTOM -> life lich -"
<< damage;
} else
{
cout << "warrior ATAKYET -> life lich -"
<< damage;
}

Индусский код - тоже кощунство =)



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
JohnJДата: Пятница, 06 Августа 2010, 15:20 | Сообщение # 15
участник
Сейчас нет на сайте
Да, если и создавать подобные статьи, ту лучше показывать примеры элегантного, удобного и легко читаемого кода.
Например, вместо
Code
health-=40    
if ( health < 0) { health=0 }

на мой взгляд лучше и понятнее будет:
Code
health = max(health - 40, 0);

Шанс критического удара я бы рассчитывал так:
Code
critical = (random(50 + k * скилл_критических ударов) > 50);

Где k - некий коэффициент, который подбирается при настройке игрового баланса.
И затем рассчитывал damage так:
Code
damage *= (critical) ? 2 : 1;

Или, если язык не поддерживает такую конструкцию, или нужно делать несколько действий в случае критического удара, то
Code
if (critical) {
message = "X атакует Y:";
damage *= 2; // кстати, коэффициент критическому удару тоже лучше делать рандомный: damage *= random(200) / 100 + 1;
message += ' Критический удар!';
}
print message + ' Урон' + damage;

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


Сообщение отредактировал JohnJ - Пятница, 06 Августа 2010, 15:21
Форум игроделов » Программирование » Общие обсуждения программистов » Формулы, используемые в играх. (Это касается всех игроделов!)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг