diff --git a/src-ui/js/list.js b/src-ui/js/list.js index ff20c042a..793eff91f 100644 --- a/src-ui/js/list.js +++ b/src-ui/js/list.js @@ -233,6 +233,7 @@ "kakuro", "sudoku", "fillomino", + "symmarea", "ripple", "akari", "shakashaka" diff --git a/src-ui/js/ui/KeyPopup.js b/src-ui/js/ui/KeyPopup.js index b955ec442..c20d5904e 100644 --- a/src-ui/js/ui/KeyPopup.js +++ b/src-ui/js/ui/KeyPopup.js @@ -73,6 +73,7 @@ ui.keypopup = { tateyoko: [10, 0], factors: [10, 10], fillomino: [10, 10], + symmarea: [10, 10], renban: [10, 10], ripple: [10, 10], cojun: [10, 10], diff --git a/src-ui/list.html b/src-ui/list.html index ed2940444..971f1019d 100644 --- a/src-ui/list.html +++ b/src-ui/list.html @@ -228,6 +228,7 @@

パズルの種類のリスト
  • +
  • diff --git a/src/puzzle/Config.js b/src/puzzle/Config.js index 94dd04f0a..4122585e2 100644 --- a/src/puzzle/Config.js +++ b/src/puzzle/Config.js @@ -357,7 +357,7 @@ exec = pid === "mashu"; break; case "forceallcell": - exec = pid === "fillomino"; + exec = pid === "fillomino" || pid === "symmarea"; break; case "dontpassallcell": exec = pid === "arukone"; diff --git a/src/pzpr/variety.js b/src/pzpr/variety.js index 73db9c0e2..6f4dbf0fa 100755 --- a/src/pzpr/variety.js +++ b/src/pzpr/variety.js @@ -286,6 +286,7 @@ sudoku: [0, 1, "数独", "Sudoku"], sukoro: [1, 0, "数コロ", "Sukoro", "sukoro"], sukororoom: [0, 0, "数コロ部屋", "Sukoro-room", "sukoro"], + symmarea: [0, 0, "シンメトリーエリア", "Symmetry Area", "fillomino"], tapa: [0, 0, "Tapa", "Tapa"], tasquare: [0, 0, "たすくえあ", "Tasquare"], tatamibari: [1, 0, "タタミバリ", "Tatamibari"], diff --git a/src/variety/fillomino.js b/src/variety/fillomino.js index 6768930df..4f874181b 100644 --- a/src/variety/fillomino.js +++ b/src/variety/fillomino.js @@ -7,7 +7,7 @@ } else { pzpr.classmgr.makeCustom(pidlist, classbase); } -})(["fillomino"], { +})(["fillomino", "symmarea"], { //--------------------------------------------------------- // マウス入力系 MouseEvent: { @@ -336,6 +336,7 @@ "checkSideAreaNumberSize", "checkLargeArea", "checkNumKinds", + "checkRoomSymm@symmarea", "checkNoNumArea", "checkNoNumCell_fillomino+" ], @@ -370,6 +371,23 @@ return area.numkind >= 1; }, "bkNoNum"); }, + checkRoomSymm: function() { + var board = this.board; + this.checkAllErrorRoom(function(area) { + var clist = area.clist, + d = clist.getRectSize(); + var sx = d.x1 + d.x2, + sy = d.y1 + d.y2; + for (var i = 0; i < clist.length; i++) { + var cell = clist[i], + cell2 = board.getc(sx - cell.bx, sy - cell.by); + if (cell2.nblk !== area) { + return false; + } + } + return true; + }, "bkNotSymmRoom"); + }, checkAllErrorRoom: function(evalfunc, code) { var rooms = this.board.numblkgraph.components; for (var id = 0; id < rooms.length; id++) { @@ -405,11 +423,15 @@ ], bkMixedNum: [ "1つのブロックに2種類以上の数字が入っています。", - "A room has two or more kinds of numbers." + "A block has two or more kinds of numbers." ], bsSameNum: [ "同じ数字のブロックが辺を共有しています。", "Adjacent blocks have the same number." + ], + bkNotSymmRoom: [ + "部屋の形が点対称ではありません。", + "The block is not point symmetric." ] } }); diff --git a/test/script/symmarea.js b/test/script/symmarea.js new file mode 100644 index 000000000..d8cbf51d6 --- /dev/null +++ b/test/script/symmarea.js @@ -0,0 +1,64 @@ +/* symmarea.js */ + +ui.debug.addDebugData("symmarea", { + url: "6/6/g1i1g6i82p53i5g1i4g", + failcheck: [ + [ + "bkSizeLt", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 1 8 /2 1 6 2 5 . /. 3 3 2 . 5 /. 4 4 4 . 1 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 1 0 /0 0 1 1 0 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 1 1 /1 1 1 0 0 0 /1 1 1 1 1 1 /" + ], + [ + "bsSameNum", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 1 /. 1 4 4 . 4 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 1 0 0 0 /0 1 0 1 0 0 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 1 /" + ], + [ + "bkSizeGt", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 2 5 . /. 3 3 2 . 5 /. 4 4 4 . 5 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 1 0 /0 0 1 1 0 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 0 0 0 /1 1 1 1 1 0 /" + ], + [ + "bkMixedNum", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 . 1 . 2 /. . 4 4 . 2 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 0 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 0 0 1 1 0 /" + ], + [ + "bkNoNum", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . . /. 4 4 4 . . /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 0 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /" + ], + [ + "ceNoNum", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . . . . . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 2 /. 4 4 4 . 2 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /" + ], + [ + "bkNotSymmRoom", + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 8 8 . /6 . 1 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 2 /. 4 4 4 . 2 /1 1 0 0 1 /0 1 1 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 1 0 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /" + ], + [ + null, + "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 2 /. 4 4 4 . 2 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /" + ] + ], + inputs: [ + /* 問題入力はbosanowaと同じなので省略 */ + /* 回答入力テスト */ + { input: ["newboard,4,2", "editmode", "cursor,1,1", "key,3", "playmode"] }, + { + input: ["mouse,right, 1,1, 5,1"], + result: + "pzprv3/symmarea/2/4/3 . . . /. . . . /. . . . /. . . . /-1 -1 0 /0 0 0 /0 0 0 0 /" + }, + { + input: ["mouse,left, 1,1, 5,1"], + result: + "pzprv3/symmarea/2/4/3 . . . /. . . . /. 3 3 . /. . . . /-1 -1 0 /0 0 0 /0 0 0 0 /" + }, + { + input: ["mouse,left, 7,1, 1,1"], + result: + "pzprv3/symmarea/2/4/3 . . . /. . . . /. . . . /. . . . /-1 -1 0 /0 0 0 /0 0 0 0 /" + }, + { + input: ["mouse,left, 2,0, 2,2, 0,2"], + result: + "pzprv3/symmarea/2/4/3 . . . /. . . . /. . . . /. . . . /2 -1 0 /0 0 0 /1 0 0 0 /" + } + ] +});