Я пишу программу SML Yahtzee / Poker, которая получает список в виде входных данных в формате
yahtzee(1,3,3,4,3)
, в котором каждое число является результатом броска костей, а затем печатает соответствующий результат, который в этом случае будет
(three-of-a-kind, 14)
последнее число является суммой всех 5 кубиков, полученных в качестве входных данных в этом случае.
В настоящее время я беру строку и подсчитываю вхождения каждого числа с помощью переменной count, поскольку в броске костей имеется 6 возможных результатов - 1, 2, 3, 4, 5 или 6.
Я сортирую счет в порядке возрастания, так что последний номер моего нового списка дает мне некоторую информацию относительно того, какой «рукой» это может быть, из следующего:
yahtzee - это 5 в своем роде и "стоит" 50 баллов, поэтому возврат будет (yahtzee, 50)
большая прямая - последовательность из 5 чисел, стоит 40 баллов, поэтому возвращается (large-straight, 40)
маленькая прямая - последовательность из 4 чисел, 30 баллов, так что (small-straight, 30)
фулл-хаус - 3 вида и два другого вида, 25 очков, так что (full-house, 25)
четыре вида - стоит столько же очков, сколько сумма всех 5 кубиков, поэтому (four-of-a-kind, sum)
три вида - стоит столько же очков, сколько сумма всех 5 кубиков, так что (three-of-a-kind, sum)
шанс - (chance, sum)
Потому что мне также все равно, какое число встречается 3 раза, например, потому что это было бы трио в любом случае. Проверяя последний номер, я могу получить довольно хорошее представление о том, что происходит.
А для фулл-хауса, если я проверяю число перед последним, и оно равно 2, я знаю, что это фулл-хаус, потому что последним оно будет 3. Важно отметить, что если сумма фулл-хауса больше 25, но вместо этого эта рука должна быть тройкой, потому что она приносит большее количество очков.
Я еще не реализовал все случаи, и поэтому приведенный ниже код соответствует тому, что у меня есть в данный момент, и последняя функция - это попытка проверить, движусь ли я в правильном направлении, но она будет переименована в yahtzee(L)
позже, чтобы он мог получить ввод.
fun counter (nil, count1:int, count2:int, count3:int, count4:int, count5:int, count6:int) = ListMergeSort.sort (fn (x,y) => x > y) [count1, count2, count3, count4, count5, count6]
| counter (6::t, count1, count2, count3, count4, count5, count6) = counter (t, count1, count2, count3, count4, count5, count6+1)
| counter (5::t, count1, count2, count3, count4, count5, count6) = counter (t, count1, count2, count3, count4, count5+1, count6)
| counter (4::t, count1, count2, count3, count4, count5, count6) = counter (t, count1, count2, count3, count4+1, count5, count6)
| counter (3::t, count1, count2, count3, count4, count5, count6) = counter (t, count1, count2, count3+1, count4, count5, count6)
| counter (2::t, count1, count2, count3, count4, count5, count6) = counter (t, count1, count2+1, count3, count4, count5, count6)
| counter (1::t, count1, count2, count3, count4, count5, count6) = counter (t, count1+1, count2, count3, count4, count5, count6)
| counter (h::t, count1, count2, count3, count4, count5, count6) = ListMergeSort.sort (fn (x,y) => x > y) [count1, count2, count3, count4, count5, count6];
fun sum (nil) = 0
| sum (h::t) = h + sum(t)
fun anyOfAKind (nil) = 0
| anyOfAKind (L) = List.last(L)
fun fullHouse (nil) = 0
| fullHouse (L) = List.nth(L, 3)
fun testdice (nil) = []
| testdice (L) =
let
val listSum = sum(L)
val count = counter(L,0,0,0,0,0,0)
in
if fullHouse(count) = 2 then
if listSum <= 25 then print "(fullhouse, 25)"
else print "(threeofakind, " ^ Int.toString (sum) ^ ")"
end;
Если я удаляю последнюю функцию, проблем с созданием файла не возникает, однако при наличии последней функции появляется сообщение об ошибке
Error: syntax error found at END
Мой первый вопрос: почему я получаю это сообщение об ошибке?
Я думаю, что мне нужно что-то вернуть, но это не так?
И еще один вопрос, который у меня возникает, если мой мыслительный процесс выглядит хорошо, а если нет, то любой совет будет высоко оценен.
Спасибо!