Gamemaster
General
Game
Playing
hex
Description
Hex is a 2-player alternating move game played on a 9x9 hexagonally-connected board. On each step, one of the players places a colored marker on an open hexagon. The goal of the game is for the a player to form a path of markers of its color connecting one side of the board to the other. The goal of the red player is connect the upper left to the lower right, while the goal of the black player is to connect the upper right to the lower left. The game is interesting in that one of the two players must win; there is no possibility of a draw. The clever GDL encoding of the rules for this game is due to Peter Pham.
Rulesheet
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% hex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% metadata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% role(red) role(black) base(cell(M,N,R)) :- row(M) & col(N) & role(R) base(connected(K,M,N)) :- succ(K,L) & row(M) & col(N) base(owner(K,R)) :- succ(K,L) & role(R) base(step(K)) :- succ(K,L) base(control(R)) :- role(R) action(place(M,N)) :- row(M) & col(N) action(update(J)) :- succ(J,K) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% init %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(step(1)) init(control(red)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% legal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% legal(place(M,N)) :- row(M) & col(N) & ~cell(M,N,red) & ~cell(M,N,black) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% operations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% place(M,N) :: control(R) & step(K) ==> cell(M,N,R) & owner(K,R) & connected(K,M,N) place(M,N) :: control(R) & adjacent(M,N,P,Q) & connected(J,P,Q) & owner(J,R) ==> update(J) place(M,N) :: kerchunk update(J) :: connected(J,X,Y) & step(K) ==> ~connected(J,X,Y) & connected(K,X,Y) kerchunk :: step(M) & succ(M,N) ==> ~step(M) & step(N) kerchunk :: control(red) ==> ~control(red) & control(black) kerchunk :: control(black) ==> ~control(black) & control(red) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% goal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% goal(red,100) :- redpath goal(red,0) :- ~redpath goal(black,100) :- blackpath goal(black,0) :- ~blackpath %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% terminal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% terminal :- redpath terminal :- blackpath %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% adjacent(J,K,J,N) :- nextcol(K,N) & row(J) adjacent(J,K,J,N) :- nextcol(N,K) & row(J) adjacent(J,K,M,K) :- nextrow(J,M) & col(K) adjacent(J,K,M,K) :- nextrow(M,J) & col(K) adjacent(J,K,M,N) :- nextrow(M,J) & nextcol(K,N) adjacent(J,K,M,N) :- nextrow(J,M) & nextcol(N,K) redpath :- connected(K,a,I) & connected(K,i,J) & owner(K,red) blackpath :- connected(K,I,1) & connected(K,J,9) & owner(K,black) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Facts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% row(a) row(b) row(c) row(d) row(e) row(f) row(g) row(h) row(i) col(1) col(2) col(3) col(4) col(5) col(6) col(7) col(8) col(9) nextrow(a,b) nextrow(b,c) nextrow(c,d) nextrow(d,e) nextrow(e,f) nextrow(f,g) nextrow(g,h) nextrow(h,i) nextcol(1,2) nextcol(2,3) nextcol(3,4) nextcol(4,5) nextcol(5,6) nextcol(6,7) nextcol(7,8) nextcol(8,9) succ(1,2) succ(2,3) succ(3,4) succ(4,5) succ(5,6) succ(6,7) succ(7,8) succ(8,9) succ(9,10) succ(10,11) succ(11,12) succ(12,13) succ(13,14) succ(14,15) succ(15,16) succ(16,17) succ(17,18) succ(18,19) succ(19,20) succ(20,21) succ(21,22) succ(22,23) succ(23,24) succ(24,25) succ(25,26) succ(26,27) succ(27,28) succ(28,29) succ(29,30) succ(30,31) succ(31,32) succ(32,33) succ(33,34) succ(34,35) succ(35,36) succ(36,37) succ(37,38) succ(38,39) succ(39,40) succ(40,41) succ(41,42) succ(42,43) succ(43,44) succ(44,45) succ(45,46) succ(46,47) succ(47,48) succ(48,49) succ(49,50) succ(50,51) succ(51,52) succ(52,53) succ(53,54) succ(54,55) succ(55,56) succ(56,57) succ(57,58) succ(58,59) succ(59,60) succ(60,61) succ(61,62) succ(62,63) succ(63,64) succ(64,65) succ(65,66) succ(66,67) succ(67,68) succ(68,69) succ(69,70) succ(70,71) succ(71,72) succ(72,73) succ(73,74) succ(74,75) succ(75,76) succ(76,77) succ(77,78) succ(78,79) succ(79,80) succ(80,81) succ(81,82) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Stylesheet
//============================================================================== // Hex //============================================================================== function renderstate (state) {var step = compfindx('N',seq('step','N'),state,library); var role = compfindx('R',seq('control','R'),state,library); var table = document.createElement('table'); table.setAttribute('border','0'); var row = table.insertRow(0); var cell = row.insertCell(0); cell.setAttribute('align','center'); cell.setAttribute('style','font-size:20px'); cell.innerHTML = 'Step: ' + step; row = table.insertRow(1); var cell = row.insertCell(0); var board = renderboard(state); cell.appendChild(board); row = table.insertRow(2); var cell = row.insertCell(0); cell.setAttribute('align','center'); cell.setAttribute('style','font-size:20px'); if (compfindp('terminal',state,library)) {cell.innerHTML = 'Game over'} else {cell.innerHTML = 'Control: ' + role}; return table} function renderboard (state) {var canvas = document.createElement('canvas'); canvas.setAttribute('width','540px'); canvas.setAttribute('height','441px'); //drawhex(300, 0,canvas); //drawreddish(270, 20,canvas); //drawgrey(330, 20,canvas); drawhex(240, 40,canvas); //drawhex(300, 40,canvas); //drawgrey(360, 40,canvas); drawreddish(210, 60,canvas); drawgrey(270, 60,canvas); //drawhex(330, 60,canvas); //drawgrey(390, 60,canvas); drawreddish(180, 80,canvas); drawhex(240, 80,canvas); drawgrey(300, 80,canvas); //drawhex(360, 80,canvas); //drawgrey(420, 80,canvas); drawreddish(150,100,canvas); drawhex(210,100,canvas); drawhex(270,100,canvas); drawgrey(330,100,canvas); //drawhex(390,100,canvas); //drawgrey(450,100,canvas); drawreddish(120,120,canvas); drawhex(180,120,canvas); drawhex(240,120,canvas); drawhex(300,120,canvas); drawgrey(360,120,canvas); //drawhex(420,120,canvas); //drawgrey(480,120,canvas); drawreddish( 90,140,canvas); drawhex(150,140,canvas); drawhex(210,140,canvas); drawhex(270,140,canvas); drawhex(330,140,canvas); drawgrey(390,140,canvas); //drawhex(450,140,canvas); //drawgrey(510,140,canvas); drawreddish( 60,160,canvas); drawhex(120,160,canvas); drawhex(180,160,canvas); drawhex(240,160,canvas); drawhex(300,160,canvas); drawhex(360,160,canvas); drawgrey(420,160,canvas); //drawhex(480,160,canvas); //drawgrey(540,160,canvas); drawreddish( 30,180,canvas); drawhex( 90,180,canvas); drawhex(150,180,canvas); drawhex(210,180,canvas); drawhex(270,180,canvas); drawhex(330,180,canvas); drawhex(390,180,canvas); drawgrey(450,180,canvas); //drawhex(510,180,canvas); //drawgrey(570,180,canvas); drawhex( 0,200,canvas); drawhex( 60,200,canvas); drawhex(120,200,canvas); drawhex(180,200,canvas); drawhex(240,200,canvas); drawhex(300,200,canvas); drawhex(360,200,canvas); drawhex(420,200,canvas); drawhex(480,200,canvas); //drawhex(540,200,canvas); //drawhex(600,200,canvas); drawgrey( 30,220,canvas); drawhex( 90,220,canvas); drawhex(150,220,canvas); drawhex(210,220,canvas); drawhex(270,220,canvas); drawhex(330,220,canvas); drawhex(390,220,canvas); drawreddish(450,220,canvas); //drawreddish(510,220,canvas); //drawreddish(570,220,canvas); drawgrey( 60,240,canvas); drawhex(120,240,canvas); drawhex(180,240,canvas); drawhex(240,240,canvas); drawhex(300,240,canvas); drawhex(360,240,canvas); drawreddish(420,240,canvas); //drawreddish(480,240,canvas); //drawreddish(540,240,canvas); drawgrey( 90,260,canvas); drawhex(150,260,canvas); drawhex(210,260,canvas); drawhex(270,260,canvas); drawhex(330,260,canvas); drawreddish(390,260,canvas); //drawhex(450,260,canvas); //drawreddish(510,260,canvas); drawgrey(120,280,canvas); drawhex(180,280,canvas); drawhex(240,280,canvas); drawhex(300,280,canvas); drawreddish(360,280,canvas); //drawhex(420,280,canvas); //drawreddish(480,280,canvas); drawgrey(150,300,canvas); drawhex(210,300,canvas); drawhex(270,300,canvas); drawreddish(330,300,canvas); //drawhex(390,300,canvas); //drawreddish(450,300,canvas); drawgrey(180,320,canvas); drawhex(240,320,canvas); drawreddish(300,320,canvas); //drawhex(360,320,canvas); //drawreddish(420,320,canvas); drawgrey(210,340,canvas); drawreddish(270,340,canvas); //drawhex(330,340,canvas); //drawreddish(390,340,canvas); drawhex(240,360,canvas); //drawhex(300,360,canvas); //drawreddish(360,360,canvas); //drawgrey(270,380,canvas); //drawreddish(330,380,canvas); //drawhex(300,400,canvas); for (var i=0; i
Ownership