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);
24 function getStone(i) {
37 for (var i = 0; i < boardSize; i++)
40 for (var j = 0; j < boardSize; j++)
47 // Connect to the websocket
49 const connect = function() {
50 return new Promise((resolve, reject) => {
51 const socketProtocol = (window.location.protocol === 'https:' ? 'wss:' : 'ws:')
53 const socketUrl = `${socketProtocol}//${window.location.hostname}:${port}/ws/`
56 socket = new WebSocket(socketUrl);
58 socket.onopen = (e) => {
59 // Send a little test data, which we can use on the server if we want
60 // Resolve the promise - we are connected
64 socket.onmessage = (msg) => {
65 // Any data from the server can be manipulated here.
66 let parsed = JSON.parse(msg.data);
67 switch (parsed.type) {
69 console.log("Setting board state");
70 parsed.data.forEach( function (move, index) {
71 state[move.x][move.y] =
72 move.state === 'white' ? 1 :
73 move.state === 'black' ? 2 :
83 socket.onerror = (e) => {
84 // Return an error if any occurs
87 // Try to connect again
94 // check if a websocket is open
95 const isOpen = function(ws) {
96 console.log(ws.readyState);
97 return ws.readyState === ws.OPEN
105 /* draw board square */
106 context.fillStyle = backgroundColor;
107 context.fillRect(0, 0, canvas.width, canvas.height);
109 /* draw board grid */
110 context.fillStyle = gridColor;
111 for (var i = 0; i < boardSize - 1; i++)
113 for (var j = 0; j < boardSize - 1; j++)
116 i * cellWidth + border,
117 j * cellHeight + border,
124 /* draw quarter marks and center mark on grid */
125 var quarter = Math.floor((boardSize - 1) / 4);
127 var markerMargin = (markerSize / 2) + 0.5;
129 context.fillStyle = backgroundColor;
130 if (!!(boardSize % 2))
133 (((boardSize - 1) / 2) * cellWidth) + border - markerMargin,
134 (((boardSize - 1) / 2) * cellWidth) + border - markerMargin,
140 (quarter * cellWidth) + border - markerMargin,
141 (quarter * cellWidth) + border - markerMargin,
146 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
147 (quarter * cellWidth) + border - markerMargin,
152 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
153 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
158 (quarter * cellWidth) + border - markerMargin,
159 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
164 /* draw text labels for grid */
165 var size = canvas.width / 40;
166 var textSpacing = 10;
167 context.fillStyle = '#000000';
168 context.font = size + "px Arial";
170 for (i = 0; i < boardSize; i++)
173 (i + 1), textSpacing,
174 ((canvas.height - border) - (i * cellHeight)) + (size / 3)
177 (i + 1), canvas.width - (size + textSpacing),
178 ((canvas.height - border) - (i * cellHeight)) + (size / 3)
182 (String.fromCharCode(97 + i)),
183 (border + (i * cellHeight) + (size / 3)) - (size / 1.5),
187 (String.fromCharCode(97 + i)),
188 (border + (i * cellHeight) + (size / 3)) - (size / 1.5),
189 canvas.height - (textSpacing * 2)
196 function drawPieces() {
198 for (var i = 0; i < boardSize; i++)
200 for (var j = 0; j < boardSize; j++)
202 switch(state[i][j]) {
205 (i * cellWidth) + border,
206 (j * cellWidth) + border,
207 'rgba(255, 255, 255, 1)'
212 (i * cellWidth) + border,
213 (j * cellWidth) + border,
223 canvas.addEventListener('mousedown', function(evt)
226 // push state change to backend
229 if (state[lastX][lastY] === 0) {
230 stone = playCount++ % 2 + 1;
234 socket.send(JSON.stringify({
240 "state":getStone(stone)
244 console.log("Websocket is closed");
251 canvas.addEventListener('mousemove', function(evt)
253 var position = getGridPoint(evt);
255 if ((position.x != lastX) || (position.y != lastY))
259 ((position.x >=0) && (position.x < boardSize)) &&
260 ((position.y >=0) && (position.y < boardSize))
263 (position.x * cellWidth) + border,
264 (position.y * cellWidth) + border,
273 function placeStone(x, y, color)
275 var radius = cellWidth / 2;
278 context.arc(x, y, radius, 0, 2 * Math.PI, false);
279 context.fillStyle = color;
281 context.lineWidth = 5;
284 function getGridPoint(evt)
286 var rect = canvas.getBoundingClientRect();
289 (evt.clientX-border-rect.left) / (rect.right-2*border-rect.left) * boardWidth
292 (evt.clientY-border-rect.top) / (rect.bottom-2*border-rect.top) * boardHeight
295 var roundX = Math.round(x / cellWidth);
296 var roundY = Math.round(y / cellHeight);