Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление боевых единиц 
:(
    Опции темы
DarlkElfTen
Дата 30.10.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.3.2006

Репутация: 1
Всего: 1



а у пехоты?? smile 
--------------------
"Две башни"
PM MAIL ICQ   Вверх
knut
Дата 31.10.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Добрый день
Вот переделанный вариант вычисление боевых единиц 
Цитата

                //Calculate Accoursy 
    u_Distance = ptT->GetDistance();
    if((u_Distance < 100) && (u_Distance > 0))
    {
  int n  = rand()%10;
  if(n%2 == 0)
  {
    b_Hit = true;
    return ptT->GetAccuracy();
  }
  else
  {
     b_Hit = false;
    ptT->m_accuracy = 0;
    return ptT->m_accuracy;
  }
    }
    else
    {
  b_Hit = false;
  ptT->m_accuracy = 0;
  return ptT->m_accuracy;
    }

                   /// Calculate FireRate
           
                    if((u_Distance < 100) && (u_Distance > 0))
          return ptT->GetFireRate();
     else
         u_FireRate = ptT->GetFireRate()/u_Distance;
     return u_FireRate;
        
                            ///Calculate Armor 
    if(b_Hit)
    {
    if((u_Distance < 100) && (u_Distance > 0))    
      return ptA->m_Power - (ptA->m_Power * ptT->m_Armor);
    else
    return (ptA->m_Power/u_FireRate) - (ptA->m_Power * ptT->m_Armor);
    }
    else
    return ptA->m_Armor;

   
                               /// Calculate Life and retuen Result

    // = ptA->GetLife();
    u_Life = ptA->m_Armor + ptA->m_Life;
    if(u_Life < 0)
    b_Life = false;
    else
    {
     b_Life = true;
     return u_Life;
    } 

какие будут замечания?



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
DarlkElfTen
Дата 31.10.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.3.2006

Репутация: 1
Всего: 1



кхм...я не привык к коду на cи...но как тока вникну сразу напишу что не таг)
зы: если "этот нетаг" есть)
--------------------
"Две башни"
PM MAIL ICQ   Вверх
dereyly
Дата 2.11.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 2
Всего: 4



Код

  int n  = rand()%10;
  if(n%2 == 0)
  {
    b_Hit = true;
    return ptT->GetAccuracy();
  }

Под розыгрышем я имелл несколько другое... вот мы берем к примепру шанс попасть танком в пехоту... ну потом смотрим попал не попал
 
Код

   ac=ptT->GetAccuracy(); // число от 0 до 1
  n=((double)(rand()+1)/(RAND_MAX+2)); //рандом от 0 до 1, т.е разыгрываем шанс попадение
if (ac>n)
   b_Hit=true

Можно шкалу попал не попал разбить на несколько частей попал круто попал или задело взрывной волной... или ввести нечеткие правила попадения с графиком /\

PM MAIL   Вверх
knut
Дата 2.11.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



dereyly, ну я и розыгрываю . беру число рандом в диапазоне0-10 если оно четное то попал если нет то прамазал.что не так?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
dereyly
Дата 2.11.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 2
Всего: 4



Цитата(knut @ 2.11.2006,  16:59)
dereyly, ну я и розыгрываю . беру число рандом в диапазоне0-10 если оно четное то попал если нет то прамазал.что не так?

Я так и понял что ты так делаешь, но это неправильно
ты разыгрываешь вероятность встречи с динозавром, либо встречу либо нет...
Но точность попадания это функция от дистанции, техники которая стреляет и т.д. мы вычислили эту функцию.. она должна вернуть некое число от 0 до 1 что соответствует шансу попасть.... а затем мы смотрим попал или не попоал в зависимости от этого шанса (не 50% а ac%)... при этом разыгрываем мы число n и просто сравниваем 
if (ac>n)
   b_Hit=true


Это сообщение отредактировал(а) dereyly - 2.11.2006, 18:02
PM MAIL   Вверх
Shurr
Дата 3.11.2006, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: нет
Всего: 7



knut
Извиняюсь что вмешиваюсь в уже развитую дискуссию, но хотелось бы высказать некоторые мысли. Глядя на обсуждение сразу в глаза бросается один факт - разработка ведется "от кода" а не "от идеи". Как мне кажется, правильнее было бы для начала определиться с боевой системой, а уже затем воплощать ее в коде.

Систему можно описать множеством параметров юнитов и их влиянием на исход боя. Также можно учитывать внешние факторы. Если все это формализовать, а не оставлять по принципу "додумаю когда буду писать код" - тогда описание системы будет достаточно прозрачным, и его будет легко воплотить в коде. К тому же людям, участвующим в обсуждении будет проще оценить результат, если для этого не надо будет читать вырезки из кода.

Для примера, попробую описать примитивные системы взаимодействия.

Для начала надо определиться, что подразумевается под боем. Навскидку можно предложить два разных варианта:
1. Каждое воздействие (выстрел, удар) происходит отдельно, его результаты отображаются пользователю.
2. Рассматривается комплексное взаимодействие, т.е. при встрече юнитов происходит последовательность отдельных воздействий до тех пор, пока один из юнитов не погибнет. Пользователь видит лишь конечный результат.

Для первой ситуации будет характерна система с более развитым количеством характерстик юнита, т.к. пользователь видит результаты каждого воздействия, видит, кто кому какой урон наносит, может сравнить. Во второй ситуации пользователь видит лишь результат: кто погиб, и сколько очков жизни осталоь у противника, поэтому развитая система характеристик ИМХО будет не столь интересна.

Теперь немного по характеристикам.

Начнем с элементарного. Допустим, у юнита имеется два параметра, влияющих на исход боя:
- очки жизни (L)
- наносимый урон (Z)

При атаке из очков жизни атакуемого вычитается наносимый урон атакующего. Тогда воздействие одного юнита (u1) на второго можно оценить так:
L(u2) = L(u2) - Z(u1)
Если L(u2) достигает отметки 0 - юнит погибает.

Теперь попробуем немного усложнить систему. Введем еще два параметра:
- точность попадания (A)
- увертливость (D)

Точность попадания - коэффициент (в процентах), который характеризует шанс юнита попасть в противника. 
Увертливость - коэффициент (в процентах), который характеризует шанс юнита уклониться от попадания.
Т.о. коэффициент попадания (M) составляет
M(u1) = A(u1) - D(u2),
т.е. попадание состоится с вероятностью M%. Если попадание состоялось - тогда, соответственно:
L(u2) = L(u2) - Z(u1)
если не состоялось - что ж, на нет и суда нет.

Что можно привести в качестве примера? Тот же танк. Он большой и неповоротливый, и его увертливость очень мала. Точность попадания - чуть выше средней. Пехота. Увертливость высокая. Если кто играл в С&C и пробовал стрелять из танка по пехоте - поймет пример гораздо легче. Пехота может нанести много выстрелов по танку (но с небольшим уроном), пока он наконец-то не попадет в них (что обычно смертельно). (Гораздо легче было давить их гусеницами, но это уже другой разговор).

Введем такой параметр как броня (B). 
Что делает броня? Она поглощает часть урона во время атаки. Т.о. если попадание состоялось, то его влияние на очки жизни с учетом брони будет составлять:
L(u2) = L(u2) - Z(u1) + B(u2) при условии что Z(u1) - B(u2) > 0
Если же Z(u1) - B(u2) <= 0 - тогда L(u2) остается неизменным.

Пример? Попадание в пехотинца в бронежилете причиняет ему гораздо меньший урон, нежели попадание в пехотинца без бронежилета. Яркий пример? Разработчики Civilization наконец-то додумались до того, что индеец с копьем чисто физически не может нанести повреждение танку, даже если он его будет бить долго и нудно (наносимый урон индейца меньше уровня брони танка, т.е. при каждом ударе броня полностью поглощает урон).

Теперь можно подумать о внешних параметрах, влияющих на исход атаки. Самый простой и понятный – расстояние (S). У юнита есть максимальная дальность атаки ( R). Если дальность атаки больше расстояния между юнитами – атака невозможна. Если меньше или равна – атака возможна, но расстояние влияет на исход. Каким образом? Допустим так:
Если расстояние между юнитами составляет больше чем половину максимальной дальности атаки – на точность попадания накладывается штраф (P). Штраф вычисляется как расстояние между точкой, которая является серединой максимальной дальности атаки (т.е. крайней точкой, на которой не накладывается штраф) и атакуемым, выраженное в процентах от максимальной дальности атаки атакующего юнита (во загнул). Т.е.:
P(u1) = (S – R(u1)/2)/( R(u1)/100) = 
(S - R(u1)/2)*100/R(u1) = 
100*S/R(u1) – 50, при условии что S - R(u1)/2 > 0, т.е. расстояние между юнитами больше половины максимальной дальности атаки атакующего юнита. 
Данная величина колебнется в пределах [0;50], т.е. на максимальной дальности S = R(u1) атаки процент попадания дополнительно уменьшается на 50%.
Т.о. коэффициент попадания составляет:
M(u1) = A(u1) - D(u2), при условии что S - R(u1)/2 <= 0 и
M(u1) = A(u1) - D(u2)– P(u1) = 
A(u1) - D(u2) – (100*S/R(u1) – 50) = 
A(u1) - D(u2) – 100*S/R(u1) + 50, при условии что S - R(u1)/2 > 0
И с этой вероятностью произойдет попадание, которое по-прежнему составит 
L(u2) = L(u2) - Z(u1) + B(u2) при условии что Z(u1) - B(u2) > 0

Чем еще можно дополнять данную систему? Всем чем угодно. 
Можно установить у оружия радиус действия, который при увеличении расстояния будет уменьшать штраф на коэффициент попадания, но снижать силу попадания.
Можно добавить штрафы за низкое количество очков жизни (сильно раненый пехотинец и подстреленный танк стреляют не так метко, если это рукопашная – можно и силу удара уменьшать).
Можно добавить вероятность критического попадания, которое отнимает гораздо больше очков жизни.
Можно сделать броню разрушающейся, т.е. после критического попадания (или по другому какому условию) броня некоторое время не действует.
Можно сделать оружие, у которого влияние расстояния на точность будет снижено (снайперская винтовка).

И еще много-много чего… Главное – чтобы все это было формализовано, тогда код будет писаться легко, а внесение изменений и добавлений в него будет прозрачным.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.4497 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.