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

同じ色のぷよを数えた結果 アプリ開発

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

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

申し訳ないです!!

今回の目標

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

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

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

前回

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;
}

終わりに

次回こそは、最善の一手を探し出すアルゴリズムを仕上げたいと思います。

出来るかな。。。

GitHub

ソースコード

タイトルとURLをコピーしました