Недавно написал маленькую, но полезную прогу, называется "Игральные кубики". Смысл программы, в следующем: вы выбираете кол-во кубиков от 1 по 20. И бросаете кубики.
Данная версия основана на рандоме, но усчетом факторов реального броска кубиков.
Данную прогу остается улучшить применив еще эврестический подход, для наиболее точно имитации броска игральных кубиков.
Скачать можно на этой странице: http://lasoftgame.ru/downloads.php?cat_id=5
З.Ы.
Знаю, что вы можете сказать: "Нечего страдать фигней" и т.д. Но лучше использовать электронную версию кубиков, чем постоянно искать реальные.
Неактивен
Нажимаем на любом калькуляторе RND и умножаем на разность верхней и нижней границы (например, на 114, если у нас 20 кубиков), округляем - вот и наши кости...
Неактивен
Hind написал:
Нажимаем на любом калькуляторе RND и умножаем на разность верхней и нижней границы (например, на 114, если у нас 20 кубиков), округляем - вот и наши кости...
Не пойдет.
3 кубика никак не смогут выдать число меньше 3, например.
Кроме того, кубик 2d3 и 3d2 - совсем-совсем разные в плане баланса.
Неактивен
Hind написал:
Нажимаем на любом калькуляторе RND и умножаем на разность верхней и нижней границы (например, на 114, если у нас 20 кубиков), округляем - вот и наши кости...
А почему 114, а не 100?
Неактивен
Тогда уж RND(N*6-N) + N.
А вообще странно, кому нужен этот анализ, если анимации все равно не видно? Вот, если бы выглядело как в игре "Ведьмак", то да.
Отредактировано - VampirE - (26.03.2008 16:45)
Неактивен
fireton написал:
3 кубика никак не смогут выдать число меньше 3, например.
Совершенно верно. Именно так и получится по моей формуле. Ну, конечно, надо прибавить нижнюю границу, но это и без того ясно.
0 ≤ RND ≤ 1
Верхняя граница (с 3 кубиками) = 3 * 6 = 18
Нижняя граница = 3 * 1 = 3
3 ≤ RND * (18 - 3) + 3 ≤ 18
Вероятности выпадения для каждого кол-ва очков одинаковы.
Что не так?
Неактивен
Вероятности выпадения для каждого кол-ва очков одинаковы.
Вот это не так.
Спроси у D&D-шника на досуге, почему он предпочтет меч с уроном 6d4 мечу 4d6.
Неактивен
Eten написал:
Недавно написал маленькую, но полезную прогу, называется "Игральные кубики". Смысл программы, в следующем: вы выбираете кол-во кубиков от 1 по 20. И бросаете кубики.
...
Данная версия основана на рандоме, но усчетом факторов реального броска кубиков.
...
Знаю, что вы можете сказать: "Нечего страдать фигней" и т.д. Но лучше использовать электронную версию кубиков, чем постоянно искать реальные.
Eten, программа нужная. Порадовал. Спасибо. Я ее радостно скачал и опаньки - нету у меня Framework! Соответственно, не работает. Не, я могу скачать этот самый Framework. Но вот насчет того, что она маленькая, я как-то засомневался...
Аналогичную вещь с графикой - вращающимися кубиками, правда в монохромном изображении, - мой друг Vladius писал на С (без всяких ++ и #) и занимала она килобайта так 3-5. Вместе с графикой. И при этом не требовала дополнительных библиотек. У меня к тебе претензий нет, каждый пишет на чем ему удобно - я бы такую вещь делал на URQ . Это просто вопль во Вселенную: Куды же мы катимся! Если для программы, имитирующей броски кубиков, мы качаем 20 мб библиотеку!
Грустно всё это. А программа нужная. Только я ее лучше на Питоне напишу - для смартфона. Будут кубики всегда под рукой. и Места будут занимать мало. Кто алгоритмом поделится?
Неактивен
oleksus написал:
Gesperid написал:
А новость-то, меж тем, совсем не из мира IF.
Ну, точно. Это скорее в министерство финансов. Они такие проги любят.
Это из мира RPG скорее (D&D и AD&D). Т.е. близкий друг ИФ. Минфин сюда отношения не имеет.
Неактивен
Korwin написал:
Если для программы, имитирующей броски кубиков, мы качаем 20 мб библиотеку!
Не все так плохо, KRI будет занимать ненамного больше 100 КБайт, ничего не требуя.
Разве что GDI+, но в XP и выше он есть по умолчанию, а ниже можно установить (пакет весит ~900 КБайт).
Korwin написал:
Кто алгоритмом поделится?
А чего там делиться? Числа небольшие, решаем в лоб. Псевдокод:
score = 0; for (i = 0; i < n; i++) // n - число бросков кубика (ну или число кубиков) score += 1 + 5 * random(); // Где random - функция, возвращающая случайное число от 0 до 1
Неактивен
Кто алгоритмом поделится?
Корв, да какой там алгоритм. Запускаешь генератор случайных чисел от 1 до N для M кубиков (схемка NdM) и складываешь полученные результаты...
Неактивен
Шо вы маетесь, уже сто лет как есть ПРОГА со всеми возможными видами игральных кубиков, которой пользуются в нужной ситуации. Есть ее версия и для мобильников и для кпк. Писать новую - разве что добавить просчитывание кубиков с отскоком от стенки (и для реалистичности можно несколько видов покрытия реализовать, каучук, пенопласт, дерево, ламинат.)
Неактивен
Korwin написал:
Это просто вопль во Вселенную: Куды же мы катимся! Если для программы, имитирующей броски кубиков, мы качаем 20 мб библиотеку!
Эх... Офф-топ подкрался незаметно;). У меня было недавно такое же ощущение, когда свежекупленный МФУ-принтер потребовал скачать в качестве драйверов и сервисного софта ни много ни мало... 150 Мб с гаком! А я еще помню времена, когда вся операционная система (причем с гуём, не так чтоб сильно отставшем от современных мастдаев) в развернутом состоянии занимала меньше места...
Неактивен
Вы все правы, когда говорите про RND, но предлагаемые варианты не удобны. Hind, а где ты увидешь на кубиках дубль, если у тебя только одна цифра будет?
.Net Framework 2.0, эта вещь с появлением Vist-ы скоро станет нормальным явлением, поэтому не вижу смысла писать на чем-нибудь другом для Windows. Прошу для обсуждения .Net Framework заводить другую тему, а не сорить здесь.
Korwin, эту херотен можно скачать с сайта MS или найти в журнале "Игромания" выпуск март 2007 (я покупал с двумя DVD), короче, там есть .Net Framework 3, вот его и ставь. Только работать он будет под Windows XP/Vista, ну а вторая включет в себя все предыдущие версии ОС и XP.
Смотрите на скриншот:
Код алгоритма:
//Очистка от устаревших сообщений panel.Text = ""; //определяет случайное кол-во раз //переворачивания игрального кубика Random rnd1 = new Random(); //определеяет случайную грань игрального кубика Random rnd2 = new Random(); //---------- //кубик или несколько кубиков перед выдачей случайной грани //всегда переворачиваются в среднем от 10 до 30 раз. Номер грани //соответствует выпавшему случайному числу. //Каждый кубик имеет шесть граней, поэтому произведение кол-ва //на 6 и использование рандома от такого максимума не может дать //точно иммитации броска кубика //Т.к. кубиков может быть несколько, то у каждого может выпасть число //принадлежащее отрезку [1,6], поэтому нужно бросать каждый кубик отдельно. //Также каждый кубик падая вместе с остальными, поворачивается разное кол-во раз //Учитывая все эти факторы можно в достаточной мере смоделировать реальный бросок кубика. //Что и делает данный алгоритм. //---------- //массив кол-в переворотов кубиков до выпадения случ. числа int[] KolvoPerev = new int[(int)Cub.Value]; //Т.о. обеспечиваем имитацию разного падения кубиков, //т.е. каждый кубик переворачивается разное кол-во раз for (int i = 0; i < (int)Cub.Value; i++) KolvoPerev[i] = 10 + rnd1.Next(20); //массив случ. чисел кубиков //Cub.Value - это выбранное кол-во кубиков int[] RandomChislo = new int[(int)Cub.Value]; //сумма случ. чисел int SummRandomChislo = 0; //бросание кубиков //бросает каждый кубик по очереди и прибавляет его число //к сумме остальных. for (int i = 0; i < (int)Cub.Value; i++) { //бросаем кубик for (int j = 0; j <= KolvoPerev[i]; j++) RandomChislo[i] = rnd2.Next(6) + 1; //суммируем случ. числа SummRandomChislo += RandomChislo[i]; } //Вывод на экран информации о результате броска кубиков if (Cub.Value == 1)//если один кубик, то выводим только число panel.Text = SummRandomChislo.ToString(); else {//иначе выводим числа всех кубиков и общее число. for (int g = 0; g < (int)Cub.Value; g++) if (g == (int)Cub.Value - 1) panel.Text += RandomChislo[g].ToString(); else panel.Text += RandomChislo[g].ToString() + " + "; panel.Text += " = " + SummRandomChislo.ToString(); }
Чего здесь явно не хватает, так это эвристического подхода. Т.е. учитывать еще и тот фактор, что на кубике цифры случ. образом на гранях определяются только перед броском. Дальше идет расчет случ. поворот в разных направлениях и учет на каких гранях стоят цифры 1, 2, 3, 4, 5, 6.
Если у меня будет учитан и этот фактор, только тогда можно сказать с уверенностью на 90%, все таки есть факторы в реальном броске зависящие только от самого человека и другие, которыми обычно пренебрегают, например сила броска и прочие ухишрения (такое имеет смысл учитывать в игре "Кости"), что данный алгоритм полностью моделирует рельный бросок, как одного кубика, так и нескольких сразу.
З.Ы.
Так, что с интересом посмотрю на проги, которые смогут это все реализовать и как минимум будут работать на PC.
Неактивен
Korwin, грубо округляя она весит 30 Кб. Программа реально малехонькая, это видно по ее алгоритму.\
А теперь ко всем, кому не лень парить мозги дискретным распз....(тьфу), ну в общем поняли чем. Не страдайте ребята фигней, а взгляните на приведенный выше алгоритм, как говорится все гениальное просто, но не простое гениально!
З.Ы.
Не обижайтесь на мой пост, но читая ваши посты в теме и глядя на приведенный алгоритм, действительно приходишь к выше описанной фразе (читайте жирно выделенное).
Неактивен
Eten написал:
Чего здесь явно не хватает, так это эвристического подхода. Т.е. учитывать еще и тот фактор, что на кубике цифры случ. образом на гранях определяются только перед броском. Дальше идет расчет случ. поворот в разных направлениях и учет на каких гранях стоят цифры 1, 2, 3, 4, 5, 6
Еще нужно учесть вероятность выпадения кубика на ребро
Неактивен
Eten написал:
Hind, а где ты увидешь на кубиках дубль, если у тебя только одна цифра будет?
Блин, значит будем очки на каждом кубике в массив пихать, один шут. В ТЗ ничего не было о необходимости выводить очки по каждому кубику. Вообще, короче - ТЗ не было.
И еще, Eten, откройте для себя Alt + Print Screen.
Что касается вашего алгоритма, то это вообще смешно - никакой разницы вот с этим нет, вы просто делаете лишние вычисления:
int score = 0; int * dice = new int[n]; for (int i = 0; i < n; i++) { dice[i] = 1 + 5 * random(); score += dice[i]; } ... delete [] dice;
Для реального кубика - дискретное равномерное распределение. Не углубляясь в "случайность" сишного рандома, скажу, что для вышенаписанного кода распределение именно таково. У вашего - не знаю, это проще увидеть на графике.
Неактивен
Hind, ТЗ здесь простое - это написать программу, которая сможет иммитировать бросок кубиков почти не отличимый от реального, к тому же показывать выпавшее число каждого кубика.
Да, алгоритм у вас проще и у меня такой же был, но где вы видели, чтобы куб падал и переворачивался один раз постоянно? Каждый куб при падении переворачивается разное кол-во раз. У меня это учтено и именно поэтому, ваш алгоритм больше похож на генератор случайных чисел, чем на иммитацию.
Для реального кубика - дискретное равномерное распределение.
Заумными словечками и я могу говорить так, что говори проще, не усложняй понимание простых вещей.
Так, что, Hind, ТЗ здесь следующее: требуется сделать наиболее точную иммитацию броска кубиков, выдать выпавшее число на каждом кубике, число на кубиках не может выпадать хаотичным образом.
Говоря проще, если числа расположились при повороте куба 3,5,6, то не может вслед за 3 вылетить 2. Тут нужно учесть расположения чисел на реальном игральном кубе. Вот тогда иммитация будет почти не отличимо от реального броска кубика. Некоторыми факторыми, а это: куб упал на ребро, сила броска и прочее, можно пренебречь, т.к. это сильно не повлияет на точность иммитации.
З.Ы.
Я уже в принципе додумал не достающую часть, но в выложенном мною алгоритме учтено много факторов потому, что мне нафиг не нужен тривиальный генератор случ. чисел, мне нужен нормальный иммитатор броска игрального кубика.
Отредактировано Eten (28.03.2008 12:53)
Неактивен