ããã€ã¶ãããããããç»ãå¯å£«ã®å±±
å¯å£«ã®åéã§éãã«ããã«ã¿ãã ãªã
é«ããŸã§
å°æäžè¶ïŒå°æäžè¶ïŒ
çµæãšããŠåŸãããã®ã«ã€ããŠå€ãã®ããšã
æžããŸãã ã
圌ã¯ãããã©ã®ããã«äœ¿ãã
ã話ããŸããããçããããŠããªã1ã€ã®ç°¡åãªè³ªåãæ®ããŸããã ãªãç§ã¯
ãã®ãã¹ãŠïŒå€§äžå€«ã
ã»ãšãã©ãã¹ãŠïŒãæ©èœãããš
確信ããŠããã®ã§ããïŒ ç§ã«ã¯ç§å¯å
µåšããããŸãïŒ ãããŠä»æ¥ãç§ã¯åœŒã«ã€ããŠè©±ãããã§ãã
ç§ãæžããŠãããããžã§ã¯ãã¯è€éã§ãã ããŒãã²ãŒã ã®èšè¿°ã«é©ããå¯èœæ§ã®ãããŠãããŒãµã«ã¢ãã«ãéçºããŠããŸãã ãã®ãããªãããžã§ã¯ãããŒãããéçºããæ¹æ³ã«ã€ããŠèããå¿
èŠã¯ãããŸãããéå§ããŠãåäœãããã©ããã確èªããŠãã ããã ããã«ãå®è¡ãããã®ã¯ãŸã ãããŸããã ãã®ã¢ãã«ãèµ·åã§ããã³ã³ãããŒã©ãŒãå§åçãªãã¥ãŒããããŸããã ããããããã§èšè¿°ãããã³ãŒãããã§ãã¯ããŠãããã°ããå¿
èŠããããŸãïŒ ãã®åŸãã³ã³ãããŒã©ãŒãšãã¥ãŒã衚瀺ããããšããã¹ãŠããããã°ããããšã¯ãŸã£ããäžå¯èœã«ãªããŸãïŒ
ç§ã¯ãã®ãããªåé¡ã«ééããæåã®äººã§ã¯ãªããããã解決ããæ¹æ³ã¯é·ãé
çºæã
ããŠã
ãŸãã ã ã³ãŒãããã¹ãããã«ã¯
QUnitã䜿çšããŸããããã¡ããããããJavaScriptã®äžçã§å¯äžã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã ã³ãŒãã®èšè¿°ã«ãã¹ããå
è¡ãããããšã¯ããªããšããç¹ã§ã
TDDæ¹æ³è«ã«ã¯åºå·ããŠããŸããããå¯èœãªéããã¹ãã§ã¢ãã«ã³ãŒãå
šäœãã«ããŒããããšããŠããŸãã ããã«ããã次ã®åé¡ã解決ã§ããŸãã
- ã³ãŒãå
ã®æããªãã°ãšã¿ã€ããã¹ãèŠã€ããŠä¿®æ£ãã
- 䜿çšãããŠãããœãªã¥ãŒã·ã§ã³ãšããŸããŸãªãã©ãããã©ãŒã ïŒãã©ãŠã¶ãŒïŒãšã®äºææ§ã確èªãã
- ååž°ãã¹ã ïŒäœããå€æŽããå Žåãäœãå£ããŠããªãããšã確èªããå¿
èŠããããŸãïŒ
- æå°éã®ããã¥ã¡ã³ããŒã·ã§ã³ïŒãã¹ãã¯ã¢ãã«ã€ã³ã¿ãŒãã§ã€ã¹ã®äœ¿çšæ¹æ³ãèšé²ããŸãïŒ
ãã®ã¢ãããŒãã¯ãã§ã«æ£åœåãããŠããŸãéçºã®æåã®æ®µéã§ãJavaScriptã䜿çšããŠãŸã ãããªãã
ã«ãã
ãšã ãç§ã¯
Joclyã³ãŒãã
åºç€ãšããŠããŸãã ã ä»ãç§ã¯ãã®æã«æžããããã®ã®å€ããåãé€ãå¿
èŠããããŸããããã®ç¬éãç§ã¯ã©ããããå§ããªããã°ãªããŸããã§ããã ç§ã¯ãã®ã¿ã¹ã¯ãããç解ããŠããŸããïŒæéã瀺ãããã«ãååã§ã¯ãããŸããã§ããïŒããèšèªã®ç¥èã¯éåžžã«ä¹ããã£ãã§ãã ãããã®æ代ã®ã³ãŒããµã³ãã«ã®1ã€ã次ã«ç€ºããŸãã
é
åå
ã®ã¢ã€ãã ãæ€çŽ¢ããif ([].indexOf) { Model.find = function(array, value) { return array.indexOf(value); } } else { Model.find = function(array, value) { for (var i = 0; i < array.length; i++) { if (array[i] === value) return i; } return -1; } }
ã¯ããææå°æ©ãªæé©åã é
åãã
indexOf ãããµããŒãããŠããå Žåã¯ããã䜿çšããããã§ãªãå Žåã¯ã«ãŒãå
ã§æåã§æ€çŽ¢ããŸãã æ°å€ã®ã¿ã§åäœããããã«æåããã¢ãã«ãæ§ç¯ããããããã°ããããŠãããä»ã®äœããæé©åããããšã«ããŸããã
æŽæ°å€ã®é
å if (typeof Int32Array !== "undefined") { Model.int32Array = function(array) { var a = new Int32Array(array.length); a.set(array); return a; } } else { Model.int32Array = function(array) { return array; } }
è«çã¯åãã§ãã æ°å€é
åã䜿çšã§ãã人ã¯ãæ®ãã¯ã§ããéã䜿çšããŸãã ãã°ããã®éãããã¯ãã¹ãŠããŸããããŸããã 䜿çšãããã©ãŠã¶ã§ã ããããããæŽããæ¥ãIE11ã§ãã¹ããå®è¡ããŸããã ãããŠãMicrosoftã®äœæã¯ã¹ãã©ã€ããé
ããªãã£ãã ãã¹ãã¯æ©èœããŸããã§ããã ãã¹ãŠã
ãã®ä¿®æ£ã«ã€ãªãããŸããã ãã®ã³ãŒãã®æ¹ãã¯ããã«åªããŠãããšã¯èšããããããŸããïŒçŸåšã¯æžãçŽãããŠããŸãïŒãããã¹ããå®æçã«ç°ãªããã©ãããã©ãŒã ã§å®è¡ããŠããªããã°ããã®åé¡ã«ã€ããŠç¥ããªãã£ãã§ãããïŒ åäœãã¹ãã¯æ¬åœã«æ©èœããŸãã
ãã¹ããéçºããããšã§ãåçŽãªã³ãŒãããããè€éãªã³ãŒãã«ç§»è¡ããŸãã 移åã®çæã®è€éãªããžãã¯ããã§ãã¯ããåã«ïŒãããã¢ãã«ãè¡ãäž»ãªããšã§ãïŒã䜿çšããããã¹ãŠã®ããŒããæ£ããæ©èœããããšã確èªããå¿
èŠããããŸãã ç§ã®ã¢ãã«ã§äœ¿çšããããã¹ãŠã®ã¯ã©ã¹ã¯ããè€éãããå¢ããããšã§ã©ã³ã¯ä»ãã§ããŸãã
- ZrfPiece-ããŒã¹ã®èª¬æïŒããŒãäžã®ãªããžã§ã¯ãïŒ
- ZrfDesign-ããŒãããããžãšã²ãŒã ã«ãŒã«ã®èª¬æ
- ZrfMove-ã²ãŒã ã®ç¶æ
ãå€æŽããåãã®èª¬æ
- ZrfMoveGenerator-ãã¿ãŒã³ã«åŸã£ãŠå¯èœãªåãã®ãžã§ãã¬ãŒã¿ãŒ
- ZrfBoard-ãã¹ãŠã®æå¹ãªåãã®ã²ãŒã ç¶æ
ã®ä¿åãšçæ
ZrfPieceã¯ã©ã¹
ã¯éåžžã«åçŽã§
ããããããã¹ãã§ã¯å®å
šãªã²ãŒã
ãã¶ã€ã³ããå¿
èŠãããŸããã ãã ããæ€èšŒãå¿
èŠãªéèªæãªæ©èœãããã€ããããŸãã ããšãã°ãå³ã®ã¿ã€ããææè
ããŸãã¯å±æ§ã®äžéšãå€æŽãããšãã«æ°ãããªããžã§ã¯ããäœæããããžãã¯ã
ããã¯ãã¹ãŠåºæ¬çãªãã§ãã¯ã§ãã QUnit.test( "Piece", function( assert ) { var design = Model.Game.getDesign(); design.addPlayer("White", []); design.addPlayer("Black", []); design.addPiece("Man", 0); design.addPiece("King", 1); var man = Model.Game.createPiece(0, 1); assert.equal( man.toString(), "White Man", "White Man"); var king = man.promote(1); assert.ok( king !== man, "Promoted Man"); assert.equal( king.toString(), "White King", "White King"); assert.equal( man.getValue(0), null, "Non existent value"); var piece = man.setValue(0, true); assert.ok( piece !== man, "Non mutable pieces"); assert.ok( piece.getValue(0) === true, "Existent value"); piece = piece.setValue(0, false); assert.ok( piece.getValue(0) === false, "Reset value"); var p = piece.setValue(0, false); assert.equal( piece, p, "Value not changed"); Model.Game.design = undefined; });
æå°éã®ããã¶ã€ã³ãïŒ2人ã®ãã¬ãŒã€ãŒã2çš®é¡ã®ããŒã¹ãããŒãã®ãã³ããªãïŒãæåã§äœæããé¢å¿ã®ãããã¹ãŠã®ãã§ãã¯ãæåã§å®è¡ããŸãã ãã®åŸãç§ãã¡ã¯
ZrfPieceãéãã«äœ¿çšããŸãã åŸã§äœãã確èªããã®ãå¿ããããšãå€æããå Žåã§ããããã«ããã€ãã®ãã§ãã¯ãè¿œå ããŸãã 次ã«ãããè€éãªã³ãŒãããã¹ãããŸãã
ã²ãŒã ãã¶ã€ã³ QUnit.test( "Design", function( assert ) { var design = Model.Game.getDesign(); design.addDirection("w"); design.addDirection("e"); design.addDirection("s"); design.addDirection("n"); assert.equal( design.dirs.length, 4, "Directions"); design.addPlayer("White", [1, 0, 3, 2]); design.addPlayer("Black", [0, 1, 3, 2]); assert.equal( design.players[0].length, 4, "Opposite"); assert.equal( design.players[2].length, 4, "Symmetry"); design.addPosition("a2", [ 0, 1, 2, 0]); design.addPosition("b2", [-1, 0, 2, 0]); design.addPosition("a1", [ 0, 1, 0, -2]); design.addPosition("b1", [-1, 0, 0, -2]); var pos = 2; assert.equal( design.positionNames.length,4, "Positions"); assert.equal( Model.Game.posToString(pos), "a1", "Start position"); pos = design.navigate(1, pos, 3); assert.equal( Model.Game.posToString(pos), "a2", "Player A moving"); pos = design.navigate(2, pos, 3); assert.equal( Model.Game.posToString(pos), "a1", "Player B moving"); ... Model.Game.design = undefined; });
ZrfDesignã¯ã99ïŒ
ã®ã²ãŒã ããŒãããã²ãŒã·ã§ã³ã§ãã 確èªããŸãã ãã¶ã€ã³ãæåã§äœæãïŒçŸåšã¯å°ããªããŒãã䜿çšïŒããã®åŸãæãäžè¬çãªãã¹ãã±ãŒã¹ãå®è¡ããŸãã æåŸã«ãäœæãããã¶ã€ã³ãã¯ãªã¢ããããšãå¿ããªãã§ãã ããïŒ åœŒãä»ã®ãã¹ããå£ããªãããã«ã
ãšããã§ãä»ã§ã¯å€æããŸããã²ãŒã ã®ãã¶ã€ã³ã
ã·ã³ã°ã«ãã³ãšèãããšããç§ã¯éåžžã«ééã£ãŠããŸããïŒ ãµãŒããŒããŒãžã§ã³ã¯èšããŸã§ããªããè€æ°ã®ç°ãªãã²ãŒã ã¢ãã«ãåæã«æäœã§ããå¿
èŠãããã ãã§ãªããå¥ã®èå³æ·±ãã±ãŒã¹ããããŸãã æãåçŽãªã²ãŒã
ãããã«åãçµãã§ã
çŽ æŽãããã²ãŒã ãæãåºããŸããã
å°é·ã¯å°äžã«æ£ãã°ã£ãŠããŸãããæµãç¥ã£ãŠããã°ãã©ã®ããã«æµãåŒãå¯ããŸããïŒ çµå±ã®ãšããã圌ãåã«ãæ¡æãããããã£ãŒã«ãã«ç«ã£ãŠåœŒã®å§¿ã倱ãçç±ã¯ãŸã£ãããããŸããã ã¿ã¹ã¯ã¯ç°¡åã«è§£æ±ºãããŸãã 䜿çšãããããã¯ããããã«ç°ãªãã²ãŒã ãã¶ã€ã³ãååŸã§ããŸãã ããŒããããŒã¹ã移åããããã®ã«ãŒã«-ãã¹ãŠã¯åãã§ããã1ã€ã®å°ããªäŸå€ããããŸãã 圌ã¯å°é·ã«ã€ããŠäœãç¥ããŸããã
å®éãããã¯ãã³ã³ãã¥ãŒã¿ãŒã«ãã¹ãŠã®æ°åãèŠããããªããã
Kriegspielã
Luzhanqiãªã©ã®äžå®å
šãªæ
å ±ãæã€ã²ãŒã ãå®è£
ããå¯äžã®é©åãªæ¹æ³ã§ãã ãããã«ãããç§ã¯ä»åãçµãã§ããŸãã ãããŠããŠããããã¹ãã¯ããã§åã³å©ãã«ãªããŸãïŒ ãã®ãããªå€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ãå®è¡ããå Žåãäœããã©ãã©ã«ãªã£ãŠããªãããšãç¥ãããšãéèŠã§ãïŒ
ããã«ããã¹ãã¯ãŸããŸãé«ã¬ãã«ã«ãªã£ãŠããŸãã
ZrfMoveGeneratorã¯ã©ã¹ã䜿çšããŠãã³ãã¬ãŒãã«åŸã£ãŠåäžã®åããçæãããã®åããã²ãŒã ç¶æ
ã«é©çšããæåŸã«ç¹å®ã®äœçœ®ã§äžé£ã®åããçæããŸãã
女æ§ã«ããæ°äœã®æŠã QUnit.test( "King's capturing chain", function( assert ) { Model.Game.InitGame(); var design = Model.Game.getDesign(); var board = Model.Game.getInitBoard(); board.clear(); assert.equal( board.moves.length, 0, "No board moves"); design.setup("White", "King", Model.Game.stringToPos("d4")); design.setup("Black", "Man", Model.Game.stringToPos("c4")); design.setup("Black", "Man", Model.Game.stringToPos("a6")); design.setup("Black", "Man", Model.Game.stringToPos("f8")); board.generate(); assert.equal( board.moves.length, 2, "2 moves generated"); assert.equal( board.moves[0].toString(), "d4 - a4 - a8 - g8 x c4 x a6 x f8", "d4 - a4 - a8 - g8 x c4 x a6 x f8"); assert.equal( board.moves[1].toString(), "d4 - a4 - a8 - h8 x c4 x a6 x f8", "d4 - a4 - a8 - h8 x c4 x a6 x f8"); Model.Game.design = undefined; Model.Game.board = undefined; });
ãã¹ãã®ç°¡æœãã®ããã«ãããã¯ã»ãŒå®å
šãªã²ãŒã ã§ãïŒ ãããã«ããããããã移åããŸãã ããã§ã¯ãè€å移åãšãã移åãããŒã¹ãšãã²ãŒã æ¡åŒµãšããŠå®è£
ãããå¯èœãªéãæ倧æ°ã®æµããŒã¹ã®ãã£ããã£ãå¿
èŠãšãã
å€æ°æ±ºã«ãŒã«ã§ãããåªå
ãããã ãŒãããã¹ããããŸãïŒ ãã®å°ããªãã¹ãã¯ãã¢ãã«ã®ã»ãŒãã¹ãŠã®æ©èœã察象ãšããŠããŸãã ãããŠãäœããå£ãããšããããèŠãŠããã«
ä¿®æ£ããŸãã
åäœãã¹ãã圹ç«ã€ãã1ã€ã®ããšã¯ããªãã¡ã¯ã¿ãªã³ã°ã§ãïŒ ããæç¹ã§ããããžã§ã¯ãã§
Underscore ã䜿çšããããšã決å®ããŸããã ãã®çŽ æŽãããã©ã€ãã©ãªã¯ã
æ©èœçãªã¹ã¿ã€ã«ã§ã³ãŒããèšè¿°ããããç°¡æœã§ä¿å®ããããããã®ã«åœ¹ç«ã¡ãŸãã ãããæ確ã«ããããã«ããããžã§ã¯ãã®ç涯ã®äžäŸãæããŸãã
é¢æ°åããã°ã©ãã³ã°ã¯ãã¿ã¹ã¯ãé£ããã»ã©æçšã§ãã ã³ãŒããå®å
šã«åçŽãªå Žåãæ©èœçãªã¹ã¿ã€ã«ã§æžãçŽããŠãã»ãšãã©å¹æã¯ãããŸããã ãã ããã¿ã¹ã¯ãããå°ãè€éãªå Žåã¯ãæ©èœçã¢ãããŒãã®å©ç¹ãããæçœã«ãªããŸãã
ãã®
ã²ãŒã ãèŠããŠããŸããïŒ åœŒå¥³ã«ã¯2ã€ã®é¢çœãã«ãŒã«ããããŸãã
- ç³ãåãããšæ°ããåãäœæãããå Žåããã¬ã€ã€ãŒã¯çžæã®ç³ãæç²ããæš©å©ãç²åŸããŸã
- ãã¬ã€ã€ãŒã3ã€ã®ç³ããæ®ãããŠããªãå Žåã圌ã®ç³ã¯ããã©ã€ã³ã°ãã«å€ãããŸãã ãããã®ç³ã¯ãé£æ¥ããç³ã®1ã€ã ãã§ãªããéåžžã¯ããŒãäžã®ç©ºããŠããã»ã«ã«ç§»åïŒãé£ã³ãïŒãŸãã
ããŒã¯ãŒããããŒã¯ããŸããã ããã¬ã€ã€ãŒãæµã®ç³ãæãŸããããšãã§ããããšã¯ã©ãããæå³ã§ããïŒ å¯ŸæŠçžæã®ããŒãã«
Nåã®ããŒã¹ââãããå ŽåããŸãã«ãã®åæ°ãåã ãŒããè€è£œããå¿
èŠãããããè¡ãã®æ§ç¯ã«ã€ãªãããŸãã ãããã®åãã¯ãæ®åœ±ããæ°åã ããç°ãªããŸãïŒ
Zillions of Gamesã§ã¯ããŸãã«
ãããè¡ãããŠããŸãã ãããŠãããã¯ã²ãŒã ã®å®è£
ãæ³åã絶ããã»ã©è€éã«ããŸãïŒ ãããããŸã ãé£ã¶ãç³ã®ã«ãŒã«ããããŸã...
å¥ã®è§£æ±ºçããããŸãã ç§ãã¡ã¯
1ã€ã®åãã圢æããããšãã§ããããã«æœåšçãªæç²ã®ãã¹ãŠã®äœçœ®ããªã¹ãããŸãã ãã¡ãããããã¯ç§ãã¡ã
ãã¹ãŠã§ã¯ãªãããã¹ãŠã®ç³ãåãããšãæå³ããŸããïŒ ãªã¹ããããŠãããã®ã®1ã€ã ããååŸãããŸãã ã³ãŒã¹ã¯é決å®è«çã«ãªããŸãã ã ãŒãã¡ã³ãã§ãåãã§ãã ãé£ãã§ãããç³ããåããäœãããšãã§ããå Žåãçµæã¯æµã®ãã£ã®ã¥ã¢ã«ãã£ãŠå ããããäœçœ®ã®ã»ããã§çµæãšããŠçãããã¹ãŠã®åãã®ãã«ã«ãç©ã§ãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã®ãããªåãã«å¯Ÿå¿ã§ããè¯ã
æ¹æ³ãæãã€ããŸããããAIãããã«ã¯é©çšã§ããŸããïŒ AIã¯å³å¯ã«æ±ºå®è«çãªåããåããªããã°ãªããŸããïŒ ããã¯ãé決å®è«çãªåãã決å®è«ã«å€ããã¡ã«ããºã ããªããã°ãªããªãããšãæå³ããŸãã
ããã¯ç§ããã€ãŠæžãããã®ã®æåã®ããŒãžã§ã³ã§ã var getIx = function(x, ix, mx) { if (ix > x.length) { x = []; return null; } if (ix == x.length) { c.push(0); return 0; } var r = x[ix]; if (r >= mx) { if (ix + 1 >= x.length) { x = []; return null; } for (var i = 0; i <= ix; i++) { x[ix] = 0; } x[ix + 1]++; } return r; } ZrfMove.prototype.determinate = function() { var r = []; for (var x = [0]; x.length > 0; x[0]++) { var m = Model.Game.createMove(); var ix = 0; for (var i in this.actions) { var k = 0; var fp = this.actions[i][0]; if (fp !== null) { k = getIx(x, ix++, fp.length); if (k === null) { break; } fp = [ fp[k] ]; } var tp = this.actions[i][1]; if (tp !== null) { k = getIx(x, ix++, tp.length); if (k === null) { break; } tp = [ tp[k] ]; } var pc = this.actions[i][2]; if (pc !== null) { k = getIx(x, ix++, pc.length); if (k === null) { break; } pc = [ pc[k] ]; } var pn = this.actions[i][3]; m.actions.push([fp, tp, pc, pn]); } r.push(m); } return r; }
å®å
šã«ç解äžèœã§çµ¶å¯Ÿã«ãµããŒããããŠããªã60è¡ã®ã³ãŒãïŒ ããããåäœããŸããïŒ ç§ã¯ããããã¹ãããŠããŸããã
代ããã«ãæžãçŽããŸãã ZrfMove.prototype.getControlList = function() { return _.chain(this.actions) .map(function (action) { return _.chain(_.range(3)) .map(function (ix) { if (action[ix] === null) { return 0; } else { return action[ix].length; } }) .filter(function (n) { return n > 1; }) .value(); }) .flatten() .map(function (n) { return _.range(n); }) .cartesian() .value(); } ZrfMove.prototype.determinate = function() { var c = this.getControlList(); if (c.length > 1) { return _.chain(c) .map(function (l) { var r = new ZrfMove(); var pos = 0; _.each(this.actions, function (action) { var x = []; _.each(_.range(3), function (ix) { pos = pushItem(this, action[ix], l, pos); }, x); x.push(action[3]); if (isValidAction(x)) { this.actions.push(x); } }, r); return r; }, this) .filter(isValidMove) .value(); } else { return [ this ]; } }
ã³ãŒãã¯é·ããªã£ãŠãããäžèŠãããšãããç解ããããããã«ã¯èŠããŸããã ããããããã詳ããèŠãŠã¿ãŸãããã å§ããããã«ãåé¡ãç解ããŠã¿ãŸãããã ã³ãŒã¹ã®èª¬æïŒ
ZrfMove ïŒã¯äžé£ã®ã¢ã¯ã·ã§ã³ïŒ
actions ïŒã§æ§æãããå
ã¢ã¯ã·ã§ã³ã¯4ã€ã®èŠçŽ ã®ã¿ãã«ã§ãïŒ
- éå§äœçœ®ïŒ from ïŒ
- çµäºäœçœ®ïŒ ã ïŒ
- å³ïŒ ããŒã¹ ïŒ
- éšåã¹ãããŒã¯æ°ïŒ num ïŒ
ãã«ã§ã¯å³åœ¢ã®å€æã¯è¡ããããè€å移åã¯äœ¿çšãããªãããããããã®å€ã®æåã®2ã€ã ããéèŠã§ãã å®è¡ãããã¢ã¯ã·ã§ã³ã説æããã«ã¯ååã§ãã
- ããŒãã«ããŒã¹ãè¿œå ïŒãªã»ããïŒ -from == null && toïŒ= Null
- 圢ç¶ã®åé€ïŒãã£ããã£ïŒ -fromïŒ= Null && to == null
- å³åœ¢ã®ç§»å-fromïŒ= Null && toïŒ= Null && fromïŒ= To
ããããããã¯æŠãã®ååã«éããŸããïŒ å®éã
fromãš
toã®äž¡æ¹ïŒãããŠãããã«ã€ããŠã§ã¯ãªãã
ããŒã¹ã§ããããŸãïŒãé
åã§ãïŒ ç§»åã決å®çã§ããå Žåããããã®åé
åã«ã¯èŠçŽ ã1ã€ã ãå«ãŸããŸãã ãããã®ããããã«ãããå€ãã®å€ãååšãããšããããšã¯ãéžæã®å¯èœæ§ãæå³ããŸãïŒãããåŠçããå¿
èŠããããŸãïŒã
é決å®çã¹ãããŒã¯ var m = [ [ [0], [1, 2] ], [ [3, 4, 5], null ] ];
äœçœ®
0ãã2ã€ã®äœçœ®ïŒ
1ãŸãã¯
2 ïŒã®ãããããžã®ãã£ã®ã¥ã¢ã®ç§»åãšãäœçœ®
3ã4ãŸãã¯
5ããã®1ã€ã®æµã®ãã£ã®ã¥ã¢ã®ãã£ããã£ããããŸãã ãŸãããã¹ãŠã®ãé決å®çãäœçœ®ïŒè€æ°ã®èŠçŽ ãå«ãïŒã®ãµã€ãºãéžæã§ããŸãã
ã³ãŒã m = _.map(m, function(action) { return _.chain(_.range(2)) .map(function (ix) { if (action[ix] === null) { return 0; } else { return action[ix].length; } }) .filter(function (n) { return n > 1; }) .value(); });
ãã®é
åã¯ãå¹³æ»åããããåŸãåæ°å€ãç¯å²ã«å€æããŸãã
ã³ãŒã
m = _.chainïŒmïŒ
.flattenïŒïŒ
.mapïŒé¢æ°ïŒnïŒ{return _.rangeïŒnïŒ;}ïŒ
.valueïŒïŒ;
çµæ m == [ [0, 1], [0, 1, 2] ]
ããã§ãåºæ¬çãª
Underscore.jsæ§æã§ã¯æäŸãããŠããªãæäœãå¿
èŠã§ãã
ãã«ã«ãç©ã®ãããªãã®ã å¿é
ããå¿
èŠã¯ãããŸããã
èªåã§æžã㊠var cartesian = function(r, prefix, arr) { if (arr.length > 0) { _.each(_.first(arr), function (n) { var x = _.clone(prefix); x.push(n); cartesian(r, x, _.rest(arr)); }); } else { r.push(prefix); } }
Underscore.jsã«åã蟌ã¿ãŸã _.mixin({ cartesian: function(x) { var r = []; cartesian(r, [], x); return r; } });
ç§ã®æ±ºå®ã¯å®å
šã«ãã³ãŒã·ã£ãã§ã¯ãªãããšãèªããŸãã 誰ããããè¯ãæ¹æ³ãç¥ã£ãŠãããªããã³ã¡ã³ãã«æžããŠãã ããã é©çšããŠãã ããïŒ
ã³ãŒã _.chain(m) .map(function(action) { return _.chain(_.range(2)) .map(function (ix) { if (action[ix] === null) { return 0; } else { return action[ix].length; } }) .filter(function (n) { return n > 1; }) .value(); }) .flatten() .map(function (n) { return _.range(n); }) .cartesian() .value();
çµæ [ [0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2] ]
æ®ãã®ã¿ã¹ã¯ã¯å°ãè€éã§ãã æ¢åã®ãããŒãããã«åŸã£ãŠãã¹ãããŒã¯ã®åæããŒãžã§ã³ãããé決å®çãäœçœ®ãéžæããå¿
èŠããããŸãã ç§ã¯ããã§èªè
ãæ©ãŸããŸãããã¿ã¹ã¯ã¯çŽç²ã«æè¡çã§ãã æãéèŠãªããšã¯ãæ©èœçãªã¢ãããŒãã䜿çšããããšã§ãããªãè€éãªã¿ã¹ã¯ãåå¥ã«è§£æ±ºããã³ãããã°ã§ããéšåã«åå²ã§ããããšã§ãã
ãã¡ãããæ©èœçãªã¢ãããŒãã®äœ¿çšã¯ããã®ãããªããºã«ã®è§£æ±ºçãšåžžã«é¢é£ä»ããããŠããããã§ã¯ãããŸããã éåžžããã¹ãŠãããã¶ãåçŽã§ãã å
žåçãªäŸãšããŠã
maximal-capturesã¢ãžã¥ãŒã«ãæããããšãã§ããŸãããã®ã¢ãžã¥ãŒã«ã¯ãZillions of Gamesããç¶æ¿ããããªãã·ã§ã³ãå®è£
ãããã©ãããã¡ããªã®ã²ãŒã ã§æ倧æ°ã®ããŒã¹ãååŸãããããã«ããŸãã
ã ã£ã Model.Game.PostActions = function(board) { PostActions(board); if (mode !== 0) { var moves = []; var mx = 0; var mk = 0; for (var i in board.moves) { var vl = 0; var kv = 0; for (var j in board.moves[i].actions) { var fp = board.moves[i].actions[j][0]; var tp = board.moves[i].actions[j][1]; if (tp === null) { var piece = board.getPiece(fp[0]); if (piece !== null) { if (piece.type > 0) { kv++; } vl++; } } } if (vl > mx) { mx = vl; } if (kv > mk) { mk = kv; } } for (var i in board.moves) { var vl = 0; var kv = 0; for (var j in board.moves[i].actions) { var fp = board.moves[i].actions[j][0]; var tp = board.moves[i].actions[j][1]; if (tp === null) { var piece = board.getPiece(fp[0]); if (piece !== null) { if (piece.type > 0) { kv++; } vl++; } } } if ((mode === 2) && (mk > 0)) { if (kv == mk) { moves.push(board.moves[i]); } } else { if (vl == mx) { moves.push(board.moves[i]); } } } board.moves = moves; } }
...ãããŠãããªã£ã Model.Game.PostActions = function(board) { PostActions(board); var captures = function(move) { return _.chain(move.actions) .filter(function(action) { return (action[0] !== null) && (action[1] === null); }) .map(function(action) { return board.getPiece(action[0]); }) .compact() .map(function(piece) { return piece.type; }) .countBy(function(type) { return (type === 0) ? "Mans" : "Kings"; }) .defaults({ Mans: 0, Kings: 0 }) .value(); }; if (mode !== 0) { var caps = _.map(board.moves, captures); var all = _.chain(caps) .map(function(captured) { return captured.Mans + captured.Kings; }) .max() .value(); var kings = _.chain(caps) .map(function(captured) { return captured.Kings; }) .max() .value(); board.moves = _.chain(board.moves) .filter(function(move) { var c = captures(move); if ((mode === 2) && (kings > 0)) { return c.Kings >= kings; } else { return c.Mans + c.Kings >= all; } }) .value(); } }
äž¡æ¹ã®ãªãã·ã§ã³ã¯éåžžã«ããŸãæ©èœããŸãïŒã³ãŒãã¯ãªãã¡ã¯ã¿ãªã³ã°æã«ãã¹ãã§ãã§ã«ã«ããŒãããŠããŸããïŒããæ©èœããŒãžã§ã³ã¯çããç解ãããããçµ±åãããã¯ããçµã¿ç«ãŠãããŸãã ãããç¶æããããšã¯ç¢ºãã«ã¯ããã«ç°¡åã§ãã
èšäºã®çµè«ãšããŠãç§ã®ä»äºã§åŸãããšããããã€ãã®ååãè¡šæããããšæããŸãã 決ããŠãããããæ矩ãäœãããã¯ãããŸãããã圌ãã¯ç§ãå©ããŸãã
ç·ã®ãªãæ¥ã§ã¯ãªããããžã§ã¯ãã®äœæ¥ãäžæããªãã§ãã ããïŒ ãããã«ãããã©ã®ãããã®éã äŒæ©ãé·ããã°é·ãã»ã©ãä»äºã«æ»ãã®ãé£ãããªããŸãã æ¯æ¥ããã°ãäœæ¥ã«ãããæéãšåŽåã¯ã¯ããã«å°ãªããªããŸãã å°ãªããšãå°ãïŒ ããã¯ãã³ãŒãããçµã蟌ããªããããšããç§ã¯ã§ããªãããšããããšãæå³ããŸããïŒãã°ããã®éãçãå°œããŸãïŒã ãããžã§ã¯ããè€éã§èå³æ·±ãå Žåã¯ãåžžã«æ°åã§ä»äºãèŠã€ããããšãã§ããŸãã
æã®ã³ãŒããå€ã®ãã¹ãã¯ããã¯ããç§ã¯ç¥ã£ãŠããŸããããã¯
TDDæ¹æ³è«ã«å®å
šã«åããŸãã ãããã誰ãç§ãããã«åºå·ãããšèšã£ãã®ã§ããïŒ
ãŠããããã¹ãã¯ãæåç·ã«çœ®ããªããŠãïŒéåžžã«ïŒäŸ¿å©ã§ãïŒ åçŽãªã³ãŒãã§ãè€éãªã³ãŒãã§ããå¯èœãªéããã¹ãã§ã«ããŒããå¿
èŠããããŸãã ãã®å ŽåãåçŽãªæ©èœããè€éãªæ©èœã«ç§»è¡ãããããæ§ç¯ãããŠããæ©èœã®æäœæ§ã«çãã®äœå°ããªãå Žåã¯ãããè€éãªæ©èœããã¹ãããããšãæãŸããã§ãã ãã¹ãã¯ãé¢é£æ§ã倱ããããŸã§åé€ããªãã§ãã ããïŒ ããã©ããããããŸããŸãªç°å¢ã§ã§ããã ãé »ç¹ã«å®è¡ããå¿
èŠããããŸãã ãã®ããã«ããŠãããã€ãã®éåžžã«éèŠãªé倧ãªééããèŠã€ããŸããïŒ
害ãåãŒããªãå€æŽã«ãã£ãŠããã§ã«ãã¹ãã§ã«ããŒãããŠããã³ãŒããå£ããŠã¯ãããŸããïŒ å£ãããã¹ãã§ã³ãŒããã³ãããããå¿
èŠã¯ãããŸããã ããšããã®ã³ãŒãã«çµæ¥åãçµãã ãšããŠãïŒ ããã§ã®åé¡ã«å¯ŸåŠããã®ã«éåžžã«ç²ããŠããŠãïŒ åäœããªãã³ãŒãã¯ãŽãã§ãã ããã¯ãã€ã§ãççºããç匟ã§ãïŒ ããã«å¯ŸåŠãã匷ãããªããã°ããããå®å
šã«åé€ããå床æžãçŽãããšããå§ãããŸãã
ãããããªãã³ãŒããäœåºŠãæžãæããããšãæããªãã§ãã ããïŒ å°ãã®ãªãã¡ã¯ã¿ãªã³ã°ããŸãã¯ãããžã§ã¯ãã®å®å
šãªæžãçŽãããã-ããã¯ãããã¯ã®çç±ã§ã¯ãããŸããïŒ ããã¯åé¡ãããè¯ã解決ããæ©äŒã§ãã
æ£çŽã«åãŠãªããªãããã åãŠè¯ãã³ãŒãã¯åé¡ã解決ããŸãã åªããã³ãŒãã¯ç解å¯èœã§ãããä¿å®å¯èœã§ãã ããã ãã§ãïŒ
OOP ã
FPããŸãã¯ä»ã®äœãã®ã€ããªãã®ãŒã®äžã§ããããåããããããã«è£è¿ãå¿
èŠã¯ãããŸããïŒ èšèªãŸãã¯ãã®ç°å¢ã®ããã€ãã®æ©èœã䜿çšããŠããã¡ãã·ã§ã³ã«ã€ããŠã§ã¯ãªãããããžã§ã¯ãã«å¯Ÿãããããã®ãæ©èœãã®æçšæ§ã«ã€ããŠã®ã¿èããå¿
èŠããããŸãã ããªãã¯ãŸã ãã¡ãã·ã§ã³ã«è¿œãã€ãããšãã§ããŸããïŒ
ãã¡ãããç§ã«ã¯ãŸã æé·ããäœå°ããããŸãã ç§ã¯ãããåé¡ãšã¯æããªãã èšèªã«å¯Ÿããç§ã®ç解ã¯å€ããã€ã€ããïŒããè¯ããã®ã«ãªãããšãé¡ã£ãŠããŸãïŒãããã«äŒŽãã³ãŒããå€ãããŸãã åäœãã¹ãã¯ãããå©ããŠãããŸãã