Yahtzee
LOCKED
LOCKED
LOCKED
LOCKED
LOCKED
Score
Roll
Reroll
dice(1) dice(2) dice(3) dice(4) dice(5) dice(6) result(0, 0) result(1, 0) result(2, 0) result(3, 0) result(4, 0) unused(0) unused(1) unused(2) unused(3) unused(4) unused(5) unused(6) unused(7) unused(8) unused(9) unused(10) unused(11) unused(12) savedscore(0, 0) savedscore(1, 0) savedscore(2, 0) savedscore(3, 0) savedscore(4, 0) savedscore(5, 0) savedscore(6, 0) savedscore(7, 0) savedscore(8, 0) savedscore(9, 0) savedscore(10, 0) savedscore(11, 0) savedscore(12, 0) img(face(0), "") img(face(1), "https://upload.wikimedia.org/wikipedia/commons/2/2c/Alea_1.png") img(face(2), "https://upload.wikimedia.org/wikipedia/commons/b/b8/Alea_2.png") img(face(3), "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alea_3.png") img(face(4), "https://upload.wikimedia.org/wikipedia/commons/8/8d/Alea_4.png") img(face(5), "https://upload.wikimedia.org/wikipedia/commons/5/55/Alea_5.png") img(face(6), "https://upload.wikimedia.org/wikipedia/commons/f/f4/Alea_6.png") tickinterval(250) state(waiting)
style(hand(I), "background-image", UrlText) :- result(I, X) & img(face(X), ImageUrl) & stringappend("url(", ImageUrl, ")", UrlText) has_card(hand(I)) :- result(I,X) & distinct(X, 0) & ~state(waiting) style(hand(I), "background-image", none) :- ~has_card(hand(I)) new_card(I) :- plus(I, 1, I1) & state(starting(I1)) new_card(I) :- plus(I, 1, I1) & state(rerolling(I1)) & ~lockedin(I) skip_card(I) :- plus(I, 1, I1) & state(rerolling(I1)) & lockedin(I) new_card(I) :- plus(I, 1, I1) & state(lastroll(I1)) & ~lockedin(I) & ~state(scoring) skip_card(I) :- plus(I, 1, I1) & state(lastroll(I1)) & lockedin(I) style(slot(I), "background-color", "lightblue") :- new_card(I) style(slot(I), "background-color", "lightgray") :- skip_card(I) style(slot(I), "background-color", "white") :- ~new_card(I) & ~skip_card(I) % POST-ROLLS innerhtml(score, X) :- evaluate(sum(setofall(Z, (used(Y) | unused(Y)) & savedscore(Y, Z))), X) % Starting can_roll :- state(waiting) & ~evaluate(min(countofall(X, used(X)), 13), 13) attribute(roll, "disabled", "false") :- can_roll attribute(roll, "disabled", "true") :- ~can_roll click(roll) ==> ~state(waiting) & state(starting(0)) tick & state(starting(I)) & min(I, 4, I) & evaluate(choose(X, dice(X)), C) & result(I, Z) ==> result(I, C) & ~result(I, Z) tick & state(starting(I)) & min(I, 4, I) & plus(I, 1, I1) ==> ~state(starting(I)) & state(starting(I1)) tick & state(starting(5)) ==> ~state(starting(5)) & state(holding) % HOLDING style(lock(I), "visibility", "visible") :- lockedin(I) style(lock(I), "visibility", "hidden") :- ~lockedin(I) attribute(hand(I), "onclick", "modbutton(this)") :- state(holding) attribute(hand(I), "onclick", "") :- ~state(holding) & ~state(holdagain) click(hand(I)) & state(holding) & ~lockedin(I) ==> lockedin(I) click(hand(I)) & state(holding) & lockedin(I) ==> ~lockedin(I) attribute(reroll, "disabled", "false") :- state(holding) attribute(reroll, "disabled", "true") :- ~state(holding) & ~state(holdagain) attribute(hand(I), "onclick", "modbutton(this)") :- state(holdagain) click(hand(I)) & state(holdagain) & ~lockedin(I) ==> lockedin(I) click(hand(I)) & state(holdagain) & lockedin(I) ==> ~lockedin(I) attribute(reroll, "disabled", "false") :- state(holdagain) click(reroll) & state(holding)==> ~state(holding) & state(rerolling(0)) tick & state(rerolling(I)) & minus(I, 1, I1) & lockedin(I1) ==> ~lockedin(I1) tick & state(rerolling(I)) & min(I, 4, I) & ~lockedin(I) & result(I, Z) & evaluate(choose(X, dice(X)), C_) ==> result(I, C_) & ~result(I, Z) tick & state(rerolling(I)) & min(I, 4, I) & plus(I, 1, I1) ==> ~state(rerolling(I)) & state(rerolling(I1)) tick & state(rerolling(5))==> ~state(rerolling(5)) & state(holdagain) click(reroll) & state(holdagain)==> ~state(holdagain) & state(lastroll(0)) tick & state(lastroll(I)) & minus(I, 1, I1) & lockedin(I1) ==> ~lockedin(I1) tick & state(lastroll(I)) & min(I, 4, I) & ~lockedin(I) & result(I, Z) & evaluate(choose(X, dice(X)), C_) ==> result(I, C_) & ~result(I, Z) tick & state(lastroll(I)) & min(I, 4, I) & plus(I, 1, I1) ==> ~state(lastroll(I)) & state(lastroll(I1)) tick & state(lastroll(5)) ==> ~state(lastroll(5)) & state(scoring) % SCORING attribute(handtype(I), "onclick", "modbutton(this)") :- unused(I) & state(scoring) attribute(handtype(I), "onclick", "") :- used(I) | ~state(scoring) threeofakind :- dice(X) & evaluate(min(countofall(Y, result(Y, X)), 3), 3) fourofakind :- dice(X) & evaluate(min(countofall(Y, result(Y, X)), 4), 4) yahtzee :- dice(X) & evaluate(min(countofall(Y, result(Y, X)), 5), 5) fullhouse :- dice(X) & dice(A) & distinct(X, A) & evaluate(min(countofall(Y, result(Y, X)), 3), 3) & evaluate(min(countofall(B, result(B, A)), 2), 2) smallstraight :- result(_, C0) & result(_, C1) & result(_, C2) & plus(C0, 1, C1) & plus(C1, 1, C2) largestraight :- result(_, C0) & result(_, C1) & result(_, C2) & result(_, C3) & plus(C0, 1, C1) & plus(C1, 1, C2) + plus(C2, 1, C3) click(handtype(0)) & state(scoring) & unused(0) & evaluate(countofall(Y, result(Y, 1)), W) ==> ~state(scoring) & state(waiting) & ~unused(0) & ~savedscore(0, 0) & savedscore(0, W) & used(0) click(handtype(1)) & state(scoring) & unused(1) & evaluate(countofall(Y, result(Y, 2)), W) & evaluate(times(W, 2), Q) ==> ~state(scoring) & state(waiting) & ~unused(1) & ~savedscore(1, 0) & savedscore(1, Q) & used(1) click(handtype(2)) & state(scoring) & unused(0) & evaluate(countofall(Y, result(Y, 3)), W) & evaluate(times(W, 3), Q) ==> ~state(scoring) & state(waiting) & ~unused(2) & ~savedscore(2, 0) & savedscore(2, Q) & used(2) click(handtype(3)) & state(scoring) & unused(0) & evaluate(countofall(Y, result(Y, 4)), W) & evaluate(times(W, 4), Q) ==> ~state(scoring) & state(waiting) & ~unused(3) & ~savedscore(3, 0) & savedscore(3, Q) & used(3) click(handtype(4)) & state(scoring) & unused(0) & evaluate(countofall(Y, result(Y, 5)), W) & evaluate(times(W, 5), Q) ==> ~state(scoring) & state(waiting) & ~unused(4) & ~savedscore(4, 0) & savedscore(4, Q) & used(4) click(handtype(5)) & state(scoring) & unused(0) & evaluate(countofall(Y, result(Y, 6)), W) & evaluate(times(W, 6), Q) ==> ~state(scoring) & state(waiting) & ~unused(5) & ~savedscore(5, 0) & savedscore(5, Q) & used(5) click(handtype(6)) & state(scoring) & unused(6) & threeofakind ==> ~state(scoring) & state(waiting) & ~unused(6) & ~savedscore(6, 0) & savedscore(6, 15) & used(6) click(handtype(6)) & state(scoring) & unused(6) & ~threeofakind ==> ~state(scoring) & state(waiting) & ~unused(6) & used(6) click(handtype(7)) & state(scoring) & unused(7) & fourofakind ==> ~state(scoring) & state(waiting) & ~unused(7) & ~savedscore(7, 0) & savedscore(7, 20) & used(7) click(handtype(7)) & state(scoring) & unused(7) & ~fourofakind ==> ~state(scoring) & state(waiting) & ~unused(7) & used(7) click(handtype(8)) & state(scoring) & unused(8) & smallstraight ==> ~state(scoring) & state(waiting) & ~unused(8) & ~savedscore(8, 0) & savedscore(8, 30) & used(8) click(handtype(8)) & state(scoring) & unused(8) & ~smallstraight ==> ~state(scoring) & state(waiting) & ~unused(8) & used(8) click(handtype(9)) & state(scoring) & unused(9) & largestraight ==> ~state(scoring) & state(waiting) & ~unused(9) & ~savedscore(9, 0) & savedscore(9, 40) & used(9) click(handtype(9)) & state(scoring) & unused(9) & ~largestraight ==> ~state(scoring) & state(waiting) & ~unused(9) & used(9) click(handtype(10)) & state(scoring) & unused(10) & fullhouse ==> ~state(scoring) & state(waiting) & ~unused(10) & ~savedscore(10, 0) & savedscore(10, 25) & used(10) click(handtype(10)) & state(scoring) & unused(10) & ~fullhouse ==> ~state(scoring) & state(waiting) & ~unused(10) & used(10) click(handtype(11)) & state(scoring) & unused(11) & yahtzee ==> ~state(scoring) & state(waiting) & ~unused(11) & ~savedscore(11, 0) & savedscore(11, 50) & used(11) click(handtype(11)) & state(scoring) & unused(11) & ~yahtzee ==> ~state(scoring) & state(waiting) & ~unused(11) & used(11) % Honest note: I couldn't figure out how to properly sum up over all of the values of the dice (setofall does not contain repeats, throwing off my original approach), thus I am leaving chance as a result of 0 for now click(handtype(12)) & state(scoring) & unused(12) ==> ~state(scoring) & state(waiting) & ~unused(12) & used(12) style(score, "color", "green") :- state(scoring) style(score, "color", "black") :- ~state(scoring) % Hand Type Display order("Ones", 0) order("Twos", 1) order("Threes", 2) order("Fours", 3) order("Fives", 4) order("Sixes", 5) order("Three of a Kind", 6) order("Four of a Kind", 7) order("Small Straight", 8) order("Large Straight", 9) order("Full House", 10) order("Yahtzee", 11) order("Chance", 12) innerhtml(handtype(I), T) :- order(T, I) innerhtml(multi(I), "-") :- order(T, I) & unused(I) innerhtml(multi(I), X) :- order(T, I) & used(I) & savedscore(I, X) style(handtype(I), "background-color", "lightgreen") :- used(I) style(handtype(I), "background-color", "white") :- unused(I) & ~state(scoring) style(handtype(I), "background-color", "yellow") :- unused(I) & state(scoring)