äžç®äžŠã¹...誰ããããããæŒå¥ããããšç¢ºä¿¡ããŠããŸãã ãã®ã²ãŒã ã¯ã·ã³ãã«ã§é
åçã§ããç¹ã«ãã¬ãã¹ã³ã®ã©ããã§ã«ããã«ããã©ãã°ãããšãããŒãããã¯ã·ãŒããšã·ã³ãã«ãªéç以å€ã¯æå
ã«ãããŸããã ãã€ãŠ9ãã¹ã«ååãåãæãããšãæåã«æšæž¬ããã®ã¯èª°ãªã®ãããããŸãããããã以æ¥ãç¹ã«äººã
ããã®ããªââãšãŒã·ã§ã³ã®å€ããèãåºããŠä»¥æ¥ãã²ãŒã ã¯éèŠã倱ããŸããã§ããã

ãã®èšäºã§ã¯ãããã¯ã¿ãã¯ããŒã®ãããã®ããªãšãŒã·ã§ã³ã®1ã€ãåçããããã«JavaScriptã§AIãéçºããããã»ã¹ã«ã€ããŠèª¬æããŸããããªãå€ãã®è³æãå
¥æããŸããããã¢ãã¡ãŒã·ã§ã³ãšåçã§åžéããŸããã ãããã«ããŠããå°ãªããšã詊ããŠã¿ã䟡å€ã¯ãããŸãã
ãã®ããŒãžã§ã³ã®ã²ãŒã ãšãªãªãžãã«ã®éãã¯æ¬¡ã®ãšããã§ãã
- ãã£ãŒã«ãã¯ä»»æã«å€§ããããããšãã§ããŸãïŒããŒãããã¯ã®é·ãïŒ
- åè
ã¯ã 5ããŒã¹ ïŒããªããããããåŒã³åºãããšãã§ããå ŽåïŒãé£ç¶ããŠçœ®ããã®ã§ãã
ãã¹ãŠãã·ã³ãã«ã§ãããšåæã«è€éã§ããå€å
žçãªã¢ããã°ã®ããã«ãã²ãŒã ã®çµæãäºåã«èšç®ããããšã¯ã§ããŸããã ãã®ãå°ããªæåœ±ãã¯å€ãã®æéãšç¥çµã奪ããŸããã ããããããšæããŸãã
å§ããåã«
èšäºã®ããªã¥ãŒã ã«ã€ããŠã¯äºåã«è¬çœªããããåŸããäžéšã®å Žæã§ã¯ãŸã£ãããããã«ããæèŠãè¿°ã¹ãŸããããã³ã³ãã³ããšå質ãæãªãããšãªã矀ããçµãããšã¯ã§ããŸããã§ããã
æåã«
çµæã«æ
£ããããšããå§ãããŸãã
ã³ãŒãããŒããŒãã·ã§ãŒãã«ãããšã³ãã³ãïŒ
- D -AIã¯ããªãã®ããã«åããŸã
- T-ã»ã«ééãåç
§
- ã³ã³ãœãŒã«ã§ã SHOW_WEIGHTS = trueãšèšè¿°ã㊠ãåæããããã¹ãŠã®ã»ã«ã®éã¿ã衚瀺ããŸãã
å§ããŸããã
ã²ãŒã èªäœã®å®è£
ããå§ããå¿
èŠããããŸããã€ãŸãã ãããŸã§ã®ãšãããããããªãã§2人ã®ãã¬ãŒã€ãŒçšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã ç§ã®ç®çã§ã¯ãjavascript + jquery + bootstrap4ã䜿çšããããšã«ããŸããããå®éã«ã¯äœ¿çšãããŠããŸãããããã®ãŸãŸã«ããŠããæ¹ãè¯ãã§ããããããããªããšãããŒãã«ãæµ®ããŠããŸããŸãã äŒããã¹ãç¹å¥ãªãã®ã¯ãããŸãããjsãjqueryãããã³bootstrapã«ã¯å€ãã®è³æããããŸãã MVCã䜿çšãããšããèšããŸããã ãšã«ãããç§ã¯çµ¶å¯Ÿã«ãã¹ãŠã®ã³ãŒãã説æããŸãã-ãããªãã§å€ãã®ææããããŸããã
ããã§ãç«¶æå Žã®æºåãã§ããŸããã ã»ã«ã«åœ¢ç¶ãèšå®ã§ããŸãã ããããã©ã®ãã¬ã€ã€ãŒã®åå©ã決ããŠæ±ºãŸã£ãŠããŸããã§ããã
ã²ãŒã ã¹ãã£ã³ã®çµäº
ãã¬ã€ã€ãŒã®1人ã
5åãé£ç¶ããŠçœ®ããšãã²ãŒã ã¯çµäºããŸãã ãç°¡åã§ãïŒããšæããŸããã ãããŠã圌ã¯ãã£ãŒã«ãã®ãã¹ãŠã®ã»ã«ãå®å
šã«ã¹ãã£ã³ãå§ããŸãããæåã¯ãã¹ãŠæ°Žå¹³ã次ã«åçŽããããŠæåŸã«å¯Ÿè§ç·ã§ãã
ããã¯éŠ¬é¹¿ããæ¹æ³ã§ãããããŸããããŸããã ããããããã¯å€§å¹
ã«æ¹åãããå¯èœæ§ããããç§ã¯ãããè¡ããŸãããã»ãšãã©ã®ã»ã«ã¯ã²ãŒã äžã¯ç©ºã®ãŸãŸã§ã-ç«¶æå Žã倧ããããŠå®å
šã«åããããšãã§ããŸããã ãã¹ãŠã®åããã¹ãã£ã³ããå¿
èŠãããã1ã€ã®åãã«1ã€ã®ããŒã¹ã®ã¿ãé
眮ãããŠããããããã®ããŒã¹ïŒã»ã«ïŒã®ã¿ã«çŠç¹ãåãããããšãã§ããŸãïŒåãã»ã«ãææããã»ã«ã®æ°Žå¹³ãåçŽããã³2ã€ã®å¯Ÿè§ç·ã®ã¿ãã¹ãã£ã³ããŸã
ããã«ããã¹ãŠã®çŽ°èæ ªãã¹ãã£ã³ããå¿
èŠã¯ãããŸããã ã²ãŒã ã®çµäºã¯é£ç¶ããŠ5åã§ãããããäºãã«6ã»ã«é¢ããŠããããŒã¹ã¯èå³ããããŸããã äž¡åŽã®5ã€ã®ã»ã«ãã¹ãã£ã³ããã°ååã§ãã åãããŸãããïŒ ä»¥äžã®ã¢ãã¡ãŒã·ã§ã³ãã芧ãã ããã

ã³ãŒãã衚瀺checkWin( cellX, cellY ){ var res = null; var newFig = getFig(cellX,cellY); if( ! newFig ) return false; var res; res = res || checkLine( cellX, cellY, 1, 0 );
ãããèªäœã«åãããããŸããã
ãã®ããããã§ã«tic-tac-toeã䜿çšããŠããŒãžãäœæããŸããã ã¡ã€ã³ã¿ã¹ã¯-AIã«æž¡ããŸãã
æ¹æ³ãããããªãå Žåã¯ãã³ãŒããååŸããŠäœæããããšã¯ã§ããŸããããããã®ããžãã¯ãèããå¿
èŠããããŸãã
äžçªäžã®è¡ã¯ãç«¶æå Žãå°ãªããšããã®äžéšãåæãããã£ãŒã«ãäž
ã®åã»ã«ã®
äŸ¡æ ŒïŒééïŒãèšç®ããããšã§ãã æãéã¿ã®ããã»ã«-æãææãª-ãããã¯ããã«æ°åã眮ããŸãã äž»ãªåé¡ã¯ã1ã€ã®ã»ã«ã®éã¿ãèšç®ããããšã§ãã
çšèª
ååãšã€ãŸå
ã¯æ°åã§ãã
æ»æã¯ãåãç·äžã«äžŠãã§ç«ã£ãŠããè€æ°ã®åäžäººç©ãšåŒã°ããŸãã å®éãããã¯ãããããããŸãã æ»æã®ããŒã¹ã®æ°ã¯ãã®
åã§ãã 1ã€ã®ç¬ç«ããéšåãæ»æã§ãïŒãã¯ãŒ1ïŒã
飿¥ããæ»æã»ã«ïŒç«¯ïŒã«ã¯ã空ã®ã»ã«ãŸãã¯æµã®é§ãååšããå ŽåããããŸãã ã端ãã«2ã€ã®ç©ºã®ã»ã«ãããæ»æã¯2ã€ã®æ¹åã«å±éã§ãããšèããã®ãè«ççã§ãããããææã§ãã æ»æã®ã端ãã«ãã空ã®ã»ã«ã®æ°ã¯ããã®
ããã³ã·ã£ã«ãšåŒã°ããŸãã é»äœã¯0ã1ã2ã®ããããã§ãã
æ»æãæ¬¡ã®ããã«è¡šããŸãïŒ
[æ»æåãæœåšå] ã ããšãã°ã
æ»æ[4ïŒ1] ã
å³1.æ»æ[4ïŒ1]åæã®éçšã§ãç¹å®ã®é åã«å
¥ããã¹ãŠã®ã»ã«ãè©äŸ¡ããŸãã åã»ã«ã¯ãã®
éã¿ãèšç®ã
ãŸã ã ãã®ã»ã«ã圱é¿ãããã¹ãŠã®æ»æã®éã¿ã«åºã¥ããŠèšç®ãããŸãã
åæã®æ¬è³ª
ç«¶æå Žã§ã¯ããã§ã«1人ç®ãš2人ç®ã®ãã¬ãŒã€ãŒãäœåºŠãæ»æãããŠãããšæ³åããŠãã ããã ãã¬ãŒã€ãŒã®1人ãç§»åããŸãïŒã¯ãã¹ãèš±å¯ããŸãïŒã åœç¶ã圌ã¯ç©ºã®ã»ã«ã«ç§»åããŸãã
- æ»æãéçºããè€æ°ã®æ»æãéçºããŠããã®åãé«ããŠãã ããã æ°ããæ»æãéå§ãããªã©ã
- æµã®æ»æã®çºçãé²ãããå®å
šã«ãããã¯ããŸãã
ã€ãŸãã䞻人å
¬ã¯æ»æãšé²åŸ¡ãã§ããŸãã ãŸãã¯ãäžåºŠã«ãã¹ãŠãäžåºŠã«å®è¡ã§ããŸãã 圌ã«ãšã£ãŠãæåãš2çªç®ã®äž¡æ¹ãéèŠã§ãã
åæã®æ¬è³ªã¯æ¬¡ã®ãšããã§ãã
- ãããã¯ããã§ãã¯ãããã»ã«å
ã®æ°åã眮æããŸããæåã¯ååãæ¬¡ã«ãŒãã§ãã
- 次ã«ã圌ã¯ãã®ãããªåãã«ãã£ãŠåä¿¡ããããã¹ãŠã®æ»æãæ€çŽ¢ãããããã®éã¿ãèŠçŽããŸãã
- åãåã£ãéã¯ã»ã«ã®ééã§ãã
- åæ§ã®ã¢ã«ãŽãªãºã ãç«¶æå Žã®ãã¹ãŠã®ã»ã«ã«å¯ŸããŠå®è¡ãããŸãã

å®éããã®ãããªã¢ã«ãŽãªãºã ã䜿çšããŠããã®ããã«é²ããšã©ããªããã確èªããŸã...ãããŠãçžæããã®ããã«é²ããšã©ããªããã確èªããŸãã 1ã€ã®ã¹ããããæ¥œãã¿ã«ããŠãæãé©åãªã»ã«ãéžæããŸã-æãé«ãéã¿ãæã¡ãŸãã
ã»ã«ã®éã¿ãä»ã®ã»ã«ããã倧ããå Žåãããã¯ããå±éºãªæ»æã®äœæã«ã€ãªãããã匷åãªæµã®æ»æããããã¯ããŸãã ãã¹ãŠãè«ççã§ã...ããã¯ç§ã«ã¯æããŸãã
ããŒãžã«ç§»åããŠã³ã³ãœãŒã«ã«SHOW_WEIGHTS = trueãšèšè¿°ãããšãã¢ã«ãŽãªãºã ã®åäœãèŠèŠçã«æããããšãã§ããŸãïŒã»ã«ã®éã¿ã衚瀺ãããŸãïŒã
æ»æã®éã¿
ç§ã¯èªåã®é ãé§äœ¿ããŠãæ»æãšéã¿ã®ãã®ãããªå¯Ÿå¿ããããããŸããã
ATTACK_WEIGHT = [[],[],[],[],[],[]]; ATTACK_WEIGHT[1][1] = 0.1; ATTACK_WEIGHT[2][1] = 2; ATTACK_WEIGHT[3][1] = 4; ATTACK_WEIGHT[4][1] = 6; ATTACK_WEIGHT[5][1] = 200; ATTACK_WEIGHT[1][2] = 0.25; ATTACK_WEIGHT[2][2] = 5; ATTACK_WEIGHT[3][2] = 7; ATTACK_WEIGHT[4][2] = 100; ATTACK_WEIGHT[5][2] = 200; ATTACK_WEIGHT[5][0] = 200;
çµéšçã«éžæ-ããã¯ããããæè¯ã®éžæè¢ã§ã¯ãããŸããã
ã¢ã¬ã€ã«éåžžã«å€§ããªéã¿ã§5ã®æ»æåã远å ããŸããã ããã¯ãããããã²ãŒã ãåæããäžæ©åé²ãèŠãŠãããšããäºå®ã«ãã£ãŠèª¬æã§ããŸãïŒã»ã«å
ã®æ°åã眮ãæããŸãïŒã ãã®ãããªæ»æãã¹ãããããããšã¯ãæåã«ä»ãªããŸããã ãŸãããŸãã¯åå©...誰ã«å¿ããŠã
é«ãå¯èœæ§ã®ããæ»æã¯ããé«ãè©äŸ¡ãããŸãã
ã»ãšãã©ã®å Žåãæ»æ[4ïŒ2]ãã²ãŒã ã®çµæã決å®ããŸãã ãã¬ã€ã€ãŒããã®ãããªæ»æãäœæã§ããå Žåã察æŠçžæã¯ããããããã¯ã§ããªããªããŸãã ããããããã¯åå©ã§ã¯ãããŸããã ãã£ãŒã«ãã«æ»æ[4ïŒ2]ãããå Žåã§ããæµã¯ã²ãŒã ãããéãçµäºã§ããããããã®éã¿ã¯5ã®ã¹ãä¹ã®æ»æãããå°ãããªããŸããäžã®äŸãåç
§ããŠãã ããã
å³2.æ»æ[4ïŒ2]åŒãè£ãããæ»æ
ãã®æ®µèœã§ã¯ã³ãŒãã¯ç€ºãããŠããŸããã ããã§ã¯ãæ»æãã£ãã€ããŒã®æŠå¿µã玹ä»ãã
ãç Žå£æ»æãã®æ¬è³ªã説æããŸãã
次ã®ç¶æ³ãèæ
®ããŠãã ããã5å以äžã®è€æ°ã®ç©ºã®ã»ã«ãåé€ããããã«Figureã眮ãæããå Žåããã1ã€ãé
眮ãããŸãã
ãããŠãåãè¡ã«ãã2ã€ã®åäžã®æ°å...èŠèŠçã«ã¯æ»æã®ããã«èŠããŸãããå®éã«ã¯ããã§ã¯ãããŸããã ãã®ãããªãç Žå£ããããæ»æãæœåšçãªè
åšã«ãªããããé åºã§ã¯ãããŸããã
ç¹ã«ãã®ãããªå Žåãæ»æããšã«é€æ°ãèšç®ããŸãã åæå€ã¯1ã§ãã
- ç§ãã¡ã¯ãããã€ãã®æ®éã®ãç Žå£ããããæ»æãæç€ºããŸã
- äžå€®ã®æ»æãšåŽé¢ã®éã®ç©ºã®ã»ã«ã®æ°ãæ°ããŸã
- 空ã®ã»ã«ããšã«ã逿°ã1ãã€å¢å ããŸã
- éåžžéãäžå€®æ»æã®éã¿ããµã€ãæ»æã®éã¿ãèšç®ããŸã-逿°ã§é€ç®ããŸã
å³3.ãåŒãè£ãããæ»æãã®åæã é»è²ã®ååãä»ããã»ã«ãã¹ãã£ã³ãããŸãããããã£ãŠãåŒãè£ãããæ»æãAIã«ãã£ãŠèæ
®ãããŸãã å®éããããã¯éåžžã®æ»æã§ãããã¹ãã£ã³ãããã»ã«ããé ãããã»ã©åœ±é¿ãå°ãããªããããã«å¿ããŠéã¿ãå°ãããªããŸãïŒä»åãã®ãããïŒã
æ»ææ€çŽ¢ã¢ã«ãŽãªãºã
æåã«
ãæ»æ
ã¯ã©ã¹ãäœæããŸãã æ»æã«ã¯3ã€ã®å±æ§ããããŸãããããã«ã€ããŠã¯åã«èª¬æããŸããã
class Attack{ constructor( cap = 0, pot = 0, div = 1 ){ this.capability = cap;
ãããŠãç¹å®ã®æ»æã®éã¿ãè¿ã1ã€ã®
ã¡ãœãã ïŒ
countWeigth(){ return ATTACK_WEIGHT[ this.capability, this.potential ] / this.divider } }
次ã 1ã€ã®ã»ã«ã«å¯Ÿãããã¹ãŠã®æ»æã®æ€çŽ¢ãæ¬¡ã®ããã«åå²ããŸãã
- æ°Žå¹³æ€çŽ¢
- åçŽæ€çŽ¢
- 45床ã®å¯Ÿè§æ€çŽ¢
- 135åºŠã®æãæ€çŽ¢
ãããã¯ãã¹ãŠ
è¡ã§ããããããã®è¡ã«å¯Ÿããæ»æãæ€çŽ¢ããã¢ã«ãŽãªãºã ã¯äžè¬åã§ããŸãïŒ
checkLineã¯ã©ã¹ ã
ãã ããè¡å
šäœããã§ãã¯ããå¿
èŠã¯ãããŸããã èå³ã®ããæå€§ã®æ»æåã¯5ã§ãããã¡ãããããšãã°6ã®åã§æ»æãäœæããããšã¯å¯èœã§ãã ããããæ¬¡ã®åãã®ã²ãŒã ç¶æ³ãåæããAIã®å Žåã6ãŸãã¯5ãšåãã§ãããããã®æ»æã®ãããããååŸããèŠèŸŒã¿ã¯ã次ã®åãã®ã²ãŒã ã®çµäºã瀺ããŸãã ãããã£ãŠãåæãããã»ã«ã®ééã¯äž¡æ¹ã®ã±ãŒã¹ã§åãã«ãªããŸãã
ã¯ã©ã¹å±æ§ïŒ
class checkLine{ constructor(){
åé¡ãçºçããå¯èœæ§ããããããããã§åæ¢ããå¿
èŠããããŸããæå€§æ»æåã5ã®å Žåã6çªç®ã®ã»ã«ããã§ãã¯ããçç±ã§ãã
äŸã¯æ¬¡ã®ãšããã§ããç»åå
ã®1ã®ã¹ãä¹ã®æ»æã¯ãã¹ãã£ã³ãããé åã®å¢çã«ãããŸãã ãã®æ»æã®å¯èœæ§ãç¥ãã«ã¯ããæµ·å€ãèŠããå¿
èŠããããŸãã
å³ 3. 6çªç®ã®ã»ã«ãã¹ãã£ã³ããŸãã 6çªç®ã®ã»ã«ãã¹ãã£ã³ããªããšãæ»æã®å¯èœæ§ã誀ã£ãŠå€æã§ããŸãã
ããã€ãã®æ»æãå®äºããã®ã«ååãªã¹ããŒã¹ããªãå¯èœæ§ããããŸãã æ»æå Žæãã«ãŠã³ããããšãã©ã®æ»æãèŠèŸŒã¿ããªãããäºåã«çè§£ã§ããŸãã
å³ 4.æ»æããå Žæã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
1ïŒäžå€®ã®ã»ã«ããå§ããŸãããã 空ã«ããå¿
èŠããããŸãïŒãã®äžã«ç§»åããŸããïŒããããAIãæ¬¡ã®ç§»åã®åæã®ããã«ãã®ã»ã«ã®æ°å€ã眮æããå¿
èŠãããããšãå¿ããªãã§ãã ããã眮æããæ°å€ã¯
this.subfigã§ã -ããã©ã«ãã¯ã¯ãã¹ã§ããäžå€®ã®ã»ã«ã¯çœ®æåŸã«æåã«äœããã®åœ¢ç¶ãå«ãããã
this.curAttackæ»æã®ããã€ãã®çš®é¡ã«
å±ããŸãã
- ãã®é»åã¯1以äžã«ãªããŸãïŒäžå€®ã®ã»ã«ã®æ°åïŒ
- ååšåš-1 ç§ãã¡ã¯éäžæ»æã«ã€ããŠè©±ããŠããïŒããã¯ã¹ãã£ã³ãããã»ã«ã«å±ããïŒ;
- ããã³ã·ã£ã«ã¯ãŸã ããã£ãŠããŸãã-ããã©ã«ãã¯0ã§ãã
ããããã¹ãŠã®ãã€ã³ããããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿å€ã«è¡šç€ºããŸãã-äžèšã®ã³ãŒããåç
§ããŠãã ããã
2ïŒæ¬¡ã«ãå埩åãæžãããŠãã¹ãã£ã³ããã»ã«ã®çåŽã®5ã€ã®ã»ã«ãæŽçããŸãã
getAttacks颿°
ïŒcellXãcellYãsubFigãdxãdyïŒããããæ
åœããŸããããã§ã
cellXãcellY-ãã§ãã¯ãããã»ã«ã®åº§æš
subFig-ãã§ãã¯ãããã»ã«ã§çœ®æããå³
dxãdy-ãµã€ã¯ã«ã®x座æšãšy座æšã®å€å-ãããæ¢çŽ¢æ¹åã®èšå®æ¹æ³ã§ãïŒ
- æ°Žå¹³ïŒdx = 1ãdy = 0ïŒ
- åçŽïŒdx = 0ãdy = 1ïŒ
- 察è§ç·45ïŒdx = 1ãdy = -1ïŒ
- 察è§ç·135ïŒdx = 1ãdy = 1ïŒ
ããæå³ã§ã¯ãããã¯æ€çŽ¢ã©ã€ã³ã«å¹³è¡ãªãã¯ãã«ã§ãã ãããã£ãŠã1ã€ã®é¢æ°ã§4æ¹åã®æ€çŽ¢ãå¯èœã«ãªããDRYååã«å床éåããããšã¯ãããŸããã
æ©èœã³ãŒãïŒ
getAttacks( cellX, cellY, subFig, dx, dy ){ this.substitudeFigure( subFig );
checkCellïŒïŒãäœããè¿ããšãã«ãŒãã忢ããããšã«æ³šæããŠãã ããã
3ïŒãããã®ã»ã«ã®æ°å€ã確èªããŸãã
checkCellïŒxãyïŒé¢æ°ããããæ
åœããŸãã
ãŸãã圢ç¶ã
fig倿°ã«æžã蟌ã¿ãŸãã
Model.Fieldã¯ç§ãã¡ã®ç«¶æå Žã§ãã
checkCell( x, y ){ var fig = Model.Field[x] && Model.Field[x][y] !== undefined ? Model.Field[x][y] : 'b';
figã¯ããxãããoãããbãïŒå¢çç·ïŒã0ïŒç©ºã®ã»ã«ïŒã§ãã
4ïŒ5çªç®ã®ã»ã«ã§å³ãäžå€®ã®ã»ã«ãšäžèŽããå Žåãæ»æã¯å¢çã«å¯ŸããŠã
忢 ãããæ»æã®å¯èœæ§ã倿ããã«ã¯ããå¢çããã§ãã¯ãããå¿
èŠããããŸãïŒ
this.checkEdge = true ïŒã
if( this.iter == 4 && fig == this.subFig )
checkCell颿°ã®æºåãã§ããŸããã ãã ãã
checkLineã¯ã©ã¹ã«ã€ããŠã¯åŒãç¶ãäœæ¥ããŸãã
5ïŒæåã®ãµã€ã¯ã«ãå®äºããåŸããåããå€ãããå¿
èŠããããŸãã ã€ãã¬ãŒã¿ãäžå¿ã«å€æããã€ã³ããã¯ã¹0ã§äžå€®ã®æ»æãè¡ããæ»æã®é
åãããããåé€ããŠçŸåšã®æ»æãšããŠèšå®ããŸãã
turnAround(){ this.iter = 1; this.checkEdge = false; this.curAttack = this.Attacks[0]; this.Attacks.splice(0,1) }
6ïŒæ¬¡ã«ãçŸåšã®ã»ã«ã®å察åŽã«ç§»åããŠãå埩åãå¢ãããŸãã
ãŸã£ããåãæ°åã®ãã§ãã¯ã ïŒã³ãŒãã¯ãã§ã«èšè¿°ãããŠããŸã
-getAttacks颿°ïŒ
7ïŒãã¹ãŠã1ã€ã®ã¢ã¬ã€ã®ã©ã€ã³äžã«ãã£ããã¹ãŠã®æ»æãåéããŸããã
ããã§
checkLineã¯ã©ã¹ã䜿çšãããš
ããã¹ãŠ...ãå®äºããŸãã
ããã§ã¯ããã¹ãŠãç°¡åã§ããåã©ã€ã³ïŒæ°Žå¹³ããã³åçŽã®2ã€ã®å¯Ÿè§ç·ïŒã«å¯ŸããŠ
checkLineãªããžã§ã¯ããäœæãã
getAttacks颿°ãåŒã³åºããŸãã ã€ãŸãã
åè¡ã«å¯ŸããŠ-ç¬èªã®
checkLineãªããžã§ã¯ããšãããã«å¿ããç¬èªã®æ»æã»ããã
getAllAttacksïŒïŒé¢æ°ãããããã¹ãŠãæ
åœããŸã-ãã§ã«äžèšã®ã¯ã©ã¹ãšã¯å¥ã«ã
getAllAttacks( cellX, cellY ){
åºåã«ã¯ããã¹ã察象ã®ã»ã«ã«å¯Ÿãããã¹ãŠã®æ»æãå«ããªããžã§ã¯ãããããŸãã
ãã ããäœããã®ãã£ã«ã¿ãŒæ©èœã«æ°ä»ããŠãããããããŸããã ãã®ã¿ã¹ã¯ã¯ããç¡é§ãªãæ»æããµããã«ãããããšã§ãã
- ãŒãã®é»åã§ïŒé
åã«å
¥ããã©ããã¯ããããŸããïŒ
- ã¹ããŒã¹ãäžè¶³ããŠããæ»æïŒæ»æå Žæ<5ïŒ
- ãŒãé»äœã
ãã ããæ»æã®ãã¯ãŒã5ãã倧ããå Žåããã£ã«ã¿ãŒã¯ãããã¹ãããããŸãã ãããã¯ãã®ãããªæ»æã確èªããå¿
èŠããããŸããã¹ã¯ãªãŒãã³ã°ãè¡ããšãã²ãŒã çµäºæã«åŠšå®³ãçºçããŸãã
filterAttacks( attackLine ){ var res = [] if( attackLine.attackplace >= 5 ) attackLine.Attacks.forEach( ( a )=>{ if( a.capability && a.potential || a.capability >= 5 ) res.push( a ) }) attackLine.Attacks = res; return res }
ãã¬ãŒã¯ãã€ã³ã
ã¯ã...åã³ãããããªããïŒ ãããã£ãŠã1ã€ã®ééã£ãåããã²ãŒã ã®çµæã決å®ãããšãã«ãã²ãŒã ã®ç¶æ³ãåŒã³åºããŸãã
ããšãã°ãæ»æ[3ïŒ2]ã¯ãã¬ãŒã¯ãã€ã³ãã§ãã 察æŠçžæãé£ã«é§ã眮ããŠããããããã¯ããªãã£ãå Žåãæ¬¡ã®åãã§ã¯ããã§ã«ãã£ãŒã«ãã§æ»æ[4ïŒ2]ãè¡ãããŠããŸãã
ãŸãã¯æ»æ[4ïŒ1]ã äžããã³-ãããŠã²ãŒã ã¯ç°¡åã«å®äºããããšãã§ããŸãã
å³5.ãã¬ãŒã¯ãã€ã³ãããã§ã¯ãã¹ãŠãæç¢ºã§çè§£å¯èœãªãã®ã§ãããäžèšã®ã¢ã«ãŽãªãºã ã¯ãã§ã«ãã¬ãŒã¯ãã€ã³ããèæ
®ããã¿ã€ã ãªãŒã«ãããããããã¯ããããšãã§ããŸãã ãããã¯æ¥œãã¿ã§ãã 圌ã¯ã次ã®ã¿ãŒã³ã§ãæµãæ»æãäœæã§ããããšã確èªããŸã[5ïŒ1]ãããšãã°ããã®äœéã¯200ã§ããããã¯ãunningãªãªã¿ã¯ãããã«è¡ãããšãæå³ããŸãã
ãã ãããã¬ãŒã€ãŒã®1人ããã£ãŒã«ãã§2ã€ã®ãã¬ãŒã¯ãã€ã³ããååŸããç¶æ³ãæ³åããŠãã ããã ãããŠãããã¯æããã«ãçžæã«ãã£ã³ã¹ãæ®ããŸããããªããªã äžåºŠã«ãããã¯ã§ãããã¬ãŒã¯ãã€ã³ãã¯1ã€ã ãã§ãã ãã®ãããªæ»æããããã¯ããããã«AIã«æããæ¹æ³ã¯ïŒ
å³6. 2ãã¬ãŒã¯ãã€ã³ãã»ã«ãåæãããšããã»ã«å
ã®ããŒã¹ã代å
¥ãããšããæ¬¡ã®ã¿ãŒã³ã§ååŸãããã¬ãŒã¯ãã€ã³ãã®æ°ãã«ãŠã³ãããŸãïŒãããã¯åæ¹ãžã®åããèŠãŠãå¿ããªãã§ãã ããïŒã 2ã€ã®ãã¬ãŒã¯ãã€ã³ããã«ãŠã³ãããããšã«ãããã»ã«ã®éã¿ã100å¢ãããŸãã
ãããŠä»ããããã¯ãã®ãããªã²ãŒã ã®ç¶æ³ãé²ãã ãã§ãªããããããäœæããããšãã§ããããã«ãªããããæãããçžæã«ãªããŸããã
æ»æããã¬ãŒã¯ãã€ã³ãã§ããããšãçè§£ããæ¹æ³
æçœãªããšããå§ããŸãããïŒ4ã®ã¹ãä¹ãæã€æ»æã¯ãã¬ãŒã¯ãã€ã³ãã§ãã ãã£ã1åã®ãã¹ã§ãã²ãŒã ãå®äºããæ©äŒãäžããããŸãã 5åãäžåã«äžŠã¹ãŸãã
ããã«ãæ»æã®å¯èœæ§ã2ã§ããå Žåããã®ãããªæ»æããããã¯ããããã«ããã«1ã¿ãŒã³ãè²»ãããŸããã€ãŸãã3ã®ã¹ãä¹ã®ãã¬ãŒã¯ãã€ã³ããååšããããšãæå³ããŸãã
ãããŠããã«é£ãã-
ãåŒãè£ãããæ»æã ã
äžå€®ã«ç©ºã®ã»ã«ã1ã€ã ãããæ»æã®ã¿ãæ€èšããŸãã ããã¯ã2ã€ã®ç©ºã®ã»ã«ãäžå€®ã«é
眮ããŠæ»æãå®äºããã«ã¯ãå°ãªããšã2åã®ç§»åãå¿
èŠã§ããããã§ã-ããã¯æããã«ãã¬ãŒã¯ãã€ã³ãã§ã¯ãããŸããã
ç§ãã¡ãæãåºãããã«ãç§ãã¡ã¯ç Žããæ»æãããã€ãã®åŸæ¥ã®æ»æãšèããŠããŸãïŒ1ã€ã®äžå€®æ»æãšãµã€ãæ»æã§ãã äžå€®ã®æ»æã¯ã¹ãã£ã³ãããã»ã«ã«å±ãããµã€ããã£ãã€ããŒã«ã¯1以äžããããŸã-ããã¯äžèšã®ãšããã§ãã
ãã¬ãŒã¯ãã€ã³ããèŠã€ããããã®ã¢ã«ãŽãªãºã ïŒç°¡åã以äžããèªã¿ãã ããïŒïŒ
- å¯å€ã¹ã³ã¢ã玹ä»ããŸã
- ç§ãã¡ã¯äžå€®æ»æãåããåãèæ
®ããŸã
- 逿°ã2å以äžã®å Žåããµã€ãã®1ã€ã䜿çšããŸãã
- ã¹ã³ã¢ -äžå€®ããã³ãµã€ãæ»æã®åã®åèš
- äžå€®ããã³ãµã€ãæ»æã®å¯èœæ§ã2ã§ããå Žåããã®ãããªæ»æããããã¯ããã«ã¯ããã1ã¿ãŒã³ãè²»ããå¿
èŠããããŸãã ãããã£ãŠãã¹ã³ã¢ã¯1å¢å ããŸã
- ã¹ã³ã¢ã 4以äžã®å Žåãããã¯ãã¬ãŒã¯ãã€ã³ãã§ã
å®éããã¬ãŒã¯ãã€ã³ãã¯åçŽã«åæããããšãã§ãããããã®å€ãã¯ãããŸããããããã«ã¯ããããŸããã§ããã
isBreakPoint( attackLine ){ if( ! attackLine || ! attackLine.length ) return false; var centAtk; attackLine.forEach( ( a )=>{ if( a.divider == 1 ) centAtk = a; }) if( centAtk.capability >= 4 ) return true if( centAtk.potential == 2 && centAtk.capability >= 3 ) return true; var res = false; attackLine.forEach( ( a )=>{ var score = centAtk.capability; if( a.divider == 2 ){
ã¯ããæçµçã«ãã¹ãŠããŸãšããŸã
ãããã£ãŠãèåŸã«ããäž»ãªå°çã«ã€ããŠã¯äžã§èª¬æããŠããŸãã ããããæ©èœããäœãã圢äœãæã§ãã 颿°
countWeightïŒxãyïŒ -ã»ã«ã®åº§æšãå
¥åãšããŠåãåãããã®éã¿ãè¿ããŸãã 圌女ã®ããŒãã®äžã«ã¯äœããããŸããïŒ
æåã«ãã»ã«ãå±ãããã¹ãŠã®æ»æã®é
åãååŸããŸãã ïŒ
getAllAttacksïŒxãyïŒ ïŒã ãã¹ãŠã®è¡ã調ã¹ãŠããã¬ãŒã¯ãã€ã³ãã®æ°ãã«ãŠã³ãããŸãã 2ã€ã®ãã¬ãŒã¯ãã€ã³ããããå Žåããã®ç¶æ³ãã²ãŒã ã®çµæã決å®ããã»ã«ã®éã¿ã100å¢ããããšãã§ããããšãæãåºããŠãã ããã
ãã ãããã¹ãŠã®ãã¬ãŒã¯ãã€ã³ãã¯1人ã®ãã¬ãŒã€ãŒã«å±ããŠããå¿
èŠããããããæåã®ã¯ãã¹ã次ã«ãŒãã®2ã€ã®ã¹ãããã§ãã§ãã¯ãå®è£
ããå¿
èŠããããŸããã
æ»æã®éã¿ã®é
åïŒ
ATTACK_WEIGHTS [] ïŒã§6以äžã®ãã¯ãŒã®æ»æãæäŸããªãã£ãããããããã5ã®ãã¯ãŒã®æ»æã«çœ®ãæããå¿
èŠããããŸãããéãã¯ãããŸããããããã¯ãã¹ãŠã²ãŒã ã®çµããã«ã€ãªãããŸãã
ããŠãæ»æã®éã¿ãèŠçŽããŸã-ããã ãã§ãã
å¥ã®å°ããªç¹ïŒããããã²ãŒã ã®çµããã«éŠ¬é¹¿ã«ãªããªãããã«ãæ¢ã«4ã®ã¹ãä¹ã§æ»æãæ§ç¯ããçŸåšã®åããèããŠããå Žåããã®ãããªæ»æãå®äºããã«ã¯ã»ã«ã®ééã倧å¹
ã«å¢ããå¿
èŠããããŸãã ããããªããã°ãAIã¯åçŽã«ãçžæã®ãå±éºãªãæ»æãã身ãå®ãããšãã§ããŸãããã²ãŒã ã¯åã£ãããã«èŠããŸãã æåŸã®åãã¯éèŠã§ãã
countWeight( x, y ){ var attacks = this.getAttacks( x, y ) if( ! attacks ) return; var sum = 0; sum += count.call( this, attacks.x, 'Ã' ); sum += count.call( this, attacks.o, 'â' ); return sum function count( atks, curFig ){ var weight = 0; var breakPoints = 0; [ "0", "45", "90", "135" ].forEach( ( p )=>{ if( this.isBreakPoint( atks[p] ) ){ debug( "Break point" ) if( ++breakPoints == 2 ){ weight += 100; debug( "Good cell" ) return; } } atks[p].forEach( ( a )=>{ if( a.capability > 5 ) a.capability = 5; if( a.capability == 5 && curFig == Model.whoPlays.char ) weight += 100; weight += a.getWeight(); }); }) return weight } }
ããã§ãç¹å®ã®ã»ã«ã«å¯ŸããŠãã®é¢æ°ãåŒã³åºããšããã®éã¿ãååŸãããŸãã ãã¹ãŠã®ã»ã«ã«å¯ŸããŠãã®æäœãå®è¡ããæé©ãªãã®ãéžæããŸãïŒéã¿ãæãé«ãïŒã ããã«è¡ãïŒ
æ®ãã®ã³ãŒãã¯
githubã§èŠã€ããããšãã§ããŸãã ãã§ã«å€ãã®è³æãããããã®ãã¬ãŒã³ããŒã·ã§ã³ã¯ãç§ã詊ããããšããªãã®ã§ãæãŸãããã®ããããããããŸãã ããããèªè
ã®çããããããŸã§èªãã§ããã ããã°ããããããã§ãã
çµæã«å¯Ÿããç§ã®æèŠ
ããïŒ
ã¯ããããªãã¯åœŒãåãããšãã§ããŸããããããããããšã¯ç§ã«ãšã£ãŠå人çã«å°ãåé¡ã§ãããã¶ãç§ã¯ååã«æ³šæããŠããŸãããããªãã®åŒ·ãã詊ããŠãã ãããç§ã¯ãããããç°¡åã«å¯èœã§ããããšãç¥ã£ãŠããŸãããç§ã¯æ¹æ³ãããããŸããããã®ãããªãããã®ä»ã®å®è£
ãç¥ã£ãŠããããŸãã¯èŠãŠãã人ã®è©±ãèãããã§ããç§ã¯äœãè¯ããªãããç¥ã£ãŠããŸããã¯ã...ããããã¯ã¹ãªã©ã®æåãªã¢ã«ãŽãªãºã ã䜿çšã§ããŸããããã®ããã«ã¯ã²ãŒã çè«ã®åéã§ç¥èããŒã¹ãå¿
èŠã§ããæ®å¿µãªãããããã¯èªæ
¢ã§ããŸãããå°æ¥çã«ã¯ããã¬ãŒã¯ãã€ã³ãåæãæ°ã¹ãããå
ã«è¿œå ããŠãããããããã«æ·±å»ãªã©ã€ãã«ã«ããäºå®ã§ããããããçŸåšããã®å®è£
ã«ã€ããŠæç¢ºãªèãããããŸãããç§ã¯ã¡ããã©ä»åºŠã®ã»ãã·ã§ã³ãšäžå®å
šãªåæ¥èšŒæžãæã£ãŠããŸã-ããã¯ç§ãæ²ããŸããŸããæåŸãŸã§èªãã§ãããŠããããšãã