$(window).on({ contextmenu: function () { return false; }, dragstart: function () { return false; }, beforeunload: function () { return true; } }) var curCol = 0, myCol = 2, cur, messages = [0, 0, 0]; function isMobile() { let flag = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); // alert(navigator.userAgent + '\n' + flag) return flag; } function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); var expires = "expires=" + d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires; } function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name) == 0) return c.substring(name.length, c.length); } return ""; } function checkCookie() { myCol = parseInt(getCookie('color')) if (myCol != 0 && myCol != 1) myCol = 2; } function updateCurLight() { if (curCol == 1) { $('.light').removeClass("black"); $('.light').addClass("white"); } else { $('.light').removeClass("white"); $('.light').addClass("black"); } } function updateMyLight() { if (myCol == 1) { $('.mylight').removeClass("black"); $('.mylight').addClass("white"); } else if (myCol == 0) { $('.mylight').removeClass("white"); $('.mylight').addClass("black"); } else { $('.mylight').removeClass("black white"); } } function updateMessages() { if (messages[0]) $('.message1').addClass("red"); else $('.message1').removeClass("red"); if (messages[1]) $('.message2').addClass("red"); else $('.message2').removeClass("red"); if (messages[2]) $('.message3').addClass("red"); else $('.message3').removeClass("red"); if (messages[3]) $('.message4').addClass("red"); else $('.message4').removeClass("red"); $("#messageText")[0].value = messages[4]; $("#messageServer")[0].innerHTML = messages[5]; if (messages[5] == 2) $("#messageServer").addClass('label-success') else $("#messageServer").removeClass('label-success') if (messages[5] > 2) $("#messageServer").addClass('label-warning') else $("#messageServer").removeClass('label-warning') } var timer, st = 1; function uploadMessages() { timer && clearTimeout(timer); timer = setTimeout(function () { st = 1; }, 100); //FUUUULL BRiDGE RECtiFyer!!! if (st) { console.log('Messages updated.') sendMessage() } st = 0; } function updateCol() { updateCurLight(); if (curCol) { $('.pointer').removeClass("black"); $('.pointer').addClass("white"); } else { $('.pointer').removeClass("white"); $('.pointer').addClass("black"); } } class Chess { constructor(ele) { this.ele = ele; this.init(); } init() { this.arr = []; this.render(); $('.pointer')[0].style.display = 'block' $('.pointer').animate({ left: $('#game')[0].offsetLeft - 50, top: $('#game')[0].offsetTop + 30, }, 0); if (isMobile()) $('.pointer').hide(); $('.pos').on('mouseenter', function () { if ($(this).hasClass("black") || $(this).hasClass("white") || (myCol != 2 && myCol != curCol)) return; document.onmousemove = null $('.pointer').animate({ left: this.parentNode.parentNode.parentNode.parentNode.offsetLeft + this.parentNode.offsetLeft + 3, top: this.parentNode.parentNode.parentNode.parentNode.offsetTop + this.parentNode.offsetTop + 3, opacity: 0.7, }, 0) $('.pointer')[0].style.boxShadow = '3px 3px 7px rgba(15,15,15,0.5)' $('.pointer')[0].style.transform = 'scale(100%)' }) $('.pos').mouseleave(function (e) { updateCol(); document.onmousemove = function (e) { $('.pointer').animate({ left: e.pageX - 14, top: e.pageY - 14, opacity: 0.3, scale: 1 }, 0) } $('.pointer')[0].style.boxShadow = '' $('.pointer')[0].style.transform = '' }) this.span = $("#tbodys span"); let that = this $("#tbodys").on('click', 'tr td span', function () { that.click(this); }); $("#regret").on('click', function () { that.regret(); }) $("#agin").on('click', function () { that.agin(); }) $("#check").on('click', function () { that.check(); }) $(".message1").on('click', function () { messages[0] = !messages[0]; updateMessages(); uploadMessages(); }) $(".message2").on('click', function () { messages[1] = !messages[1]; updateMessages(); uploadMessages(); }) $(".message3").on('click', function () { messages[2] = !messages[2]; updateMessages(); uploadMessages(); }) $(".message4").on('click', function () { messages[3] = !messages[3]; messages[4] = $("#messageText")[0].value; updateMessages(); uploadMessages(); }) $("#messageText").on('input blur', function () { messages[4] = $("#messageText")[0].value; updateMessages(); uploadMessages(); }) } render() { let div = $("
").appendTo($(this.ele)) $("
").appendTo($(div)) let table2 = $("").addClass("tables").attr("border", "0").appendTo($(this.ele)); for (let i = 0; i < 16; i++) { let tr2 = $("").appendTo($("#tbodys")); for (let j = 0; j < 16; j++) { $("
").appendTo($(tr2)); } } } click(_this) { console.log(_this) this.ifs(_this) this.win(); } upd() { $(this.span).each((index, item) => { this.arr.forEach((arrItem, arrIndex) => { if (index == arrItem) { if (arrIndex % 2 == 0) $(item).addClass("black"); else $(item).addClass("white"); } }) }) let num = this.arr.length; curCol = num % 2; updateCurLight(); } ifs(_this) { if (myCol == 2) { myCol = curCol; setCookie('color', myCol, 1) } if ($(_this).hasClass("black") || $(_this).hasClass("white") || myCol != curCol) return; myCol = curCol; updateMyLight(); let num = this.arr.length; console.log(this.arr) $(this.span).each((index, item) => { $(item).removeClass("highlight"); if (item === _this) { this.arr.push(index); curCol = (num + 1) % 2; updateCurLight(); if (num % 2 == 0) { $(_this).addClass("black"); } else { $(_this).addClass("white"); } // return; } }) sendMessage(this.arr) } win() { let this_ = this; let brr = [], wrr = []; $(this_.arr).each((index, item) => { if ($(this_.span[item]).hasClass("black")) { brr.push(item); } else { wrr.push(item); } }) brr = brr.sort(function (a, b) { return a - b; }) wrr = wrr.sort(function (a, b) { return a - b; }) if (this.isInclude(brr, 1) || this.isInclude(brr, 16) || this.isInclude(brr, 17) || this.isInclude(brr, 15)) { this.arr = []; $("#xq-tips").show(); $(".xq-txt").html("Black Wins!"); $("#regret").hide(); } if (this.isInclude(wrr, 1) || this.isInclude(wrr, 16) || this.isInclude(wrr, 17) || this.isInclude(wrr, 15)) { this.arr = []; $("#xq-tips").show(); $(".xq-txt").html("White Wins!"); $("#regret").hide(); } } isInclude(brr, x) { for (let i = 0; i < brr.length; i++) { if (brr.includes(brr[i]) && brr.includes(brr[i] + x * 1) && brr.includes(brr[i] + x * 2) && brr.includes(brr[i] + x * 3) && brr.includes(brr[i] + x * 4)) { return true; } } } regret() { if (this.arr.length == 0 || curCol == myCol) { return false; } let len = this.arr.length - 1; let num = this.arr[len] $(this.span[num]).removeClass("black white"); curCol = num % 2; updateCol(); this.arr.pop(); sendMessage(this.arr) } reset() { this.arr = []; for (let i = 0; i < this.span.length; i++) { $(this.span[i]).removeClass("black white"); } } agin() { $('.pointer').removeClass("white"); $('.pointer').addClass("black"); checkCookie(); var exp = new Date(); exp.setTime(exp.getTime() - 1) setCookie('color', myCol, exp) myCol = 2; updateMyLight(); this.reset(); $("#xq-tips").hide(); $(".xq-txt").html(""); $("#regret").show(); sendMessage(this.arr) } check() { $(this.span).each((index, item) => { if (index == this.arr[this.arr.length - 1]) { $(item).addClass("highlight"); return; } }) } } var game = new Chess($("#game")); checkCookie(); var conversation = document.getElementById('conversation'); var sendBtn = document.getElementById('sendBtn'); var socket = null; var createSocket = function () { if (socket) { socket.close(); } var url = 'wss://' + window.location.host + '/ws/chess'; socket = new WebSocket(url); socket.onopen = function () { $('.ws').removeClass('glyphicon-remove') $('.ws').addClass('glyphicon-ok') $("#messageServer").removeClass('label-danger') console.log('Connected: ' + url); } socket.onmessage = function (event) { var map = JSON.parse(event.data).content; messages = JSON.parse(event.data).message console.log(messages) updateMessages(); game.reset(); game.arr = map; game.upd(); curCol = map.length % 2; if (map.length) { game.win() } else { $('.pointer').removeClass("white"); $('.pointer').addClass("black"); checkCookie(); var exp = new Date(); exp.setTime(exp.getTime() - 1) setCookie('color', myCol, exp) myCol = 2; $("#xq-tips").hide(); $(".xq-txt").html(""); $("#regret").show(); } console.log('Updated') } socket.onclose = function (e) { $('.ws').removeClass('glyphicon-ok') $('.ws').addClass('glyphicon-remove') $("#messageServer").addClass('label-danger') $("#messageServer")[0].innerHTML = '连接断开,请刷新页面' console.log('Disconnected: ' + url + ',' + e.code + ',' + e.reason + ',' + e.wasClean) } }; var sendMessage = function (map = game.arr, msg = messages, type = '') { var bd = JSON.stringify({ from: myCol, content: map, message: msg, type: type }) console.log(bd) fetch('/chess/setboard', { method: 'POST', headers: { 'Content-type': 'application/json', }, body: bd }) }; createSocket(); checkCookie(); game.upd(); updateCol(); updateMessages(); $("#begin").hide(); $("#regret").show(); $("#agin").show(); $("#game").show();