Gamemaster
General
Game
Playing
connectfour
Description
Two players (red and black) take turns. Each drops a disc of their color into the grid from the top. The first player to get four in a row (horizontally, vertically, or diagonally) wins.
Rulesheet
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% connectfour %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% metadata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% role(red) role(black) base(cell(X,Y,P)) :- column(X) & height(Y) & role(P) base(control(red)) base(control(black)) action(drop(X)) :- column(X) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% init %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(control(red)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% legal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% legal(drop(X)) :- columnopen(X) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% operations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% drop(X) :: control(R) & ~cell(X,1,red) & ~cell(X,1,black) ==> cell(X,1,R) drop(X) :: control(R) & cell(X,Y1,P) & succ(Y1,Y2) & cellopen(X,Y2) ==> cell(X,Y2,R) drop(X) :: control(red) ==> ~control(red) & control(black) drop(X) :: control(black) ==> ~control(black) & control(red) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% goal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% goal(red,100) :- line(red) goal(red,50) :- ~line(red) & ~line(black) & ~boardopen goal(red,0) :- line(black) goal(red,0) :- ~line(red) & ~line(black) & boardopen goal(black,100) :- line(black) goal(black,50) :- ~line(red) & ~line(black) & ~boardopen goal(black,0) :- line(red) goal(black,0) :- ~line(red) & ~line(black) & boardopen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% terminal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% terminal :- line(red) terminal :- line(black) terminal :- ~boardopen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cellopen(X,Y) :- column(X) & height(Y) & ~cell(X,Y,red) & ~cell(X,Y,black) columnopen(X) :- cellopen(X,6) boardopen :- columnopen(X) line(Player) :- cell(X1,Y,Player) & succ(X1,X2) & succ(X2,X3) & succ(X3,X4) & cell(X2,Y,Player) & cell(X3,Y,Player) & cell(X4,Y,Player) line(Player) :- cell(X,Y1,Player) & succ(Y1,Y2) & succ(Y2,Y3) & succ(Y3,Y4) & cell(X,Y2,Player) & cell(X,Y3,Player) & cell(X,Y4,Player) line(Player) :- cell(X1,Y1,Player) & succ(X1,X2) & succ(X2,X3) & succ(X3,X4) & succ(Y1,Y2) & succ(Y2,Y3) & succ(Y3,Y4) & cell(X2,Y2,Player) & cell(X3,Y3,Player) & cell(X4,Y4,Player) line(Player) :- cell(X1,Y4,Player) & succ(X1,X2) & succ(X2,X3) & succ(X3,X4) & succ(Y3,Y4) & succ(Y2,Y3) & succ(Y1,Y2) & cell(X2,Y3,Player) & cell(X3,Y2,Player) & cell(X4,Y1,Player) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Data %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% succ(1,2) succ(2,3) succ(3,4) succ(4,5) succ(5,6) succ(6,7) succ(7,8) column(1) column(2) column(3) column(4) column(5) column(6) column(7) column(8) height(1) height(2) height(3) height(4) height(5) height(6) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Stylesheet
//============================================================================== // connectfour //============================================================================== 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.setAttribute('style',"font-size:14px;font-family:arial;color:#888888"); cell.innerHTML = "Click a column to drop a piece in that column."; var row = table.insertRow(table.rows.length); var cell = row.insertCell(0); cell.setAttribute('align','center'); cell.appendChild(renderactiveboard(state)); row = table.insertRow(table.rows.length); var cell = row.insertCell(0); 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 (state) {var table = document.createElement('table'); table.setAttribute('cellspacing','0'); table.setAttribute('cellpadding','0'); table.setAttribute('border','10'); for (var i=0; i<6; i++) {var row = table.insertRow(i); var rownum = String(6-i); for (var j=0; j<8; j++) {var cell = row.insertCell(j); var colnum = String(j+1); var filler = compfindx('Z',seq('cell',colnum,rownum,'Z'),state,seq()); cell.height='60'; cell.width='60'; cell.align='center'; cell.valign='center'; if (filler=='red') {cell.innerHTML = '
'}; if (filler=='black') {cell.innerHTML = '
'}; if (filler==false) {cell.innerHTML = ' '}; cell.setAttribute('name',grind(seq('drop',(j+1).toString()))); cell.setAttribute('onclick',"perform(read(this.getAttribute('name')))"); cell.style.cursor = "pointer";}}; return table} //============================================================================== function renderstate (state) {var role = compfindx('R',seq('control','R'),state,library); var table = document.createElement('table'); table.setAttribute('border','0'); var row = table.insertRow(table.rows.length); var cell = row.insertCell(0); var board = renderboard(state); cell.appendChild(board); row = table.insertRow(table.rows.length); 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 table = document.createElement('table'); table.setAttribute('cellspacing','0'); table.setAttribute('cellpadding','0'); table.setAttribute('border','10'); for (var i=0; i<6; i++) {var row = table.insertRow(i); var rownum = String(6-i); for (var j=0; j<8; j++) {var cell = row.insertCell(j); var colnum = String(j+1); var filler = compfindx('Z',seq('cell',colnum,rownum,'Z'),state,seq()); cell.height='60'; cell.width='60'; cell.align='center'; cell.valign='center'; if (filler=='red') {cell.innerHTML = '
'}; if (filler=='black') {cell.innerHTML = '
'}; if (filler==false) {cell.innerHTML = ' '}}}; return table} //============================================================================== function renderactions (state) {return document.createTextNode("")} //============================================================================== //============================================================================== //==============================================================================
Ownership