Во-первых, как вы догадались, загрузите этот файл в среду для C#
для использования это понимать не обязательно
Общая архитектура такова. Заданному типу броска (например d4+d5+2d6+d10 :) ) сопоставлям трехмерный массив, у которого в поле [a,b,c] записано число исходов у которых: наименьшее выпавшее значение равно a, втрое по малости значение равно b (т.е. b всегда больше или равно a), сумма всех значений равна c.
Здесь и далее по дайсом dn пониматеся кость, выдающая значения от 0 до n, в стандартной терминологии это скорее d(n+1)-1,
но нам будет удобнее именно такая.Вам нужно написать, какие два броска вы хотите законтестить. Для этого:
1. Присвойте констате N значение, равное наибольшей из используемых костей.
(Например, если хотите сравнивать 2d3+d4+d17 vs 2d4+4d5 надо написать N=17)
Константе size присвойте значение набольшее значение суммы номеров костей в ваших бросках
(в нашем примере: максимум из 2*3+4+17=27 и 2*4+4*5=28 --- максимум равен 28).
Можно присвоить и большее значение, слегка потеряв в быстродействии.
2. предусмотрены следующие типы бросков: compress_type1=0 -- для первого брока считается просто сумма выпавших значений.
compress_type1=1 для первого броска считается сумма значений без наименьшего.
compress_type1=2 для первого броска считается сумма значений без наименьшего и второго по величине.
compress_type2 --- то же самое для второго броска.
Присвойте переменным требуемые значения.
3. Самое сложное. Пишем код, который объяснит, что за броски обсчитываем. Нам надо присвоить таблицу первого броска переменной Z, второго --- переменной T. Для этого есть следующие средства:
Функция createdice(N) создает таблицу результатов броска dN, функция multiply(X,Y) по таблицам каких-то бросков X и Y,
создает таблицу броска их объединения.
Напиример: если X -- таблица броска 2d3+d4+d17, а Y -- таблица броска 2d4+4d5, то multiply(X,Y) -- таблица броска 2d3+3d4+4d5+d17.Уже догадались, как написать код, который присвоит перменным нужные броски? Например, хотим мы посчитать бросок 2d3+d4+d17. Пишем в мейне (сразу после присваиваний compress_type1 и compress_type2 нужных значений):
X=createdice(3); // теперь в X записан бросок одной кости d3
Z=multiply(X,X); // теперь в Z записан росок 2d3
X=createdice(4); // теперь в X записан росок d4
Z=multiply(X,Z); // теперь в Z записан росок 2d3+d4
X=createdice(17); // теперь в X записан росок d17
Z=multiply(X,Z); // теперь в Z записан росок 2d3+d4+d17 ---- уффф, победа!
Не забудьте дальше описать второй бросок, он должен быть присвое переменной T. (неиспользование буквы Y --- атавизм борьбы за быстродействие. Там можно спорядком умножения химичить. Учше чтобы левым стоял более простой бросок из двух. )
Не забудьте удалить или закоментировать все старые присваивания между compress_type2 = 1; и compress(Z, a, b, compress_type1);
4. Все готово, запускаете программу, результаты дублируются в консоль и файл, формат такой, как я уже выкладывал.
Напосдедок. Кому не нравится формат вывода результатов --- перепишите процедуры
public static void showresult(StreamWriter fOut, int[] a, int[] b)
и
public static void showcontest(StreamWriter fOut)
по своему вкусу.