|
Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь |
|
Опции темы | Поиск в этой теме | Опции просмотра |
03.07.2010, 14:34 | #1 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
rand() chance
Доброго времени суток RMDC. Необходима ваша помощь в написания небольшого скрипта для кастомного НПЦ. Суть проста - лотерея.
Ситуация: Игрок выбирает к примеру выбирает пункт "играть" и ему с рендомным шансом выдается приз либо ничего. С вызовом рендома разобрался, необходимо задать шанс(проценты) для каждой награды. Допустим case 0: = 20% case 1: = 30% case 2: = 10% и для всех остальных случаев case 3: Часть кода: Код:
#define LOOSER_1 "Увы, фортуна подвела вас, возможно повезет в следующий раз" ...... ...... ...... ...... case 999: switch (rand()% 4) { case 0: { if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(38233, 10)) pPlayer->SendNewItem(pItem, 10, true, false); } break; case 1: { if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(46779, 10)) pPlayer->SendNewItem(pItem, 10, true, false); } break; case 2: { if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(35223, 10)) pPlayer->SendNewItem(pItem, 10, true, false); } break; case 3: { pCreature->MonsterWhisper(LOOSER_1, pPlayer->GetGUID()); } break; } Последний раз редактировалось selector; 03.07.2010 в 14:49. |
03.07.2010, 15:08 | #2 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Если у вас, допустим, 4 case-а, с шансами 10%, 20%, 30% и 40%, то наиболее простой способ будет выглядеть так:
Код:
switch(rand()%10) { case 0: // 10% break; case 1: case 2: // 20% break; case 3: case 4: case 5: // 30% break; case 6: case 7: case 8: case 9: // 40% break; } |
03.07.2010, 15:21 | #3 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
Потихоньку начинаю понимать. В вашем примере берется шанс в 100% и делится на 10. Хорошо основу понял, тогда допустим вторая ситуация. Необходимо что были к примеру 6 значений у 1 и 2 шанс по 5%, 3 и 4 = 15%, 5 =30%, если ничего не выпало то 6 значение.
P.S. может показаться что туплю, но я привык обучаться на примерах и потом методом проб и ошибок приходить к правильному решению своих задач. Последний раз редактировалось selector; 03.07.2010 в 15:27. |
03.07.2010, 15:36 | #4 |
Ученый
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
|
mangos\src\shared\Util.h
куча рандомов, шансов и т.п. Выбирайте любой. |
03.07.2010, 15:44 | #5 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Таким же способом:
Код:
switch(rand()%20) { case 1: // 5% break; case 2: // 5% break; case 3: case 4: case 5: // 15% break; case 6: case 7: case 8: // 15% break; case 9: case 10: case 11: case 12: case 13: case 14: // 30% break; default: // 30% break; } Код:
int result = rand()%100; |
03.07.2010, 17:03 | #6 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
спасибо огромное, с примерами разобрался и создал необходимое. Но возник еще 1 вопрос. Как сюда подключить дроби? тоесть допустим чтоб шанс был 0.5%. Если не трудно пример с дробями и целыми числами(0.5%, 3%, 15%..).
По совету SeT'a изучил Util.h Увидел данное Код:
/* Return a random double from 0.0 to 99.9999999999999. Floats support only 7 valid decimal digits. * A double supports up to 15 valid decimal digits and is used internaly (RAND32_MAX has 10 digits). * With an FPU, there is usually no difference in performance between float and double. */ MANGOS_DLL_SPEC double rand_chance(void); |
03.07.2010, 18:01 | #7 |
Forum bot
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
|
Просьба похвастаться сделанным. В комплекте с остальными кастомными НПС будет очень и очень неплохая перспектива для индивидуализации сервера.
А там деньги за каждую попытку сыграть берутся? А что в награду дается?
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. |
03.07.2010, 19:15 | #8 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
За голосования через mvs(mangos vote system) выдаются спец итемы(я их обозвал Токенами) за них у специализированых НПЦ можно разнообразные бонусы получать(маунты, спутники, телепорты в локации, снятие дезертира). Вобщем все по мелочам. Токены заменить на голду - элементарно)
С утреца решил добавить лотерею и застрял на вопросе выставления шанса. Лотерей хочу 3 видов сложности создать. Игрок платит определенное количество токенов НПЦ и у него есть шанс получить разные бонусы, либо ничего(в зависимости от вида лотереи разные награды и шанс разный) Мини - 1токен, награды вида "Кормушки для петов", 2-3 питомца с 5% шанса каждым, остальное -фейл Нормал - 2токена, уже посерьезней: шанс получить маунтов Мишки с зульамана, Ракеты, "Слез Нубов"(1-2%), спутники вида Зерлинг, Космический десант(старкраф-мурлок), путь Илидана, Путь кенария Екстра - 3токена, Почти все что можно найти тут http://ru.wowhead.com/items?filter=c...s=8;crv=0;gb=0 Неплохое резвлечение для игроков + стимул) Код выложу как только "почищу" его. А то все пишется для себя и немного грязновато выходит. Последний раз редактировалось selector; 03.07.2010 в 19:17. |
03.07.2010, 19:40 | #9 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
на счет процентов еще не разобрался..просто сделал хитрее. В case еще вставил по одному rand(). Пол часа тестирую, все ок
|
03.07.2010, 19:43 | #10 |
Ученый
|
__________________
Галя: Вот почему когда я пуск делаю и по ярлыку две то запускается, а если вот мне к примеру надо не из пуска её то ничего и в красном показывает, а надо ведь чтобы квадратик жёлтенький открывал и там 3 кнопки должно быть? admin: О Боже! admin: Кто-нибудь, пришлите ко мне уборщицу, пусть мой мозг со стен и потолка отмоет Последний раз редактировалось Hantet; 03.07.2010 в 19:53. |
03.07.2010, 19:48 | #11 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
знаю. "гребут" все что видят ради плюсиков , но проект то не ихний и пользуюсь уже давно.
Ктомуже я использую данное: http://www.assembla.com/wiki/show/mangos_vote_system Последний раз редактировалось selector; 03.07.2010 в 19:53. |
03.07.2010, 20:40 | #12 |
Forum bot
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
|
Паблик - убивать без предупреждения.
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. |
04.07.2010, 01:51 | #13 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
Паблик - нее) молчу Просто рассказал откуда идея взялась. Скрипт написан, осталось только подчистить его. Собственно наверно последний вопрос. Как можно упростить например данный участок кода:
Код:
case 220: // Heh, let's try { if (pPlayer->HasItemCount(25850, 1) ) { pPlayer->DestroyItemCount(25850, 1, true); int result = rand()%75; switch(result) { ................. ................. ................. ................. case 27: // Crabs :) { pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID()); pPlayer->CLOSE_GOSSIP_MENU(); if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1)) pPlayer->SendNewItem(pItem, 1, true, false); } break; case 28: // Crabs :) { pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID()); pPlayer->CLOSE_GOSSIP_MENU(); if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1)) pPlayer->SendNewItem(pItem, 1, true, false); } break; case 29: // Crabs :) { pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID()); pPlayer->CLOSE_GOSSIP_MENU(); if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1)) pPlayer->SendNewItem(pItem, 1, true, false); } break; ................. ................. ................. Код:
case 27-29: // Crabs :) { pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID()); pPlayer->CLOSE_GOSSIP_MENU(); if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1)) pPlayer->SendNewItem(pItem, 1, true, false); } break; |
04.07.2010, 01:59 | #14 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Я же писал выше пример...
Код:
case 27: case 28: case 29: |
04.07.2010, 01:59 | #15 |
Forum bot
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
|
Ну, как я понимаю, выше, в пятом посте уже приведен пример подобного?
Можно написать Код:
case 6: // 5% break; case 7: // 5% break; case 8: // 5% break; Код:
case 6: case 7: case 8: // 15% break;
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. |
04.07.2010, 02:10 | #16 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
все дошло) Ночь спать охота, туплю немного..но надо дописать уже и выложить на критику). Спасибо за помощь
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[10608] Update melee miss chance calculations...finally. | newsbot | CMaNGOS Commits | 0 | 14.10.2010 16:51 |
[10511] Fixed SPELL_AURA_MOD_COMBAT_RESULT_CHANCE dodge chance apply to auto-attacks result. | newsbot | CMaNGOS Commits | 0 | 20.09.2010 13:21 |
[9963] Implement per-tick chance for shard for spell 1120 and ranks. | newsbot | CMaNGOS Commits | 0 | 23.05.2010 16:40 |