前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
実際に解析を行うクラスを作成していきます。
まずは解析中の状態を保持するクラスを定義します。
class BitmapData
{
public int Row { get; }
public int Col { get; }
// 塗るで確定
private bool _isPaint;
// 塗らないで確定
private bool _isFilter;
public BitmapData(int row, int col)
{
Row = row;
Col = col;
_isPaint = false;
_isFilter = false;
}
public bool IsPainted()
{
return _isPaint;
}
public bool IsFilted()
{
return _isFilter;
}
public bool IsValid()
{
if(_isPaint | _isFilter)
{
return true;
}
else
{
return false;
}
}
}
多分、解析に必要なデータは、塗ったマスか、塗ることができないマスか、まだ確定していないマスか、の三つが必要になると思います。
なので、それらの状態を保持し返す事ができるメソッドを一通り用意してみました。
とりあえず、これでいいや。
必要になったら、その都度追加していく。
これを使用します。
class PicrossAnalyze
{
List<List<int>> rowNumbers;
List<List<int>> cowNumbers;
BitmapData[,] _bitmapData;
public PicrossAnalyze(List<List<NumberSquare>> rowNumberSquares, List<List<NumberSquare>> colNumberSquares)
{
_bitmapData = new BitmapData[rowNumberSquares.Count, colNumberSquares.Count];
for(int r = 0; r < rowNumberSquares.Count; r++)
{
for(int c = 0; c < colNumberSquares.Count; c++)
{
_bitmapData[r, c] = new BitmapData(r, c);
}
}
rowNumbers = new List<List<int>>();
foreach(var rowList in rowNumberSquares)
{
List<int> list = new List<int>();
foreach(var s in rowList)
{
list.Add(s.GetValue());
}
rowNumbers.Add(list);
}
cowNumbers = new List<List<int>>();
foreach (var colList in colNumberSquares)
{
List<int> list = new List<int>();
foreach (var s in colList)
{
list.Add(s.GetValue());
}
cowNumbers.Add(list);
}
}
public bool[,] Run()
{
// モック
bool[,] ret = new bool[10, 10] {
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true },
{true, false, true, false, true, true, false, true, false, true }
};
return ret;
}
}
コンストラクタで必要なデータを渡し、必要なデータを取り出します。
とりあえず、この処理はここまで。
先に解析結果をUIに反映させる処理を書きましょう。
表示するデータは、とりあえず固定値を返すモックにしておきます。
これをUI側に実装します。
anlyzeButton.SetAction(() =>
{
PicrossAnalyze picross = new PicrossAnalyze(rowNumberSquare, colNumberSquare);
bool[,] ret = picross.Run();
for(int row = 0; row < rowNumberSquare.Count; row++)
{
for(int col = 0; col < colNumberSquare.Count; col++)
{
if(ret[row,col] == true)
{
drawSquares[row][col].Paint();
}
}
}
});
実行結果はこんな感じになります。
解析状況を可視化しなければ、解析処理を作成するのに困るので、先にこちらの処理を作成した、と言うわけです。
次回は実際に問題データを入力して、簡単なロジックから作成していきましょう。