OpenCV のテンプレートマッチングを使ってぷよを識別する2

Uncategorized
579 words

ガッーっと、何も考えずに作ってしまったので、ソースがスパゲッティ状になってしまいました。

リファクタリングしながら、機能追加をしていたので、今回は鈍足になります。

申し訳ないです!!

今回の目標

上下左右に繋がっている、同じ色のぷよを数える処理を作りました。

こんな感じに、繋がっているぷよを数えれるようにしました。

同じ色のぷよを数えた結果

前回

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

ソースコード