ガッーっと、何も考えずに作ってしまったので、ソースがスパゲッティ状になってしまいました。
リファクタリングしながら、機能追加をしていたので、今回は鈍足になります。
申し訳ないです!!
今回の目標
上下左右に繋がっている、同じ色のぷよを数える処理を作りました。
こんな感じに、繋がっているぷよを数えれるようにしました。
前回
OpenCV のテンプレートマッチングを使ってぷよを識別する1
環境
- Windows 10 Home 20H2
- Visual Studio 2019
処理
呼び出し元はこんな感じですね。
引数の Array で 横8x縦6 の色情報が渡ってきます。
あとは、1マスずつ再帰関数の SearchConnectedPuyos に渡して、繋がっているぷよの数を数えていく処理になってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| private Puyo[,] getConnectCount(Puyo[,] cellsArray) { // 配列コピー var array = ArrayCopy(cellsArray); for (var x = 0; x < COLS; x++) { for (var y = 0; y < ROWS; y++) { var puyo = GetPuyo(array, new Position(x, y)); // 自分のマスにぷよがいるか? if (puyo.Color == PuyoColor.None) continue; // 繋がったぷよを探す var connectedPuyos = SearchConnectedPuyos(array, new List<Position>() { new Position(x, y) }); puyo.Count = connectedPuyos.Count; } } return array; }
|
こっちが繋がっているぷよの数を数える再帰関数です。
自分の関数内から、同じ関数を呼ぶので再帰です。
アルゴリズムを考えながら作っていたので、スゴくグチャグチャしちゃってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| private List<Position> SearchConnectedPuyos(Puyo[,] array, List<Position> connectedPositions) { // 配列コピー var positions = ArrayCopy(connectedPositions); foreach (var position in SerchDirection) { // 前回探索位置取得 var oldPosition = connectedPositions.Last(); // 今回探索位置取得 var nowPosition = new Position(oldPosition.X + position.X, oldPosition.Y + position.Y); // ぷよがあるか? if (GetPuyo(array, nowPosition).Color == PuyoColor.None) continue; // 探索済みか? if (positions.Any(i => i.X == nowPosition.X && i.Y == nowPosition.Y)) continue; // 上下左右の同色ぷよを探す if (GetPuyo(array, oldPosition).Color == GetPuyo(array, nowPosition).Color) { // 同色の場合 positions.Add(nowPosition); // 再帰処理 var result = SearchConnectedPuyos(array, positions); foreach (var item in result) { // 未探索の場合、追加 if (!positions.Any(i => i.X == item.X && i.Y == item.Y)) positions.Add(item); } } } // 同色のぷよが見つからなかった場合、再帰処理を抜ける return positions; }
|
終わりに
次回こそは、最善の一手を探し出すアルゴリズムを仕上げたいと思います。
出来るかな。。。
GitHub
ソースコード