-倩䜿ãäžæã«èãäžãããš......
-å奜çãå奜ç...
-é ãäžããŠãã ããïŒ ãããŠåœŒãã¯é£ã¶ïŒ ãããŠåœŒãã¯é£ã¶ïŒ..
ãµãŒããªãŒãã©ãã§ãããã€ããŠã©ããé
ããæ©ãããéãå¿
ç¶çã«å質ã«ç§»è¡ããç¬éãå¿
ããããŸãã ç解ããå¿
èŠãããæ°ããã²ãŒã ãèç©ããã
ãããžã§ã¯ãã¯æ°ããæ©äŒã§å€§ãããªããããæ©äŒã¯äºãã«çµã¿åããããŠããŸãã ãã¹ãŠãèªéã§åŽ©å£ããªãå Žåãçµæã¯æã倧ããªæåŸ
ãè¶
ããå¯èœæ§ããããŸãã 殺ããªããã®ã¯ç§ãã¡ã匷ãããŸãïŒ
ãã®ãããªãæè¡ã®åèšãã®äŸã次ã«ç€ºããŸãã äžè¬çã«ãã²ãŒã ã¯ããã»ã©è€éã§ã¯ãããŸããããéåžžã«äºæ³å€ã§ãã
é»ç€ºé² -ãã£ãŒã«ãã«ã¯4人ã®éšæãšãããããµããŒãããæ©å
µãããŸãã
ãã§ã¹ã®é§ã®éåžžã®åãã æçµè¡ã«å°éããããŒã³ã¯ã©ã€ããŒã«ãªããšäºæ³ãããŸãããåãµã€ãã®ã©ã€ããŒã®æ°ã¯2ãè¶
ããããšã¯ã§ããŸããã æåã«ãã¹ãŠã®ã©ã€ããŒã倱ã£ããã¬ãŒã€ãŒãè² ããŸãã æªéã¯ããã€ãã®ããã«ã现éšã«é ããŠããŸãã ãã£ã®ã¥ã¢ã¯åæã«æ©ããŸãïŒ
ããã¯ãããžã§ã¯ãã®èŠ³ç¹ããã©ãããæå³ã§ããïŒãŸã第äžã«ãããºã«ã®ããã«ãããã¯ã1察1ã®ã²ãŒã ãã§ãããã¬ãŒã€ãŒã¯åãããããããã¯èªåã®åãããããã¯ã¹ãããŸãã ããã¯æ
å ±ãäžå®å
šãªã²ãŒã ã§ãããç§ãã¡ã«ãšã£ãŠã¯éåžžã«çãã圢åŒã§ãã ããã«ã¯ãµã€ã³ãããæŠäºã®é§ãã¯ãããŸãããã移åãå®è¡ããåãã¬ã€ã€ãŒã¯ãçžæãåæã«ã©ã®ããã«ããŠã³ããããç¥ããŸããã
ãã¡ãããè¡çªã¯å¯èœã§ãã ããšãã°ãäž¡æ¹ã®ãã¬ã€ã€ãŒãåæã«åã空ã®ãã£ãŒã«ãã«ç§»åããããããŒã³ãåãåãã§ææããé¢ããéšåãé£ã¹ãããšããå ŽåããããŸãã
ã²ãŒã ã®ã«ãŒã«ã¯ãããã®ãã¥ã¢ã³ã¹ãããŸã説æããŠããŸãã ããŒã³ã¯ãããŒã¹ããã®äœçœ®ãé¢ãããšããŠãã誰ããåãããšããŠããå Žåãæãã®åããããããšãã§ãã空ã®ãã£ãŒã«ãã§ã®ç«¶åã®çµæã¯ããŒã¹ã®ã©ã³ã¯ã«ãã£ãŠæ±ºå®ãããŸãã éšæã¯åžžã«ããŒã³ã殺ããŸãããããŒã¹ãçããå Žåããããã¯äž¡æ¹ãšãç Žå£ãããŸãïŒãšããã§ããããŒãå¯èœã«ãªããŸãïŒã
移åãããŒãžDagaz.Model.join = function(design, board, a, b) { var x = getPiece(design, board, a); var y = getPiece(design, board, b); if ((x !== null) && (y !== null)) { var r = Dagaz.Model.createMove(); r.protected = []; checkPromotion(design, board, a, x, b); checkPromotion(design, board, b, y, a); var p = a.actions[0][1][0]; var q = b.actions[0][1][0]; if ((p == q) && (x.type > y.type)) { r.actions.push(b.actions[0]); r.actions.push(a.actions[0]); } else { r.actions.push(a.actions[0]); r.actions.push(b.actions[0]); } if (p == q) { if (x.type > y.type) { r.actions[0][2] = [ Dagaz.Model.createPiece(2, 2) ]; r.protected.push(x.player); r.captured = p; } else { if (x.type == y.type) { r.actions[0][2] = [ Dagaz.Model.createPiece(2, 1) ]; r.actions[1][2] = [ Dagaz.Model.createPiece(2, 1) ]; r.capturePiece(p); } else { r.actions[0][2] = [ Dagaz.Model.createPiece(2, 1) ]; r.protected.push(y.player); r.captured = p; } } } return r; } else { return a; } }
ã¿ã¹ã¯ã¯ç°¡åã§ã¯ãããŸãããããåãã®æ¡å€§ãã®ã¡ã«ããºã ã¯å®å
šã«ããã«
察åŠããŸãã å®éãåã«äœåºŠãèšã£ãããã«ãåŸåŠç段éã§ã¯ã移åãçŠæ¢ããïŒããšãã°ãã²ãŒã ã®äžå€æ¡ä»¶ã«éåããïŒã ãã§ãªãããããã«ãã£ãŠåœ¢æããã移åããååŸããã¢ã¯ã·ã§ã³ãå«ãä»»æã®ã¢ã¯ã·ã§ã³ãè¿œå ããããšãã§ããŸãã
埮åŠãªç¹ã1ã€ãããŸããéåžžãçæããããã¹ãŠã®åãã«å¯ŸããŠãçæåŸããã«åŸåŠçãå®è¡ãããŸãã ãã®å Žåãããã¯å®è¡ã§ããŸãããããã¯å¿
ç¶çã«ãçµã¿åããççºãã«ã€ãªããããã§ãïŒã²ãŒã ã¯å°ããã§ãããããã§ãååã«å¿«é©ã§ã¯ãããŸããïŒã æãéèŠãªããšã¯ãããã¯å¿
èŠãªãããšã§ãã ãã£ãšç°¡åãªæ¹æ³ããããŸãã
ã³ã³ãããŒã©ãŒãæžãæããããšãã§ããªããšèšã人ã¯ããŸããã ã¢ãžã¥ãŒã«æ§ã«ã¯å©ç¹ããããŸãã
AIãããã®èŠ³ç¹ããèŠããšãã²ãŒã ã¯ããŸããŸãªæå³ã§ãããããšãå€æãããŠããŸãã å€æ°ã®åãã詳现ã«è¡šç€ºããå¿
èŠã¯ãããŸããã æµãã©ã®ããã«æ©ãããæšæž¬ããããšãéèŠã§ãïŒ ã²ãŒã ã®æŠè¡ã¯å€åããŠããŸãã ãæŠéäžãã®ã©ã€ããŒãæ»æããããšããããšã¯äºå®äžç¡æå³ã§ã-圌ãã¯ããããéããŸãã ããã©ãŒã¯ãã¯ããææã§ãããã©ã®ã©ã€ããŒãåãããéžæããå¿
èŠããããŸãã æµã«1人ã®ã©ã€ããŒããããªãå ŽåïŒãããŠãããªããå®å
šãªã»ãããæã£ãŠããå ŽåïŒãéžæãããã£ãŒã«ãã«ç§»åããããšã§ãæµããèŠããããšãã§ããŸãã ããŒã³ã«ããªãã§ãã ããïŒ æ°åã®å€æã«é¢é£ãããã¥ã¢ã³ã¹ããããŸãããäžè¬çã«ã¯...
ããã¯ãã¹ãŠãäžé£ã®ãã¥ãŒãªã¹ãã£ãã¯ã«åž°çããŸã ... var isCovered = function(design, board, pos, player, type) { var r = false; _.each(Dagaz.Model.GetCover(design, board)[pos], function(pos) { var piece = board.getPiece(pos); if ((piece !== null) && (piece.player == player)) { if (_.isUndefined(type) || (piece.type == type)) { r = true; } } }); return r; } Ai.prototype.getMove = function(ctx) { var moves = Dagaz.AI.generate(ctx, ctx.board); if (moves.length == 0) { return { done: true, ai: "nothing" }; } timestamp = Date.now(); var enemies = 0; var friends = 0; _.each(ctx.design.allPositions(), function(pos) { var piece = ctx.board.getPiece(pos); if ((piece !== null) && (piece.type == 1)) { if (piece.player == 1) { enemies++; } else { friends++ } } }); var eval = -MAXVALUE; var best = null; _.each(moves, function(move) { var e = _.random(0, NOISE_FACTOR); if (move.isSimpleMove()) { var pos = move.actions[0][0][0]; var trg = move.actions[0][1][0]; var piece = ctx.board.getPiece(pos); if (piece !== null) { var target = ctx.board.getPiece(trg); if (piece.type == 1) { if (isCovered(ctx.design, ctx.board, pos, 1)) e += MAXVALUE; if (target === null) { if (isCovered(ctx.design, ctx.board, trg, 1, 0)) e += LARGE_BONUS; if (isCovered(ctx.design, ctx.board, trg, 1, 1)) { if ((enemies == 1) && (friends == 2)) { e += BONUS; } else { e -= MAXVALUE; } } } else { if (target.type == 1) { e += SMALL_BONUS; } else { e += BONUS; } } } else { if (isCovered(ctx.design, ctx.board, pos, 1)) e += SMALL_BONUS; if ((target === null) && isCovered(ctx.design, ctx.board, trg, 1)) e -= MAXVALUE; if (friends == 1) e += BONUS; if (target !== null) e += SMALL_BONUS; if ((move.actions[0][2] !== null) && (move.actions[0][2][0].type != piece.type)) { if (friends == 1) { e += MAXVALUE; } else { e -= MAXVALUE; } } } } } if ((best === null) || (eval < e)) { console.log("Move: " + move.toString() + ", eval = " + e); best = move; eval = e; } }); return { done: true, move: best, time: Date.now() - timestamp, ai: "aggressive" }; }
ãã1ã€ã®æ¥µç«¯ãªç¹ã¯ãã²ãŒã ã倧ããè€éã§ãããããã²ãŒã ãå°ã詳ããèŠãããšãæè¡çã«äžå¯èœãªããšã§ãã ããã§ã¯ããã
ã«ãžã¥ã¢ã«ãªAI ã䜿çšããããšã
äœåãªããããŠããã1ã2移åã ãå
ã®äœçœ®ã衚瀺ããŠããŸãããã®æ·±ããŸã§ã䜿çšå¯èœãªãã¹ãŠã®ç§»åã衚瀺ããããšã¯ã§ããŸããã ãããã«ããã人ããããã®åãã2ã3ç§éæ€çŽ¢ããå¿«é©ãªæéã§ãã
ããã©ãŒãã³ã¹ã«ã€ããŠããå°ã倧èŠæš¡ã§è€éãªã²ãŒã ã§ã¯ããã¹ãŠã®ããã©ãŒãã³ã¹ã®åé¡ãæããã«ãªããŸãã éåžžãã³ãŒãã®å®è¡é床ã¯AIäœæ¥ã®å質ã«é¢é£ããŸãïŒå²ãåœãŠãããæéå
ã«èæ
®ããäœçœ®ãå€ããªãã°ãªãã»ã©ãåäœãåäžããŸãïŒããããã©ãŒãã³ã¹ã®åé¡ãããæããã«ãªãå ŽåããããŸãã
倩jiå°giã«åãçµãã§ããéçšã§ãããäœçœ®ã§ã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®åå¿æéãåçŽã«äžåœã«é·ããªã£ãŠããããšã«æ°ã¥ããŸããïŒçŽ10ã15ç§ïŒã
ããã¯ãã¹ãŠãçãããããªæªéãïŒããã³åæ§ã®æ°åïŒã«ã€ããŠã§ãã å³åŽã®å³ã«æ³šæããŠãã ããã éåžžã®ãç¯å²ãæ»æã«å ããŠããæªéãã¯ãã€ã§ããä»»æã®æ¹åã«æ倧3ã€ã®ã¯ã³ã¹ããã移åãå®è¡ããæš©å©ãããã以åã«å®äºãããã£ãŒã«ãã«æ»ãããšãã§ããŸãã ããã¯æ¬åœã®ãçµã¿åãããã©ãŒãããã©ãŒãã³ã¹ã§ãïŒ åæäœçœ®ã§ã¯ããã®ãããªãã¹ãŠã®ããŒã¹ããçµãããããšãããã®å¹æã¯ããã»ã©é¡èã§ã¯ãããŸããããéçšã¹ããŒã¹ã«å°éãããš...åžæãã人ã¯èªåã§å¯èœãªåãã®æ°ãèšç®ã§ããŸãïŒäžã®å³ã¯ãã²ãŒã äžã®èš±å¯ãããåãã®å¹³åæ°ã®å€åã®ã°ã©ãã瀺ããŠããŸããããã€ãã®æåãªã²ãŒã çšïŒã
ããã§ã¯ãDagazã®ã¢ãŒããã¯ãã£ã«ã€ããŠå°ãã話ãããå¿
èŠããããŸãã äž»ãªã¢ã€ãã¢ã¯ããŠãŒã¶ãŒãŸãã¯ãããã«å¶åŸ¡ãæž¡ãåã«ãã²ãŒã ã¢ãã«ãçŸåšã®äœçœ®ããå¯èœãª
ãã¹ãŠã®åããçæ
ããããšã§ãã ããã«ãããäžé£ã®åãå
šäœããå®å
šã«ãæ€èšããããšãã§ããè€åçãªåãã«é¢é£ããäœå
åãã®ã²ãŒã ã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãã ããã«ããã®ã¢ãããŒãã¯ãããã®éçºã«éåžžã«äŸ¿å©ã§ãã ãããã1ã€ã®åé¡ããããŸãã
ãŠãŒã¶ãŒã«ãšã£ãŠãè€éãªè€å移åãšã¯ã
äžé£ã®ç°ãªãã¢ã¯ã·ã§ã³ïŒç§»åããã£ããã£ãŒãããã³å Žåã«ãã£ãŠã¯ããŒããžã®æ°ããããŒã¹ã®ãªã»ããïŒã§ãã ãŠãŒã¶ãŒã®ãã¯ãªãã¯ãã®ã·ãŒã±ã³ã¹ã«åŸã£ãŠã以åã«äœæããããå Žåã«ãã£ãŠã¯å€§ããªãªã¹ãããåäžã®åããéžæã§ããããã«ããã³ãŒããå¿
èŠã§ãã ãããŠãã¡ãããDagazã®ãã®ãããªã³ãŒã
ã¯ã§ãã
ããã«ééãããããŸãã MoveList.prototype.isUniqueFrom = function(pos) { var c = 0; _.each(this.moves, function(move) { _.each(this.getActions(move), function(action) { if ((action[0] !== null) && (_.indexOf(action[0], pos) >= 0)) c++; }); }, this); return c == 1; } MoveList.prototype.isUniqueTo = function(pos) { var c = 0; _.each(this.moves, function(move) { _.each(this.getActions(move), function(action) { if ((action[1] !== null) && (_.indexOf(action[1], pos) >= 0)) c++; }); }, this); return c == 1; } ... MoveList.prototype.getStops = function() { var result = this.getTargets(); _.each(this.moves, function(move) { var actions = _.filter(this.getActions(move), isMove); if ((actions.length > 0) && (actions[0][0].length == 1) && (actions[0][1].length == 1)) { if (Dagaz.Model.smartFrom) { if (this.isUniqueFrom(actions[0][0][0]) && !this.canPass()) { result.push(actions[0][0][0]); } } if (Dagaz.Model.smartTo) { if (this.isUniqueTo(actions[0][1][0])) { result.push(actions[0][1][0]); } } } else { ... } }, this); return _.uniq(result); }
åé¡ã¯äœã§ããïŒ
getStopsé¢æ°ã¯ãå移åã®ãã¹ãŠã®æçµãã£ãŒã«ãã®ãªã¹ããäœæãããã®ããããµã€ã¯ã«å
ã®ãã¹ãŠã®ç§»åã
ç¹°ãè¿ããŸããã
smartFromãŸãã¯
smartToãªãã·ã§ã³ãæå¹ã«ãããšïŒä»£æ¿ãªãã·ã§ã³ããªãå Žåãæåã®ãã¯ãªãã¯ãã§ç§»åãããã«å®è¡ãããªãã·ã§ã³ïŒããã¹ãŠã®ç§»åã®
ãã¹ããããæ€çŽ¢ãå®è¡ãããŸãã å€ãã®åãã圢æãããŸãïŒ
ãã§ãã«ãŒããã§ã¹ãªã©ã®å°ããªã²ãŒã ã§ã¯ããšã©ãŒã¯çºçããŸããã§ããã
倩jiå°giã®åæã®äœçœ®ã§ãã
ã圌女ã¯ç®ç«ã¡ãŸããã§ããã ãããç¹å®ããã«ã¯ããçç£æ§ãäžãã殺人è
ããå¿
èŠã§ããã ãŸãããšã©ãŒã®å Žæãç¹å®ããããã«ã
KPIã¢ãžã¥ãŒã«ã¯éåžžã«åœ¹ç«ã¡ãŸãããããããªããšãã©ãã§åé¡ãæ¢ãã¹ããããããŸããã ããã§ãã°ãä¿®æ£ããããã®çµæããã¹ãŠã®ã³ãŒããæ¹åãããŸããã
ãã®ããã衚瀺ã®æ·±ãã¯å¶éãããŠãããéãããæéå
ã«æ£ããïŒãŸãã¯å°ãªããšãå£æ»
çã§ã¯ãªãïŒå€æãäžãå¿
èŠããããŸãã ãã®å Žåã次ã®ååãä¿èšŒãããããšãéåžžã«æãŸããã§ãã
- ãã¡ãããå³åº§ã®åå©ã«ã€ãªããåããéžæããå¿
èŠããããŸãã
- å³åº§ã®åå©ã«ã€ãªããçããããåããéžæããŠã¯ãããŸãã
- éžæãããåãã¯ãäœçœ®ã®æ倧ã®æ¹åãæäŸããå¿
èŠããããŸã
ããžã·ã§ã³ãè©äŸ¡ããã«ã¯ïŒæãç°¡åãªæ¹æ³ã¯ãç©è³ªåæ¯ãè©äŸ¡ããããšã§ãã æ°åã®åã¿ã€ãã«ã¯å€ãå²ãåœãŠãããæ°åã®å€ãå ç®ããŠãçžæã®æ°åã®å€ãæžç®ããŸãã æŠç®ã¯å€§ãŸããªãã®ã§ãããæ¬åœã«è€éãªã²ãŒã ã®å Žåã¯ãããããå¯äžã®ã²ãŒã ã§ãã æ¹åãããè©äŸ¡ã§ã¯ãæ°å€ã®æµåæ§ãšãããã®çžäºã®è
åšãèæ
®ããå¿
èŠããããŸãïŒããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãïŒã è€éãªã«ãŒã«ãæã€ã倧ããªãã²ãŒã ã®å Žåãçžäºã®è
åšãè©äŸ¡ããã®ã¯è²»çšãããããããå ŽåããããŸãã
æãåçŽãªè©äŸ¡é¢æ° Dagaz.AI.eval = function(design, params, board, player) { var r = 0; _.each(design.allPositions(), function(pos) { var piece = board.getPiece(pos); if (piece !== null) { var v = design.price[piece.type]; if (piece.player != player) { v = -v; } r += v; } }); return r; }
2çªç®ã®ããŒã«ã¯ãã¥ãŒãªã¹ãã£ãã¯ã§ãã ããã¯ãäœçœ®ã§ã¯ãªããåãªã
åãã®æ°å€è©äŸ¡ã§ããããæªããåããšãè¯ããåããåºå¥ããããšãã§ããŸãã ãã¡ããããŸã第äžã«ããè¯ããåããèæ
®ããããæªããåããèæ
®ããæéããªããããããŸããã æãåçŽãªãã¥ãŒãªã¹ãã£ãã¯ã«ã¯ãååŸããæ°å€ã®å€ãå«ããããšãã§ããŸãããããã«ã移åãå¯èœãªå€æãè
åšãªã©ãå®è¡ããæ°å€ã®å€ãæšå®ããããšããå§ãããŸãã
çºèŠçäŸ Dagaz.AI.heuristic = function(ai, design, board, move) { var r = 0; var player = board.player; var start = null; var stop = null; var captures = []; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] === null)) { var pos = a[0][0]; var piece = board.getPiece(pos); if ((piece !== null) && (piece.player != player)) { r += design.price[piece.type] * ai.params.CAPTURING_FACTOR; if (!_.isUndefined(board.bonus) && (board.bonus[pos] < 0)) { r -= board.bonus[pos]; } } captures.push(pos); } if ((a[0] !== null) && (a[1] !== null)) { if (start === null) { start = a[0][0]; if (!_.isUndefined(board.bonus)) { r += board.bonus[start]; } } stop = a[1][0]; } }); var price = 0; if (start !== null) { var piece = board.getPiece(start); if (piece !== null) { price = design.price[piece.type]; } } _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null)) { var pos = a[1][0]; var piece = board.getPiece(pos); if (_.indexOf(captures, pos) < 0) { if ((piece !== null) && (piece.player != player)) { r += design.price[piece.type] * ai.params.CAPTURING_FACTOR; if (!_.isUndefined(board.bonus)) { r += Math.abs(board.bonus[pos]); } } if (a[2] !== null) { var promoted = a[2][0]; r -= price * ai.params.SUICIDE_FACTOR; if (promoted.player == player) { r += design.price[promoted.type] * ai.params.PROMOTING_FACTOR; } } } else { r -= price * ai.params.SUICIDE_FACTOR; } } if ((a[0] === null) && (a[1] !== null) && (a[2] !== null) && (_.indexOf(captures, a[1][0]) < 0)) { var pos = a[1][0]; var piece = board.getPiece(pos); if (piece !== null) { if (piece.player != player) { r += design.price[piece.type] * ai.params.CAPTURING_FACTOR; } } piece = a[2][0]; if (piece.player == player) { r += design.price[piece.type] * ai.params.CREATING_FACTOR; } } }); if (!_.isUndefined(board.cover) && (start !== null) && (stop !== null)) { if (isAttacked(design, board, board.player, stop, start, price)) { r -= price * ai.params.SUICIDE_FACTOR; } } return r; }
ãã¥ãŒãªã¹ãã£ãã¯ã®æ倧å€ã¯ããã®ç¹å®ã®åããéžæãããããšãæå³ãããã®ã§ã¯ãªãããšãç解ããããšãéèŠã§ãã ãã¥ãŒãªã¹ãã£ãã¯ã¯ã衚瀺ã®ç§»åã®é åºã®ã¿ãèšå®ããŸãã ãã®é åºã®æ çµã¿å
ã§ãè©äŸ¡é¢æ°ã®å€ãæ倧åããåãïŒæ倧ã®ãã¥ãŒãªã¹ãã£ãã¯ã§çžæã®å ±åŸ©ç§»åãå®äºããåŸïŒãéžæãããŸãã è² ã®ãã¥ãŒãªã¹ãã£ãã¯å€ãèšå®ããããšã§ã移åã®äžéšã匷å¶çã«èæ
®ããé€å€ããããšãã§ããŸããããã®ããŒã«ã¯ãåé¡ã®ç§»åãåã«åœ¹ã«ç«ããªãã ãã§ãªãæ害ã§ãããšãã100ïŒ
ã®ç¢ºå®æ§ãããå Žåã«ã®ã¿æ³šæããŠäœ¿çšããå¿
èŠããããŸã
ã³ã¹ãæ°å€ ... design.addPiece("King", 32, 10000); design.addPiece("Prince", 33, 10000); design.addPiece("Blind-Tiger", 34, 3); design.addPiece("Drunk-Elephant", 35, 3); design.addPiece("Ferocious-Leopard", 36, 3); design.addPiece("Gold-General", 37, 3); design.addPiece("Silver-General", 39, 2); design.addPiece("Copper-General", 40, 2); design.addPiece("Chariot-Soldier", 41, 18); design.addPiece("Dog", 43, 1); design.addPiece("Bishop-General", 44, 21); design.addPiece("Rook-General", 46, 23); design.addPiece("Vice-General", 48, 39); design.addPiece("Great-General", 49, 45); ...
äžèšã®3ã€ã®ååã«ã€ããŠè©±ããããšãèŠããŠããŸããïŒ ãã€ã€ã«ãã£ã®ã¥ã¢ïŒã²ãŒã ã«ã¯ãã®ãããªãã£ã®ã¥ã¢ã®ããã€ãã®ã¿ã€ããååšããå¯èœæ§ããããŸãïŒã¯ãéåžžã«é«ãã³ã¹ãããããã®ã«æå³ããããŸãã ããã«ããã1ç³ã§2矜ã®é³¥ã殺ããŸãïŒæåã«ããã€ã€ã«ããŒã¹ããšãåãã¯ãå¯èœãªéãæé«ã®ãã¥ãŒãªã¹ãã£ãã¯ãåãåããŸãïŒãããŠãåžžã«æåã«èæ
®ãããŸãïŒãããã«ãããŒãã«ãã€ã€ã«ããŒã¹ããªãããšã¯ãè©äŸ¡é¢æ°ã®å€ã«èãã圱é¿ãããããéåžžã«äŸ¿å©ã§ãã æ®å¿µãªããšã«ã
ãã§ã¹ã«é©çšãããããã«
ããã®ããªãã¯ã¯é¢ä¿ããããŸããããªããªãã
çã¯æ±ºããŠãããã«åã蟌ãŸããªãããã§ãã
äœçœ®ã¯åžžã«çžæã®å ±åŸ©ç§»åã®çµäºæã«ã®ã¿è©äŸ¡ãããããšã«æ³šæããŠãã ããïŒ äžé£ã®äº€æãããå Žåã¯ãæåŸãŸã§è¡šç€ºããå¿
èŠããããŸãããã以å€ã®å Žåã¯ãæ»æããŒã¹ã䟡å€ã®äœããã®ãšããŠæäŸãããå¯èœæ§ããããŸãã
3人以äžã®ãã¬ã€ã€ãŒã®ã²ãŒã ã¯ãã«ãžã¥ã¢ã«ãªãäžæ¹åãã®AIã®å¥ã®ã¢ããªã±ãŒã·ã§ã³ã§ãã ããã¯ãã¹ãŠè©äŸ¡é¢æ°ã«ã€ããŠã§ãã Minimaxã¢ã«ãŽãªãºã ã¯ãäžæ¹ã®ãã¬ãŒã€ãŒã®èŠç¹ããã®ã¹ã³ã¢ããå察ã®ç¬Šå·ã§æ®åœ±ãããä»æ¹ã®ãã¬ãŒã€ãŒã®ã¹ã³ã¢ãšäžèŽããå Žåã«ã®ã¿æ©èœããŸãã äžæ¹ã倱ã£ããã®ãä»æ¹ãç²åŸããŸãã 3人ïŒ
ãŸãã¯ããä»¥äž ïŒã®ãã¬ã€ã€ãŒãããå Žåããã¹ãŠãå£ããŸãã ãã¡ããã
ã¢ã³ãã«ã«ãæ³ã«åºã¥ããã¢ã«ãŽãªãºã ãé©çšããããšãã§ããŸãããä»ã®å°é£ããããã«é¢é£ä»ããããŠããŸãã
Yonin Shogi -4人ã®ãã¬ã€ã€ãŒã®ããã®ã
æ¥æ¬ã®ãã§ã¹ ãã®å€åœ¢ã ãã®ã²ãŒã ã®ã«ãŒã«ã®ã»ãšãã©ã¯å€æŽãããŠããŸããããã²ãŒã ã®ç®çã¯å€ãããŸãã ãããããã®æŠå¿µã¯ãããçšåºŠãŸã§ãã®æå³ã倱ããŸãã å®éããæ±ãããåãã®çãè
ãããªããããã¯ã西ããšãåãã圌ãã®èšèãèšããŸã§ãã·ã£ãŒãã«å¯ŸããŠé²åŸ¡ããçç±ã§ã¯ãªãã äžæ¹ãè
åšããŸã é€å»ãããŠããªãå Žåã次ã®åãããæ±ãã¯çãé£ã¹ãã§ãããã ãããã£ãŠãäžäººå°giã¯çã奪ãããšãã§ããŸãïŒãããã²ãŒã ã®ç®çã§ãïŒã
ããã«ãã²ãŒã ã¯ãã³ã°ã®ãã£ããã£ã§çµäºããŸããïŒåæ§ã®çµæã¯ãæ®ãã®3人ã®ãã¬ã€ã€ãŒã«ãšã£ãŠã¯æ··éããããŸãïŒã ãã³ã°ã倱ã£ããã¬ã€ã€ãŒã¯ã²ãŒã ããé€å€ããã移åããæš©å©ã倱ããŸãã çã¯æãŸãããšãã§ããã®ã§ãä»ã®ãã¹ãŠã®é§ãšåæ§ã«ãäºåã«èœã¡ããã€ã§ãããŒãã«çœ®ãããšãã§ããŸãã ããŒãã«ãã³ã°ãæ®ã£ãŠããªãå Žåããã¬ã€ã€ãŒã¯ãã³ã°ããªã¶ãŒãããå€ã
ãªããã°ãªããŸãã ã ãã®ãã¹ãŠã®åŸãã²ãŒã ã®ç®æšã¯æçœã«ãªããŸã-4人ã®çããã¹ãŠéãã人ãåã¡ãŸãïŒ
Zillions of Gamesã§ã²ãŒã ãäœã£ããšãã
ãã¯ãŒãããã±ã€ã¯ãã®ãã¥ã¢ã³ã¹ãå®çŸããã®ãå©ããŠãããŸããïŒã
äžèšã®ãã¹ãŠãåçŽãªæèã«ã€ãªãããŸããè€éã§è©³çŽ°ãªæ€çŽ¢ã¢ã«ãŽãªãºã ãé©çšã§ããªãã²ãŒã ããããè©äŸ¡é¢æ°ã®æŠå¿µãã®ãã®ãåèããå¿
èŠããããŸãã AIã¢ã«ãŽãªãºã ã®äœæ¥ã®å質ã蚱容ç¯å²ã«ä¿ã€ã«ã¯ããããããã®è€éãã®ããã«ãæšå®å€ãšãã¥ãŒãªã¹ãã£ãã¯ãæ¹åããå¿
èŠããããŸãã æãããªæ¹æ³ã¯ãæ©åæ§ãå°å
¥ããããšã§ã-ãã¬ã€ã€ãŒãè¡ã£ããã¹ãŠã®å¯èœãªåãã®æ°ãããçžæã®åããåŒãããã®ã§ãã
eval = A * material-balance + B * mobility; A >= 0, B >= 0, A + B = 1
ãäžæ¹åãã®ã¢ã«ãŽãªãºã ã䜿çšããå Žåãã¢ããªãã£è©äŸ¡ã¯é©ãã»ã©å¹æçã§ãã ãããã®æããªã²ãŒã ã¯ãããæå³ã®ããããã®ã«ãªããŸãã å®éã«ã¯ãã€ãã¹ã1ã€ãããŸããæ©åæ§ãè©äŸ¡ããããã«ã¯ãåãã¬ãŒã€ãŒã®ãã¹ãŠã®å¯èœãªåããæ§ç¯ïŒãŸãã¯å°ãªããšãåéèšïŒããå¿
èŠããããããã¯éåžžã«é«äŸ¡ãªæäœã§ãã ãšã«ãããããè¡ãããšãäœåãªããããŠããã®ã§ãã ãŒãã®çæããå¯èœãªéããã¹ãŠããçµã蟌ã¿ããããã«ãã®ãããªæäœã®æ°ãæå°éã«æããããšæããŸãã
ã«ãã¬ããž Dagaz.AI.eval = function(design, params, board, player) { var r = 0; var cover = board.getCover(design); _.each(design.allPositions(), function(pos) { var defended = _.filter(cover[pos], function(p) { var piece = board.getPiece(p); if (piece === null) return false; return piece.player == player; }); if (defended.length > 0) r++; }); return r; }
ããã§ããã«ããŒãã®ã¢ã€ãã¢ãæãã€ããŸããã ããã¯åãªãé
åã®é
åã§ãã åãã£ãŒã«ãïŒããã³Dagazã®ãã¹ãŠã®ãã£ãŒã«ãã¯åžžã«æŽæ°ãšããŠãšã³ã³ãŒããããŸãïŒã«ã€ããŠã¯ããã®ãã£ãŒã«ãã«åãŠãæ°åãå«ãäœçœ®ã®ç©ºã®ãªã¹ããä¿æãããå¯èœæ§ããããŸãã åæã«ïŒãããŠããã¯éèŠã§ãïŒç©ºã®ãã£ãŒã«ããšå æããããã£ãŒã«ããããã³ãããŒãããã£ã®ã¥ã¢ã®ææè
ãåºå¥ããŸããã å¯èœãªåãã®ãªã¹ãã¯ããã¹ãŠã®ãã¬ã€ã€ãŒã«å¯ŸããŠ
åæã«èšç®ã
ãããã£ãã·ã¥ã®ããã«äžåºŠãèšç®ãããŸãã
ãã¡ããããã«ããŒããæ§ç¯ããããã®æ®éçãªã¢ã«ãŽãªãºã ã¯ããã¹ãŠã®ã²ãŒã ã«é©ãããã®ã§ã¯ãããŸããã
Chessãš
Checkersã§ã¯æ©èœããŸããã
Spockã§ã¯æ©èœããªããªããŸããïŒãã®ã²ãŒã ã§ã¯ãããŒã¹ã¯èªç±ã«ä»ã®è²ã®ããŒã¹ãééã§ããããïŒã ããã¯æ··ä¹±ããã¹ãã§ã¯ãããŸããã è©äŸ¡é¢æ°ãšãã¥ãŒãªã¹ãã£ãã¯ã«å ããŠããã«ããŒããæ§ç¯ããããã®ã¢ã«ãŽãªãºã ã¯ã
Dagaz.Model.GetCoverãšããååã䜿çšããŠåå®çŸ©ã§ããŸãã ããã«ããŠãããŒãµã«ã¢ã«ãŽãªãºã ãæ©èœããå Žåã§ããã«ã¹ã¿ãã€ãºãæ€èšããããšã¯æçšã§ãã ååãšããŠãç¹æ®ãªã¢ã«ãŽãªãºã ã¯ããçç£çã§ãã
å®éã®ã²ãŒã ã§ãã«ãã¬ããžã
ã䜿çš
ããäŸã次ã«ç€ºããŸãã ããã¯äŸç¶ãšããŠæãåçŽãªãã¯ã³ã¹ããããã¢ã«ãŽãªãºã ã§ãããéåžžã«ç°¡åã«æ¬ºãããšãã§ããŸããããããã®ã¢ã¯ã·ã§ã³ã¯ææ矩ã«æããŸãïŒ ã«ãã¬ããžãåæããããšã«ãããAIã¯ããŒã¹ãä¿è·ããããŸãŸã«ãããããŒãäžã§ãããããæ倧åãããŠãæŠéäžã®ãã£ãŒã«ãã®æ°ãæ倧åããããšããŸãã ããã¯åªããæŠè¡ã§ããã1ã€ã®ã
ããã©ãžã£ ããšå¯ŸæŠãããšãã確å®ã«åå©ã«ã€ãªãããŸãã ãã®ã¢ã«ãŽãªãºã ã¯ãã
Light Brigadeã®çªæ ããã
Dunsany's Chess ããã
Horde Chess ããã
WeakïŒ ããããã³ãã®ä»ã®ãå°ããªããã§ã¹ã²ãŒã ã§ãããŸãæ©èœããŸãã ãã«ãã¬ããžãã䜿çšãããšãããè€éãªã¢ã«ãŽãªãºã ã®æ¹åã«åœ¹ç«ã€ããšã¯æããã§ããããããã«é²ãåã«ç·Žç¿ããå¿
èŠããããŸãã
5æ
39åãã
ããã¹ãŠã®åããæ¥æ¿ã«å éãããããšã«æ³šæããŠãã ããã ããã«ã€ããŠç°¡åã«èª¬æããŸãã ãµã€ã³ãã®åãã®ã¢ãã¡ãŒã·ã§ã³ãšäžŠè¡ããŠïŒäººãéå±ããªãããã«ïŒããããã¯ç®æšäœçœ®ãæ€çŽ¢ãããããèŠã€ããåŸãè¿œå ã®èšç®ã«æéã浪費ããããšãªããçŽç·ã§ãã®äœçœ®ã«ç§»åããŸãã
ã¡ãªã¿ã«FireFox 52.6.0ã§ã¯ãã®å¹æã芳å¯ã§ããŸããã§ããã Chromeã§ãIEã§ããã¢ã«ãŽãªãºã ã¯çŽ5åã§è§£æ±ºçãèŠã€ããŸãããFireFoxã§ã¯ã圌ã¯ç§ããããããã¯ã¢ãŠããããŸã§ïŒã¡ã¢ãªãããèªäœã«é£ã蟌ãã§ããéïŒçŽ15åéãã€ã¹ããã£ãããšåããç¶ããŸããã ãã®çŸè±¡ã®èª¬æã¯ãŸã èŠã€ãã£ãŠããŸããã
ç§ã«ãšã£ãŠãããã¯
以åã®ããŒãžã§ã³ãšæ¯èŒããŠéèŠãªäžæ©ã§ãã
ã¢ã«ãŽãªãºã ã¯åçŽãª
å¹
åªå
æ¢çŽ¢ã§ã ïŒ
æ·±ãã§ã¯ãããŸããïŒããã¯éèŠã§ããæçã®è§£æ±ºçã«é¢å¿ãããã®ã§ããããïŒïŒã ç¹°ãè¿ãããäœçœ®ã¯
Zobrist hashã®å©ããåããŠåãåãããŸã
ãZobristhashã¯ãè¡çªã®çµæãšããŠè§£æ±ºçãèŠã€ãããªããšããç¶æ³ãïŒéåžžã«ãŸãã§ããïŒå¯èœã«ããŸãã ããã«ãçŸåšã®ã¢ãã¡ãŒã·ã§ã³ããŒãã®åå«ã§ããããŒãã«æ€çŽ¢ã®åªå
é äœãäžããããŸãïŒãœãªã¥ãŒã·ã§ã³ãèŠã€ããåŸã«å¿
èŠãªãªã¿ãŒã³ã®æ°ãæå°éã«æããããïŒã
éäžã§ããäžã€ãã£ãå®éãZillions of Gamesã«ã¯ãç§ã決ããŠç解ããŠããªãç®çã®ãªãã·ã§ã³ããããŸãã ãããã°ã¬ãã·ãã¬ãã«ããšåŒã°ããŸãã ã²ãŒã ã®1ã€ã®ã¬ãã«ãå®äºãããšããã«ã次ã®ã¬ãã«ãããã«ããŒããããŸãã ä»ãç§ã¯ããã€ã³ããåŸããšæããŸãã ãããã®é»çããªãã«ããŠã¿ãŠãã ããïŒ
åæããŠãããã¯äžæ¯æ§ããããŸãã ãããŠãããªãã¯èª°ããããªãã®ããã«ããºã«ã
ç¡éã«è§£æ±ºããæ¹æ³ã
èŠãããšãã§ããŸãã ããããããã¯æŠãã®ååã«éããŸããïŒ ã»ãšãã©ãã¹ãŠã®Dagazãªãã·ã§ã³ãšåæ§ã«
ã ãããã°ã¬ãã·ãã¬ãã«ãã¯ã«ã¹ã¿ãã€ãºã§ããŸãã
ãã®ããºã«ã¯ã
ãžã§ãŒãžã¯ã·ã³ãã³ã®å€§çµ±é éžã«æ§ãããããã®ã§ãããåœåã¯ãŸã£ããæ£ããå®è£
ãããŠããŸããã§ããã
æ£ãã決å®ã®ããã«ã¯ãåé
ãã¹ãŠã«é çªã«èµ€ãæ£æ¹åœ¢ãæãå¿
èŠããããŸããããã¬ãºã§ã¯1ã€ã®ç®æšããèšå®ã§ããŸããã ããã§ã
ã«ã¹ã¿ã ã® ãããã°ã¬ãã·ãã¬ãã«ããæ©èœããŸãã
次ã®ç®æšã«å°éãããšããã«ã次ã®ã¬ãã«ãèªã¿èŸŒãŸããŸãããæ°åã®é
眮ã¯åæã«åã®ã¬ãã«ããåãããŸãïŒ äžæãããšããããç¶ããŸãã
ã¬ãã«éã§äœçœ®ã転éããããã«äœ¿çšãããã¢ãžã¥ãŒã«ã¯ãããèªäœã§äŸ¡å€ããããŸãããã©ãŠã¶ã®ãã°ã€ã³æéãæå¹ã«ãããšãã»ãšãã©ãã¹ãŠã®ã²ãŒã ã§ã以åã«æž¡ãããäœçœ®ã«æ»ãããšãã§ããŸãããã°ã®ãSetupïŒããšããè¡šèšã®åŸã«ç¶ãè¡ãURLã«ã³ããŒããã ãã§ååã§ãããããã°ã«å€§ãã«åœ¹ç«ã¡ãŸãïŒã«ã¹ã¿ã ãããã°ã¬ãã·ãã¬ãã«ãã¯ãç¥æ§ãªã©ã®è€éãªã©ã€ããµã€ã¯ã«ã²ãŒã ã«é©çšã§ããŸããæåŸã®è¡ã®æ°åã®1ã€ã«éããŠãããã®ã²ãŒã ã¯çµäºããŸããïŒã«ãŒã«ã«ãã , «» , , . , Dagaz ! ,
. , ,
.
ããã¯ããšããšäžåœã®åäŸåãã®ã²ãŒã ã§ããé»ãç³ã¯äžã«ç§»åã§ãããçœãç³ã¯ã©ã®æ¹åã«ã移åã§ããŸããããã«èªãåã«ããããŒã³ãã®äžéšã«ããçœãç³ããã¯ã©ã³ããããŠã¿ãŠãã ãããããŸããããªãå Žåã¯å€§äžå€«ã§ãïŒãã³ããäžãã
ãã©ã³ã¹ã®æŠäºã²ãŒã ããã¯ãŒãã®ã²ãŒã ã«å€å°äŒŒãŠããŸãããç§ã®æèŠã§ã¯ãããŒã³ãã§ã¹ã¯ãããã®ã²ãŒã ãããã¯ããã«æ·±ãè€éã§ããããªããç§ãä¿¡ããŠããªãå Žåã¯ããããåŠçããŠã¿ãŠãã ããããã¹ãŠã®å€èŠãæ°åããªããããã²ãŒã ã¯ãŸã£ããåçŽã§ã¯ãããŸãããç§ã¯åœŒå¥³ã«æ§ããããããã€ãã®ç§åŠèšäºïŒäžåœèªïŒãèŠãŸããããããŠãããã¯ããè€éãªAIã®ãããã°ã«é©ããè³æã§ããäž»ãªããšã¯ãæšèãå°ç¡ãã«ããªãããšã§ãïŒ Dagaz.AI.eval = function(design, params, board, player) { var r = 0; var white = null; var black = []; for (var pos = 0; pos < design.positions.length - 3; pos++) { var piece = board.getPiece(pos); if (piece !== null) { if (piece.player == 1) { if (white === null) { black.push(pos); } else { r += MAXVAL / 2; } } else { white = pos; } } } if (white !== null) { r += white; } if (black.length == 2) { if ((black[0] + 1 == black[1]) && (black[1] + 1 == white)) { if (board.player == 1) { r = MAXVAL; } else { r = -MAXVAL; } if (player == 1) { r = -r; } } } return r; } Dagaz.AI.heuristic = function(ai, design, board, move) { var b = board.apply(move); return design.positions.length + Dagaz.AI.eval(design, ai.params, b, board.player) - Dagaz.AI.eval(design, ai.params, board, board.player); } ... AbAi.prototype.ab = function(ctx, node, a, b, deep) { node.loss = 0; this.expand(ctx, node); if (node.goal !== null) { return -node.goal * MAXVALUE; } if (deep <= 0) { return -this.eval(ctx, node); } node.ix = 0; node.m = a; while ((node.ix < node.cache.length) && (node.m <= b) && (Date.now() - ctx.timestamp < this.params.AI_FRAME)) { var n = node.cache[node.ix]; if (_.isUndefined(n.win)) { var t = -this.ab(ctx, n, -b, -node.m, deep - 1); if ((t !== null) && (t > node.m)) { node.m = t; node.best = node.ix; } } else { node.loss++; } node.ix++; } return node.m; }
ãããéèŠãªãã€ã³ãã®1ã€ã§ããå³ã®é»ãç³ãäžã«ç§»åããŸãã匱ããã¯ã³ã¹ããããã¢ã«ãŽãªãºã ã¯åæ¢ãããã®åŸãã©ãã¯ã¯ç°¡åã«ãããã³ãŒããŒã«è¿œã蟌ã¿ãŸããããããã¯ã¹ã®å®è£
-æ£ãââãåããããåŸããã©ãã¯ããã¹ãç¯ããå Žåã«åã€ããšãã§ããŸããããã¯ãçœäººãæãŸããããšãäžå¯èœã§ããããšãæå³ãããã®ã§ã¯ãããŸããããããã€ãã®åããå
èªã¿ãããšã圌ãã®ã²ãŒã ã倧å¹
ã«æ¹åãããŸãïŒäžèšã§ã¯ã倩jiå°giã®äŸã䜿çšããŠãããŸããŸãªããŒãã²ãŒã ãäºãã«éåžžã«ç°ãªãå¯èœæ§ãããããšããã§ã«ç€ºããŸããããŸããããã¯å€åæ§ã«é©çšãããŸã-ã²ãŒã ã®ç¹å®ã®æ®µéã§èš±å®¹ãããåãã®å¹³åæ°ããã®ãã©ã¡ãŒã¿ãŒã¯ãããããéçºãããšãã®AIã¢ã«ãŽãªãºã ã®é©çšå¯èœæ§ã決å®ããŸããããŒã³ãã§ã¹ã§äœ¿çšããããããã¯ã¹ã¢ã«ãŽãªãºã ã¯æããã«Ko ShogiãGwangsanghuiã®ãããªæ¬åœã«å€§ããªã²ãŒã ã§ã¯ããŸãåäœããŸãããäžæ¹ããããã§äœ¿çšããããæ»æçãªãã¢ã«ãŽãªãºã ã¯ããã§ã¹ãªã©ã®ã²ãŒã ã§ããŸãã«ã匱ãåçãããŸããããããããã¯åé¡ã®äžéšã«ãããŸãããäž»ãªéãã¯ã¡ã«ããºã ã«ãããŸãã幞ããªããšã«ãããã¯è©äŸ¡é¢æ°ãšãã¥ãŒãªã¹ãã£ãã¯ã«ãã£ãŠã«ã¹ã¿ãã€ãºã§ãããã®ã§ããæªããã¥ãŒã¹ã¯ãããããã©ã®ããã«æ§ç¯ãããã¹ãããèããããšã¯ãåã«ããã§ã¯ãªããšããããšã§ãããã«ã¹ããã£ã¢ã³ããã£ããã£ïŒããããèªãæãã³ã°ããªã©ïŒã䜿çšããã²ãŒã ã¯ãç§ã®ãã€ã³ããå®å
šã«ç€ºããŠããŸããããã§ã¯ãç©è³ªåæ¯ã®åçŽãªè©äŸ¡ã ãã§ã¯ååã§ã¯ãããŸããïŒ var eval = Dagaz.AI.eval; Dagaz.AI.eval = function(design, params, board, player) { var r = eval(design, params, board, board.player); var cover = board.getCover(design); var cnt = null; _.each(cover, function(list) { var cn = 0; _.each(list, function(pos) { var piece = board.getPiece(pos); if (piece !== null) { if (piece.player == board.player) { r--; } else { cn++; } } }); if ((cnt === null) || (cnt < cn)) { cnt = cn; } }); r += cnt * 3; if (board.player != player) { return -r; } else { return r; } } var done = function(design, board, player, pos, dir, trace, captured) { var p = design.navigate(player, pos, dir); if (p !== null) { var piece = board.getPiece(p); if (piece !== null) { if (piece.player == player) { _.each(trace, function(pos) { if (_.indexOf(captured, pos) < 0) { captured.push(pos); } }); } else { trace.push(p); done(design, board, player, p, dir, trace, captured); trace.pop(); } } } } var capture = function(design, board, player, pos, dir, dirs, trace, captured) { var p = design.navigate(player, pos, dir); if (p !== null) { var piece = board.getPiece(p); if (piece !== null) { if (piece.player == player) { _.each(trace, function(pos) { if (_.indexOf(captured, pos) < 0) { captured.push(pos); } }); } else { trace.push(p); capture(design, board, player, p, dir, dirs, trace, captured); if (trace.length > 1) { _.each(dirs, function(dir) { var pos = design.navigate(player, p, dir); if (pos !== null) { var piece = board.getPiece(pos); if ((piece !== null) && (piece.player != player)) { trace.push(pos); done(design, board, player, pos, dir, trace, captured); trace.pop(); } } }); } trace.pop(); } } } } var checkCapturing = function(design, board, pos, player, captured) { var trace = []; capture(design, board, player, pos, 3, [0, 1], trace, captured); capture(design, board, player, pos, 1, [3, 2], trace, captured); capture(design, board, player, pos, 2, [0, 1], trace, captured); capture(design, board, player, pos, 0, [3, 2], trace, captured); } Dagaz.Model.GetCover = function(design, board) { if (_.isUndefined(board.cover)) { board.cover = []; _.each(design.allPositions(), function(pos) { board.cover[pos] = []; if (board.getPiece(pos) === null) { var neighbors = []; var attackers = []; _.each(design.allDirections(), function(dir) { var p = design.navigate(1, pos, dir); if (p !== null) { var piece = board.getPiece(p); if (piece !== null) { neighbors.push(piece.player); attackers.push(piece.player); } else { while (p !== null) { piece = board.getPiece(p); if (piece !== null) { attackers.push(piece.player); break; } p = design.navigate(1, p, dir); } } } }); if (neighbors.length > 1) { var captured = []; if ((_.indexOf(attackers, 1) >= 0) && (_.indexOf(neighbors, 2) >= 0)) { checkCapturing(design, board, pos, 1, captured); } if ((_.indexOf(attackers, 2) >= 0) && (_.indexOf(neighbors, 1) >= 0)) { checkCapturing(design, board, pos, 2, captured); } if (captured.length > 0) { board.cover[pos] = _.uniq(captured); } } } }); } return board.cover; }
è©äŸ¡é¢æ°ã§ã¯ããã«ãã¬ããžãã䜿çšããã ãã§ãªãããããèšç®ããã¢ã«ãŽãªãºã ãçå£ã«äœãçŽãå¿
èŠããããŸããããã¥ãŒãªã¹ãã£ãã¯ã«é¢ããŠã¯ããã®ã²ãŒã ã§ã¯å®å
šã«åæ©çã§ãïŒ Dagaz.AI.heuristic = function(ai, design, board, move) { return move.actions.length; }
移åããéšåãå€ãã»ã©ïŒãµã€ãºã¯ããã«äŸåããŸãïŒ-ããè¯ãã§ãïŒè©äŸ¡æ©èœã«äžçæžåœåãçµãå¿
èŠããããŸããããçµæã¯ééããªã䟡å€ããããŸããããã®ãããªã¯ãæãåçŽãªãäžæ¹åãã¢ã«ãŽãªãºã ã®åäœã瀺ããŠããããšã«æ³šæããŠãã ããïŒãå®å
šãªãåãããªãå Žåãå¿
ãããéåžžã«å¹ççã«åçããããšã¯éããŸããïŒãäžã§è¿°ã¹ãããã«ãã¢ããªãã£ãšãã«ãã¬ããžããè©äŸ¡ããéã®äŒèšåŠçã¯é©ãã¹ãããšã§ãïŒãããŠæåŸã«ãã«ã¹ããã£ã¢ã³ããã£ããã£ããå¥ã®éåžžã«çããã²ãŒã ã®ãããªïŒãããŠãç§ã¯ããããã®äŒæ¥ãç¥çŠããããã«æ¥ãã§ããŸãïŒ