Gamemaster
General
Game
Playing
hamilton
Description
Hamilton is a single player game played on a graph with two interconnected nodes. The player starts out on one of the twenty nodes, and on each step moves to an adjacent node. The objective of the game is to visit as many nodes as possible in twenty steps. The reward at the end of the game is an increasing function of the number of nodes visited. (Theoretical version of this problem - trying to find a Hamiltonian path under resource constraints.)
Rulesheet
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% hamilton %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% metadata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% role(robot) base(location(X)) :- node(X) base(visited(X)) :- node(X) base(score(0)) base(score(N)) :- scorenext(M,N) base(step(1)) base(step(N)) :- successor(M,N) base(control(robot)) action(move(Y)) :- node(Y) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% init %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(location(a)) init(visited(a)) init(score(1)) init(step(1)) init(control(robot)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% legal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% legal(move(Y)) :- location(X) & connected(X,Y) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% operations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% move(Y) :: location(X) ==> ~location(X) & location(Y) move(Y) :: visited(Y) move(Y) :: step(M) & successor(M,N) ==> ~step(M) & step(N) move(Y) :: ~visited(Y) & score(M) & scorenext(M,N) ==> ~score(M) & score(N) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% goal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% goal(robot,N) :- score(N) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% terminal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% terminal :- step(20) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Facts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% node(a) node(b) node(c) node(d) node(e) node(f) node(g) node(h) node(i) node(j) node(k) node(l) node(m) node(n) node(o) node(p) node(q) node(r) node(s) node(t) connected(a,b) connected(a,e) connected(a,h) connected(b,a) connected(b,c) connected(b,j) connected(c,b) connected(c,d) connected(c,l) connected(d,c) connected(d,e) connected(d,n) connected(e,a) connected(e,d) connected(e,f) connected(f,e) connected(f,g) connected(f,o) connected(g,f) connected(g,h) connected(g,q) connected(h,a) connected(h,g) connected(h,i) connected(i,h) connected(i,j) connected(i,r) connected(j,b) connected(j,i) connected(j,k) connected(k,j) connected(k,l) connected(k,s) connected(l,c) connected(l,k) connected(l,m) connected(m,l) connected(m,n) connected(m,t) connected(n,d) connected(n,m) connected(n,o) connected(o,n) connected(o,f) connected(o,p) connected(p,o) connected(p,q) connected(p,t) connected(q,g) connected(q,p) connected(q,r) connected(r,i) connected(r,q) connected(r,s) connected(s,k) connected(s,r) connected(s,t) connected(t,m) connected(t,s) connected(t,p) scorenext( 0, 1) scorenext( 1, 2) scorenext( 2, 4) scorenext( 4, 6) scorenext( 6, 9) scorenext( 9,12) scorenext(12,16) scorenext(16,20) scorenext(20,25) scorenext(25,30) scorenext(30,36) scorenext(36,42) scorenext(42,49) scorenext(49,56) scorenext(56,64) scorenext(64,72) scorenext(72,81) scorenext(81,90) scorenext(90,100) successor( 1, 2) successor( 2, 3) successor( 3, 4) successor( 4, 5) successor( 5, 6) successor( 6, 7) successor( 7, 8) successor( 8, 9) successor( 9,10) successor(10,11) successor(11,12) successor(12,13) successor(13,14) successor(14,15) successor(15,16) successor(16,17) successor(17,18) successor(18,19) successor(19,20) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Stylesheet
//------------------------------------------------------------------------------ // Hamilton //------------------------------------------------------------------------------ function renderstate (state) {var canvas = document.createElement('canvas'); canvas.setAttribute('width','390px'); canvas.setAttribute('height','390px'); drawline(195, 15,375,105,canvas); drawline(375,105,375,375,canvas); drawline(375,375, 15,375,canvas); drawline( 15,375, 15,105,canvas); drawline( 15,105,195, 15,canvas); drawline( 15,105, 75,135,canvas); drawline(375,105,315,135,canvas); drawline(195, 15,195, 75,canvas); drawline(375,375,315,315,canvas); drawline( 15,375, 75,315,canvas); drawline(195, 75,315,135,canvas); drawline(315,135,315,315,canvas); drawline(315,315, 75,315,canvas); drawline( 75,315, 75,135,canvas); drawline( 75,135,195, 75,canvas); drawline(195,270,195,315,canvas); drawline(135,105,135,165,canvas); drawline( 75,225,135,225,canvas); drawline(135,165,135,225,canvas); drawline(135,165,255,165,canvas); drawline(255,165,255,225,canvas); drawline(255,105,255,165,canvas); drawline(255,225,315,225,canvas); drawline(255,225,195,270,canvas); drawline(195,270,135,225,canvas); drawnode('a',180, 0,state,canvas); drawnode('b',360, 90,state,canvas); drawnode('c',360,360,state,canvas); drawnode('d', 0,360,state,canvas); drawnode('e', 0, 90,state,canvas); drawnode('f', 60,120,state,canvas); drawnode('g',120, 90,state,canvas); drawnode('h',180, 60,state,canvas); drawnode('i',240, 90,state,canvas); drawnode('j',300,120,state,canvas); drawnode('k',300,210,state,canvas); drawnode('l',300,300,state,canvas); drawnode('m',180,300,state,canvas); drawnode('n', 60,300,state,canvas); drawnode('o', 60,210,state,canvas); drawnode('p',120,210,state,canvas); drawnode('q',120,150,state,canvas); drawnode('r',240,150,state,canvas); drawnode('s',240,210,state,canvas); drawnode('t',180,255,state,canvas); drawscore(compfindx('X',seq('score','X'),state,library),170,195,canvas); return canvas} //------------------------------------------------------------------------------ // Drawing subroutines //------------------------------------------------------------------------------ function drawproposition (x,y,w) {var ctx = w.getContext('2d'); ctx.beginPath(); ctx.lineWidth=2; ctx.arc(x+15,y+15,12,0,2*Math.PI,false); ctx.stroke(); ctx.fillStyle = "#dcccb3"; ctx.fill();} function drawvisited (x,y,w) {var ctx = w.getContext('2d'); ctx.beginPath(); ctx.lineWidth=2; ctx.arc(x+15,y+15,12,0,2*Math.PI,false); ctx.stroke(); ctx.fillStyle = "#bb77b3"; ctx.fill();} function drawcurrent (x,y,w) {var ctx = w.getContext('2d'); ctx.beginPath(); ctx.lineWidth=2; ctx.arc(x+15,y+15,12,0,2*Math.PI,false); ctx.stroke(); ctx.fillStyle = "#bb7700"; ctx.fill();} function drawtext (text,x,y,w) {var ctx = w.getContext('2d'); ctx.fillStyle = "#000000"; ctx.font="italic 14px Times" ctx.fillText(text,x+12,y+18); return true} function drawline(u,v,x,y,w) {var ctx = w.getContext('2d'); ctx.beginPath(); ctx.lineWidth=2; ctx.moveTo(u,v); ctx.lineTo(x,y); ctx.stroke()} function drawnode (name,x,y,state,canvas) {var current = compfindp(seq('location',name),state,library); if (current) {drawcurrent(x,y,canvas)} else {var visited = compfindp(seq('visited',name),state,library); if (visited) {drawvisited(x,y,canvas)} else {drawproposition(x,y,canvas)}}; drawtext(name,x,y,canvas)} function drawscore (text,x,y,w) {var ctx = w.getContext('2d'); ctx.fillStyle = "#000000"; ctx.font="28px Times" ctx.fillText(text,x+12,y+18); return true} //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Ownership