ガッーっと、何も考えずに作ってしまったので、ソースがスパゲッティ状になってしまいました。
リファクタリングしながら、機能追加をしていたので、今回は鈍足になります。
申し訳ないです!!
今回の目標
上下左右に繋がっている、同じ色のぷよを数える処理を作りました。
こんな感じに、繋がっているぷよを数えれるようにしました。

前回
OpenCV のテンプレートマッチングを使ってぷよを識別する1
環境
- Windows 10 Home 20H2
- Visual Studio 2019
処理
呼び出し元はこんな感じですね。
引数の Array で 横8x縦6 の色情報が渡ってきます。
あとは、1マスずつ再帰関数の SearchConnectedPuyos に渡して、繋がっているぷよの数を数えていく処理になってます。
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;
}
こっちが繋がっているぷよの数を数える再帰関数です。
自分の関数内から、同じ関数を呼ぶので再帰です。
アルゴリズムを考えながら作っていたので、スゴくグチャグチャしちゃってます。
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;
}
終わりに
次回こそは、最善の一手を探し出すアルゴリズムを仕上げたいと思います。
出来るかな。。。