1 var canvas = document.getElementById("game-canvas");
2 var context = canvas.getContext("2d");
4 var backgroundColor = '#F5DEB3';
5 var gridColor = '#8B4513';
8 var border = canvas.width / 10;
9 var boardWidth = canvas.width - (border * 2);
10 var boardHeight = canvas.height - (border * 2);
12 var cellWidth = boardWidth / (boardSize - 1);
13 var cellHeight = boardHeight / (boardSize - 1);
27 for (var i = 0; i < boardSize; i++)
30 for (var j = 0; j < boardSize; j++)
37 // Connect to the websocket
39 const connect = function() {
40 return new Promise((resolve, reject) => {
41 const socketProtocol = (window.location.protocol === 'https:' ? 'wss:' : 'ws:')
42 const port = window.location.port;
43 const socketUrl = `${socketProtocol}//${window.location.hostname}:${port}/ws/`
46 socket = new WebSocket(socketUrl);
48 socket.onopen = (e) => {
49 // Resolve the promise - we are connected
53 socket.onmessage = (msg) => {
54 // Any data from the server can be manipulated here.
55 let parsed = JSON.parse(msg.data);
56 switch (parsed.type) {
58 console.log("Setting board state");
59 parsed.data.forEach( function (move, index) {
60 state[move.x][move.y] = move.state;
65 for (var i = 0; i < boardSize; i++) {
66 for (var j = 0; j < boardSize; j++) {
76 socket.onerror = (e) => {
77 // Return an error if any occurs
80 // Try to connect again
87 // check if a websocket is open
88 const isOpen = function(ws) {
89 console.log(ws.readyState);
90 return ws.readyState === ws.OPEN
98 /* draw board square */
99 context.fillStyle = backgroundColor;
100 context.fillRect(0, 0, canvas.width, canvas.height);
102 /* draw board grid */
103 context.fillStyle = gridColor;
104 for (var i = 0; i < boardSize - 1; i++)
106 for (var j = 0; j < boardSize - 1; j++)
109 i * cellWidth + border,
110 j * cellHeight + border,
117 /* draw quarter marks and center mark on grid */
118 var quarter = Math.floor((boardSize - 1) / 4);
120 var markerMargin = (markerSize / 2) + 0.5;
122 context.fillStyle = backgroundColor;
123 if (!!(boardSize % 2))
126 (((boardSize - 1) / 2) * cellWidth) + border - markerMargin,
127 (((boardSize - 1) / 2) * cellWidth) + border - markerMargin,
133 (quarter * cellWidth) + border - markerMargin,
134 (quarter * cellWidth) + border - markerMargin,
139 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
140 (quarter * cellWidth) + border - markerMargin,
145 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
146 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
151 (quarter * cellWidth) + border - markerMargin,
152 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
157 /* draw text labels for grid */
158 var size = canvas.width / 40;
159 var textSpacing = 10;
160 context.fillStyle = '#000000';
161 context.font = size + "px Arial";
163 for (i = 0; i < boardSize; i++)
166 (i + 1), textSpacing,
167 ((canvas.height - border) - (i * cellHeight)) + (size / 3)
170 (i + 1), canvas.width - (size + textSpacing),
171 ((canvas.height - border) - (i * cellHeight)) + (size / 3)
175 (String.fromCharCode(97 + i)),
176 (border + (i * cellHeight) + (size / 3)) - (size / 1.5),
180 (String.fromCharCode(97 + i)),
181 (border + (i * cellHeight) + (size / 3)) - (size / 1.5),
182 canvas.height - (textSpacing * 2)
189 function drawPieces() {
191 for (var i = 0; i < boardSize; i++)
193 for (var j = 0; j < boardSize; j++)
195 switch(state[i][j]) {
198 (i * cellWidth) + border,
199 (j * cellWidth) + border,
200 'rgba(255, 255, 255, 1)'
205 (i * cellWidth) + border,
206 (j * cellWidth) + border,
216 canvas.addEventListener('mousedown', function(evt)
219 // push state change to backend
221 socket.send(JSON.stringify({
227 "state":state[lastX][lastY] > 0 ? 0 : playerStone
231 console.log("Websocket is closed");
238 canvas.addEventListener('mousemove', function(evt)
240 var position = getGridPoint(evt);
242 if ((position.x != lastX) || (position.y != lastY))
246 ((position.x >=0) && (position.x < boardSize)) &&
247 ((position.y >=0) && (position.y < boardSize))
250 (position.x * cellWidth) + border,
251 (position.y * cellWidth) + border,
260 function placeStone(x, y, color)
262 var radius = cellWidth / 2;
265 context.arc(x, y, radius, 0, 2 * Math.PI, false);
266 context.fillStyle = color;
268 context.lineWidth = 5;
271 function getGridPoint(evt)
273 var rect = canvas.getBoundingClientRect();
276 (evt.clientX-border-rect.left) / (rect.right-2*border-rect.left) * boardWidth
279 (evt.clientY-border-rect.top) / (rect.bottom-2*border-rect.top) * boardHeight
282 var roundX = Math.round(x / cellWidth);
283 var roundY = Math.round(y / cellHeight);
292 document.getElementById("new").onclick = function () {
293 // new game, new session, etc
294 socket.send(JSON.stringify({
302 const stones = document.getElementById("stones");
303 playerStone = stones.selectedIndex;
304 stones.onchange = function () {
305 // let player pick stone type
306 playerStone = stones.selectedIndex;
307 console.log(`Player changed stone to ${playerStone}`);