From ec25fc62fdc964ad9cfd292e550fb0fa499a5db5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Nov 2020 15:58:34 +0900 Subject: [PATCH] =?UTF-8?q?=E7=B5=82=E7=9B=A4=E3=81=A7=E3=81=AF=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E8=AA=AD=E3=81=BF=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/reversi/back.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/modules/reversi/back.ts b/src/modules/reversi/back.ts index 9223b68..4d45471 100644 --- a/src/modules/reversi/back.ts +++ b/src/modules/reversi/back.ts @@ -37,6 +37,16 @@ class Session { */ private cellWeights: number[]; + /** + * 最大のターン数 + */ + private maxTurn; + + /** + * 現在のターン数 + */ + private currentTurn = 0; + /** * 対局が開始したことを知らせた投稿 */ @@ -113,6 +123,8 @@ class Session { loopedBoard: this.game.loopedBoard }); + this.maxTurn = this.o.map.filter(p => p === 'empty').length - this.o.board.filter(x => x != null).length; + //#region 各マスの価値を計算しておく // 標準的な 8*8 のマップなら予め定義した価値マップを使用 @@ -253,6 +265,7 @@ class Session { */ private onSet = (msg: any) => { this.o.put(msg.color, msg.pos); + this.currentTurn++; if (msg.next === this.botColor) { this.think(); @@ -289,7 +302,7 @@ class Session { } private think = () => { - console.log('Thinking...'); + console.log(`(${this.currentTurn}/${this.maxTurn}) Thinking...`); console.time('think'); // 接待モードのときは、全力(5手先読みくらい)で負けるようにする @@ -351,16 +364,18 @@ class Session { let a = alpha; let b = beta; + const nextDepth = (this.strength >= 4) && ((this.maxTurn - this.currentTurn) <= 12) ? Infinity : depth + 1; + // 次のターンのプレイヤーにとって最も良い手を取得 // TODO: cansをまず浅く読んで(または価値マップを利用して)から有益そうな手から順に並べ替え、効率よく枝刈りできるようにする for (const p of cans) { if (isBotTurn) { - const score = dive(p, a, beta, depth + 1); + const score = dive(p, a, beta, nextDepth); value = Math.max(value, score); a = Math.max(a, value); if (value >= beta) break; } else { - const score = dive(p, alpha, b, depth + 1); + const score = dive(p, alpha, b, nextDepth); value = Math.min(value, score); b = Math.min(b, value); if (value <= alpha) break;