Gamemaster
General
Game
Playing
hexlite
Description
Hex7x7 is a 2-player alternating move game played on a 7x7 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% hex7x7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% metadata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% role(red) role(blue) 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(mark(M,N)) :- row(M) & col(N) action(transfer(M,N)) :- row(M) & col(N) action(cleanup(J)) :- succ(J,K) action(update(M,N)) :- row(M) & col(N) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% init %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(step(1)) init(control(red)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% legal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% legal(mark(M,N)) :- row(M) & col(N) & ~cell(M,N,red) & ~cell(M,N,blue) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% operations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mark(M,N) :: control(R) & step(K) ==> cell(M,N,R) & owner(K,R) & connected(K,M,N) mark(M,N) :: control(R) & adjacent(M,N,P,Q) & cell(P,Q,R) ==> transfer(P,Q) mark(M,N) :: kerchunk transfer(P,Q) :: connected(J,P,Q) ==> cleanup(J) cleanup(J) :: connected(J,M,N) ==> ~connected(J,M,N) & update(M,N) update(M,N) :: step(K) ==> connected(K,M,N) kerchunk :: step(M) & succ(M,N) ==> ~step(M) & step(N) kerchunk :: control(red) ==> ~control(red) & control(blue) kerchunk :: control(blue) ==> ~control(blue) & control(red) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% goal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% goal(red,100) :- redpath goal(red,0) :- ~redpath goal(blue,100) :- bluepath goal(blue,0) :- ~bluepath %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% terminal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% terminal :- redpath terminal :- bluepath %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% 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,g,J) & owner(K,red) bluepath :- connected(K,I,1) & connected(K,J,7) & owner(K,blue) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Facts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% row(a) row(b) row(c) row(d) row(e) row(f) row(g) col(1) col(2) col(3) col(4) col(5) col(6) col(7) nextrow(a,b) nextrow(b,c) nextrow(c,d) nextrow(d,e) nextrow(e,f) nextrow(f,g) nextcol(1,2) nextcol(2,3) nextcol(3,4) nextcol(4,5) nextcol(5,6) nextcol(6,7) 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) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Stylesheet
//============================================================================== // Hex //============================================================================== function rendersituation (state) {var role = findcontrol(state,library); var table = document.createElement('table'); table.setAttribute('border','0'); var row = table.insertRow(table.rows.length); var cell = row.insertCell(0); cell.setAttribute('align','center'); cell.appendChild(renderactiveboard(role,state)); console.log(cell.childNodes[0].rows[0].cells[0].childNodes[1]); row = table.insertRow(table.rows.length); var cell = row.insertCell(0); cell.id = 'control'; cell.setAttribute('align','center'); cell.setAttribute('style','font-size:20px'); if (findterminalp(state,library)) {cell.innerHTML = 'Game over'} else {cell.innerHTML = 'Control: ' + role}; return table} function renderactiveboard (role,state) {var table = document.createElement('table'); table.setAttribute('width','600'); var row = table.insertRow(0); var cell = row.insertCell(0); cell.setAttribute('align','center'); var grid = renderactivegrid( renderactiveodd( renderactivehole(), renderactivehole(), renderactivehole(), renderactivecell('hex','mark(a,7)',state), renderactivehole(), renderactivehole(), renderactivehole()), renderactiveeven( renderactivehole(), renderactivehole(), renderactivecell('red','mark(a,6)',state), renderactivecell('blu','mark(b,7)',state), renderactivehole(), renderactivehole()), renderactiveodd( renderactivehole(), renderactivehole(), renderactivecell('red','mark(a,5)',state), renderactivecell('hex','mark(b,6)',state), renderactivecell('blu','mark(c,7)',state), renderactivehole(), renderactivehole()), renderactiveeven( renderactivehole(), renderactivecell('red','mark(a,4)',state), renderactivecell('hex','mark(b,5)',state), renderactivecell('hex','mark(c,6)',state), renderactivecell('blu','mark(d,7)',state), renderactivehole()), renderactiveodd( renderactivehole(), renderactivecell('red','mark(a,3)',state), renderactivecell('hex','mark(b,4)',state), renderactivecell('hex','mark(c,5)',state), renderactivecell('hex','mark(d,6)',state), renderactivecell('blu','mark(e,7)',state), renderactivehole()), renderactiveeven( renderactivecell('red','mark(a,2)',state), renderactivecell('hex','mark(b,3)',state), renderactivecell('hex','mark(c,4)',state), renderactivecell('hex','mark(d,5)',state), renderactivecell('hex','mark(e,6)',state), renderactivecell('blu','mark(f,7)',state)), renderactiveodd( renderactivecell('hex','mark(a,1)',state), renderactivecell('hex','mark(b,2)',state), renderactivecell('hex','mark(c,3)',state), renderactivecell('hex','mark(d,4)',state), renderactivecell('hex','mark(e,5)',state), renderactivecell('hex','mark(f,6)',state), renderactivecell('hex','mark(g,7)',state)), renderactiveeven( renderactivecell('blu','mark(b,1)',state), renderactivecell('hex','mark(c,2)',state), renderactivecell('hex','mark(d,3)',state), renderactivecell('hex','mark(e,4)',state), renderactivecell('hex','mark(f,5)',state), renderactivecell('red','mark(g,6)',state)), renderactiveodd( renderactivehole(), renderactivecell('blu','mark(c,1)',state), renderactivecell('hex','mark(d,2)',state), renderactivecell('hex','mark(e,3)',state), renderactivecell('hex','mark(f,4)',state), renderactivecell('red','mark(g,5)',state), renderactivehole()), renderactiveeven( renderactivehole(), renderactivecell('blu','mark(d,1)',state), renderactivecell('hex','mark(e,2)',state), renderactivecell('hex','mark(f,3)',state), renderactivecell('red','mark(g,4)',state), renderactivehole()), renderactiveodd( renderactivehole(), renderactivehole(), renderactivecell('blu','mark(e,1)',state), renderactivecell('hex','mark(f,2)',state), renderactivecell('red','mark(g,3)',state), renderactivehole(), renderactivehole()), renderactiveeven( renderactivehole(), renderactivehole(), renderactivecell('blu','mark(f,1)',state), renderactivecell('red','mark(g,2)',state), renderactivehole(), renderactivehole()), renderactiveodd( renderactivehole(), renderactivehole(), renderactivehole(), renderactivecell('hex','mark(g,1)',state), renderactivehole(), renderactivehole(), renderactivehole())); cell.appendChild(grid); return table} function renderactivegrid (r1,r2,r3,r4,r5,r6,r7,r8,r9,ra,rb,rc,rd) {var grid = document.createElement('div'); grid.setAttribute('class','hexGrid'); grid.appendChild(r1); grid.appendChild(r2); grid.appendChild(r3); grid.appendChild(r4); grid.appendChild(r5); grid.appendChild(r6); grid.appendChild(r7); grid.appendChild(r8); grid.appendChild(r9); grid.appendChild(ra); grid.appendChild(rb); grid.appendChild(rc); grid.appendChild(rd); return grid} function renderactiveodd (c1,c2,c3,c4,c5,c6,c7) {var grid = document.createElement('div'); grid.setAttribute('class','hexGridA'); grid.appendChild(c1); grid.appendChild(c2); grid.appendChild(c3); grid.appendChild(c4); grid.appendChild(c5); grid.appendChild(c6); grid.appendChild(c7); return grid} function renderactiveeven (c1,c2,c3,c4,c5,c6) {var grid = document.createElement('div'); grid.setAttribute('class','hexGridB'); grid.appendChild(c1); grid.appendChild(c2); grid.appendChild(c3); grid.appendChild(c4); grid.appendChild(c5); grid.appendChild(c6); return grid} function renderactivehole () {return document.createElement('div')} function renderactivecell(type,id,state) {var hex = read(id); var occupant = compfindx('R',seq('cell',hex[1],hex[2],'R'),state,library); var cell = document.createElement('div'); cell.setAttribute('class',type); cell.id = id; if (occupant==='red') {cell.style = 'background-color:#bb0000'; return cell}; if (occupant==='blue') {cell.style = 'background-color:#0000bb'; return cell}; cell.setAttribute('onclick','perform(read(this.id))'); if (type==='red') {cell.style = 'background-color:#ddd0d0;cursor:pointer'}; if (type==='blu') {cell.style = 'background-color:#d0d0dd;cursor:pointer'}; if (type==='hex') {cell.style = 'background-color:#cccccc;cursor:pointer'}; return cell} //============================================================================== 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','400px'); canvas.setAttribute('height','340px'); drawhex(180, 40,canvas); drawreddish(150, 60,canvas); drawgrey(210, 60,canvas); drawreddish(120, 80,canvas); drawhex(180, 80,canvas); drawgrey(240, 80,canvas); drawreddish( 90,100,canvas); drawhex(150,100,canvas); drawhex(210,100,canvas); drawgrey(270,100,canvas); drawreddish( 60,120,canvas); drawhex(120,120,canvas); drawhex(180,120,canvas); drawhex(240,120,canvas); drawgrey(300,120,canvas); drawreddish( 30,140,canvas); drawhex( 90,140,canvas); drawhex(150,140,canvas); drawhex(210,140,canvas); drawhex(270,140,canvas); drawgrey(330,140,canvas); drawhex( 0,160,canvas); drawhex(60,160,canvas); drawhex(120,160,canvas); drawhex(180,160,canvas); drawhex(240,160,canvas); drawhex(300,160,canvas); drawhex(360,160,canvas); drawgrey( 30,180,canvas); drawhex( 90,180,canvas); drawhex(150,180,canvas); drawhex(210,180,canvas); drawhex(270,180,canvas); drawreddish(330,180,canvas); drawgrey( 60,200,canvas); drawhex(120,200,canvas); drawhex(180,200,canvas); drawhex(240,200,canvas); drawreddish(300,200,canvas); drawgrey( 90,220,canvas); drawhex(150,220,canvas); drawhex(210,220,canvas); drawreddish(270,220,canvas); drawgrey(120,240,canvas); drawhex(180,240,canvas); drawreddish(240,240,canvas); drawgrey(150,260,canvas); drawreddish(210,260,canvas); drawhex(180,280,canvas); for (var i=0; i
Ownership