CS 151 project - Hexcells
Amy Kanne, Nolan Miranda, Sophie Decoppet
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
Mode:
Play
Edit
Hide
Solve
revealed(hex(2,2)) revealed(hex(1,3)) revealed(hex(3,1)) color(0) color(1) state(hex(1,1),0) state(hex(1,2),1) state(hex(1,3),0) state(hex(2,1),1) state(hex(2,2),0) state(hex(2,3),0) state(hex(3,1),0) state(hex(3,2),0) state(hex(3,3),0) coord(1) coord(2) coord(3) coord(4)
adjacent(hex(A,B),hex(C,D)) :- same(B,D) & evaluate(plus(A,1),C) adjacent(hex(A,B),hex(C,D)) :- same(B,D) & evaluate(plus(C,1),A) adjacent(hex(A,B),hex(C,D)) :- same(A,C) & evaluate(plus(B,1),D) adjacent(hex(A,B),hex(C,D)) :- same(A,C) & evaluate(plus(D,1),B) adjacent(hex(A,B),hex(C,D)) :- evaluate(plus(A,1),C) & evaluate(plus(B,1),D) adjacent(hex(A,B),hex(C,D)) :- evaluate(plus(C,1),A) & evaluate(plus(D,1),B) numAdjacent(A,N) :- state(A,0) & evaluate(countofall(B,state(B,1) & adjacent(A,B)),N) satAdj(C,A1,A2) :- revealed(C) & state(C,1) satAdj(hex(A,B),A1,A2) :- coord(A) & coord(B) & ~revealed(hex(A,B)) satAdj(C,A1,A2) :- revealed(C) & numAdjacent(C,N) & evaluate(sum([A1,A2]),N) satAdj(C,A1,A2,A3) :- revealed(C) & state(C,1) satAdj(hex(A,B),A1,A2,A3) :- coord(A) & coord(B) & ~revealed(hex(A,B)) satAdj(C,A1,A2,A3) :- revealed(C) & numAdjacent(C,N) & evaluate(sum([A1,A2,A3]),N) satAdj(C,A1,A2,A3,A4) :- state(C,1) satAdj(hex(A,B),A1,A2,A3,A4) :- coord(A) & coord(B) & ~revealed(hex(A,B)) satAdj(C,A1,A2,A3,A4) :- revealed(C) & numAdjacent(C,N) & evaluate(sum([A1,A2,A3,A4]),N) satAdj(C,A1,A2,A3,A4,A5) :- state(C,1) satAdj(hex(A,B),A1,A2,A3,A4,A5) :- coord(A) & coord(B) & ~revealed(hex(A,B)) satAdj(C,A1,A2,A3,A4,A5) :- revealed(C) & numAdjacent(C,N) & evaluate(sum([A1,A2,A3,A4,A5]),N) satAdj(C,A1,A2,A3,A4,A5,A6) :- state(C,1) satAdj(hex(A,B),A1,A2,A3,A4,A5,A6) :- coord(A) & coord(B) & ~revealed(hex(A,B)) satAdj(C,A1,A2,A3,A4,A5,A6) :- revealed(C) & numAdjacent(C,N) & evaluate(sum([A1,A2,A3,A4,A5,A6]),N) canAssign(C,1) :- state(C,N) & ~revealed(C) canAssign(C,1) :- revealed(C) & state(C,1) canAssign(hex(A,B),0) :- coord(A) & coord(B) & ~state(hex(A,B),N) canAssign(C,0) :- state(C,N) & ~revealed(C) canAssign(C,0) :- revealed(C) & state(C,0) assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) :- canAssign(hex(1,1),A11) & canAssign(hex(1,2),A12) & canAssign(hex(1,3),A13) & canAssign(hex(1,4),A14) & canAssign(hex(2,1),A21) & canAssign(hex(2,2),A22) & canAssign(hex(2,3),A23) & canAssign(hex(2,4),A24) & canAssign(hex(3,1),A31) & canAssign(hex(3,2),A32) & canAssign(hex(3,3),A33) & canAssign(hex(3,4),A34) & canAssign(hex(4,1),A41) & canAssign(hex(4,2),A42) & canAssign(hex(4,3),A43) & canAssign(hex(4,4),A44) & satAdj(hex(1,1),A21,A12,A22) & satAdj(hex(1,2),A22,A13,A11,A23) & satAdj(hex(1,3),A23,A14,A12,A24) & satAdj(hex(1,4),A24,A13) & satAdj(hex(2,1),A31,A11,A22,A32) & satAdj(hex(2,2),A32,A12,A23,A21,A33,A11) & satAdj(hex(2,3),A33,A13,A24,A22,A34,A12) & satAdj(hex(2,4),A34,A14,A23,A13) & satAdj(hex(3,1),A41,A21,A32,A42) & satAdj(hex(3,2),A42,A22,A33,A31,A43,A21) & satAdj(hex(3,3),A43,A23,A34,A32,A44,A22) & satAdj(hex(3,4),A44,A24,A33,A23) & satAdj(hex(4,1),A31,A42) & satAdj(hex(4,2),A32,A43,A41,A31) & satAdj(hex(4,3),A33,A44,A42,A32) & satAdj(hex(4,4),A34,A43,A33) assignmentCanTakeValue(hex(1,1),A11) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(1,2),A12) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(1,3),A13) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(1,4),A14) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(2,1),A21) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(2,2),A22) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(2,3),A23) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(2,4),A24) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(3,1),A31) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(3,2),A32) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(3,3),A33) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(3,4),A34) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(4,1),A41) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(4,2),A42) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(4,3),A43) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) assignmentCanTakeValue(hex(4,4),A44) :- assignment(A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44) solve :: color(C1) & color(C2) & distinct(C1,C2) & state(A,C2) & ~assignmentCanTakeValue(A,C1) & assignmentCanTakeValue(A,C2) ==> revealed(A) solve :: state(A,C) & ~assignmentCanTakeValue(A,C) ==> failure solve :: coord(A) & coord(B) & ~assignmentCanTakeValue(hex(A,B),0) & ~assignmentCanTakeValue(hex(A,B),1) ==> failure isOrange(hex(A,B)) :- state(hex(A,B),C) & ~revealed(hex(A,B)) isBlue(hex(A,B)) :- state(hex(A,B),1) & revealed(hex(A,B)) isGray(hex(A,B)) :- state(hex(A,B),0) & revealed(hex(A,B)) isNothing(hex(A,B)) :- coord(A) & coord(B) & ~state(hex(A,B),0) & ~state(hex(A,B),1) edit(A) :: isNothing(A) ==> state(A,0) & revealed(A) edit(A) :: isGray(A) ==> state(A,1) & ~state(A,0) edit(A) :: isBlue(A) ==> ~state(A,1) & ~revealed(A) hide(A) :: isOrange(A) ==> revealed(A) hide(A) :: state(A,C) & revealed(A) ==> ~revealed(A) style(hex(A,B), "fill", "white") :- isNothing(hex(A,B)) style(text(A,B), "fill", "transparent") :- isNothing(hex(A,B)) style(hex(A,B), "stroke", "white") :- isNothing(hex(A,B)) style(hex(A,B), "fill", "orange") :- isOrange(hex(A,B)) style(text(A,B), "fill", "transparent") :- isOrange(hex(A,B)) style(hex(A,B), "stroke", "black") :- isOrange(hex(A,B)) style(hex(A,B), "fill", "blue") :- isBlue(hex(A,B)) style(text(A,B), "fill", "transparent") :- isBlue(hex(A,B)) style(hex(A,B), "stroke", "black") :- isBlue(hex(A,B)) style(hex(A,B), "fill", "grey") :- isGray(hex(A,B)) style(text(A,B), "fill", "black") :- isGray(hex(A,B)) style(hex(A,B), "stroke", "black") :- isGray(hex(A,B)) innerhtml(text(A,B), N) :- isGray(hex(A,B)) & numAdjacent(hex(A,B), N) attribute(hex(A,B), "onclick", "modbutton(this)") :- mode(play) & isOrange(hex(A,B)) attribute(text(A,B), "onclick", "modbutton(this)") :- mode(play) & isOrange(hex(A,B)) attribute(hex(A,B), "onclick", "modbutton(this)") :- mode(edit) & ~isOrange(hex(A,B)) attribute(text(A,B), "onclick", "modbutton(this)") :- mode(edit) & ~isOrange(hex(A,B)) attribute(hex(A,B), "onclick", "modbutton(this)") :- mode(hide) & coord(A) & coord(B) & ~isNothing(hex(A,B)) attribute(text(A,B), "onclick", "modbutton(this)") :- mode(hide) & coord(A) & coord(B) & ~isNothing(hex(A,B)) click(hex(A,B)) :: mode(play) ==> revealed(hex(A,B)) click(text(A,B)) :: mode(play) ==> revealed(hex(A,B)) click(hex(A,B)) :: mode(edit) ==> edit(hex(A,B)) click(text(A,B)) :: mode(edit) ==> edit(hex(A,B)) click(hex(A,B)) :: mode(hide) ==> hide(hex(A,B)) click(text(A,B)) :: mode(hide) ==> hide(hex(A,B)) attribute(solver, "onclick", "modbutton(this)") click(solver) :: solve attribute(mode, "onclick", "modbutton(this)") select(mode, C) :: value(mode,C) select(mode, C) :: value(mode,D) & distinct(C,D) ==> ~value(mode,D) select(mode, C) :: mode(C) select(mode, C) :: mode(D) & distinct(C,D) ==> ~mode(D)