From b7c32f1ae7f986fc8dc50dae55528f7259cfce59 Mon Sep 17 00:00:00 2001 From: Benjamin Auder <benjamin.auder@somewhere> Date: Mon, 8 Apr 2019 19:13:03 +0200 Subject: [PATCH] Advance in playing against computer --- client/src/components/BaseGame.vue | 16 +++++++--------- client/src/components/ComputerGame.vue | 22 +++++++++++++--------- client/src/variants/Alice.js | 4 +++- client/src/views/Rules.vue | 2 +- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index c898b2ff..78e64aad 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -7,7 +7,7 @@ label.modal-close(for="modalEog") h3#eogMessage.section {{ endgameMessage }} Board(:vr="vr" :last-move="lastMove" :analyze="analyze" :user-color="mycolor" - :orientation="orientation" :vname="variant.name" @play-move="play") + :orientation="orientation" :vname="vname" @play-move="play") .button-group button(@click="play") Play button(@click="undo") Undo @@ -38,17 +38,15 @@ export default { //MoveList, }, // "vr": VariantRules object, describing the game state + rules - props: ["vr","variant","analyze","players"], + props: ["vname","analyze","vr","fenStart","players","mycolor"], data: function() { return { st: store.state, + // NOTE: all following variables must be reset at the beginning of a game endgameMessage: "", orientation: "w", score: "*", //'*' means 'unfinished' - // userColor: given by gameId, or fen in problems mode (if no game Id)... - mycolor: "w", - fenStart: "", - moves: [], //all moves played in current game + moves: [], cursor: -1, //index of the move just played lastMove: null, }; @@ -59,7 +57,7 @@ export default { //return window.innerWidth >= 768; }, showFen: function() { - return this.variant.name != "Dark" || this.score != "*"; + return this.vname != "Dark" || this.score != "*"; }, }, methods: { @@ -93,7 +91,7 @@ export default { getPgn: function() { let pgn = ""; pgn += '[Site "vchess.club"]\n'; - pgn += '[Variant "' + this.variant.name + '"]\n'; + pgn += '[Variant "' + this.vname + '"]\n'; pgn += '[Date "' + getDate(new Date()) + '"]\n'; pgn += '[White "' + this.players[0] + '"]\n'; pgn += '[Black "' + this.players[1] + '"]\n'; @@ -187,7 +185,7 @@ export default { move.fen = this.vr.getFen(); if (this.st.settings.sound == 2) new Audio("/sounds/move.mp3").play().catch(err => {}); - // Send the move to web worker (including his own moves) + // Send the move to web worker (including his own moves) //TODO: doesn't work here --> need to send an event instead this.compWorker.postMessage(["newmove",move]); if (!navigate && (this.score == "*" || this.analyze)) { diff --git a/client/src/components/ComputerGame.vue b/client/src/components/ComputerGame.vue index 962960a4..ff9c7c04 100644 --- a/client/src/components/ComputerGame.vue +++ b/client/src/components/ComputerGame.vue @@ -1,7 +1,8 @@ <template lang="pug"> .row .col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2 - BaseGame(:variant="variant.name" :analyze="analyze" :players="players") + BaseGame(:vname="vname" :analyze="analyze" + :vr="vr" :fen-start="fenStart" :players="players" :mycolor="mycolor") </template> <script> @@ -15,16 +16,19 @@ export default { BaseGame, }, // mode: "auto" (game comp vs comp), "versus" (normal) or "analyze" - props: ["fen","mode","variant"], + props: ["fen","mode","vname"], data: function() { return { st: store.state, + // variables passed to BaseGame: + fenStart: "", + vr: null, + players: ["Myself","Computer"], //always playing white for now + mycolor: "w", // Web worker to play computer moves without freezing interface: timeStart: undefined, //time when computer starts thinking lockCompThink: false, //to avoid some ghost moves - fenStart: "", compWorker: null, - players: ["Myself","Computer"], //always playing white for now }; }, computed: { @@ -42,8 +46,6 @@ export default { }, // Modal end of game, and then sub-components created: function() { - if (!!this.fen) - this.launchGame(); // Computer moves web worker logic: (TODO: also for observers in HH games ?) this.compWorker = new Worker(); //'/javascripts/playCompMove.js'), this.compWorker.onmessage = e => { @@ -54,7 +56,7 @@ export default { // Small delay for the bot to appear "more human" const delay = Math.max(500-(Date.now()-this.timeStart), 0); setTimeout(() => { - const animate = this.variant.name != "Dark"; + const animate = this.vname != "Dark"; this.play(compMove[0], animate); if (compMove.length == 2) setTimeout( () => { this.play(compMove[1], animate); }, 750); @@ -62,14 +64,16 @@ export default { setTimeout( () => this.lockCompThink = false, 250); }, delay); } + if (!!this.fen) + this.launchGame(); }, // dans variant.js (plutôt room.js) conn gère aussi les challenges // et les chats dans chat.js. Puis en webRTC, repenser tout ça. methods: { launchGame: async function() { - const vModule = await import("@/variants/" + this.variant.name + ".js"); + const vModule = await import("@/variants/" + this.vname + ".js"); window.V = vModule.VariantRules; - this.compWorker.postMessage(["scripts",this.variant.name]); + this.compWorker.postMessage(["scripts",this.vname]); this.newGameFromFen(this.fen); }, newGameFromFen: function(fen) { diff --git a/client/src/variants/Alice.js b/client/src/variants/Alice.js index 5a2d48cf..2feb8b8f 100644 --- a/client/src/variants/Alice.js +++ b/client/src/variants/Alice.js @@ -1,4 +1,6 @@ import { ChessRules } from "@/base_rules"; +import { ArrayFun} from "@/utils/array"; + // NOTE: alternative implementation, probably cleaner = use only 1 board export const VariantRules = class AliceRules extends ChessRules { @@ -81,7 +83,7 @@ export const VariantRules = class AliceRules extends ChessRules getSideBoard(mirrorSide) { // Build corresponding board from complete board - let sideBoard = doubleArray(V.size.x, V.size.y, ""); + let sideBoard = ArrayFun.init(V.size.x, V.size.y, ""); for (let i=0; i<V.size.x; i++) { for (let j=0; j<V.size.y; j++) diff --git a/client/src/views/Rules.vue b/client/src/views/Rules.vue index c92e0abe..322baba6 100644 --- a/client/src/views/Rules.vue +++ b/client/src/views/Rules.vue @@ -11,7 +11,7 @@ | Stop game .section-content(v-show="display=='rules'" v-html="content") ComputerGame(v-show="display=='computer'" - :fen="fen" :mode="mode" :variant="variant" + :fen="fen" :mode="mode" :vname="variant.name" @computer-think="gameInProgress=false" @game-over="stopGame") </template> -- 2.44.0