前回の状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/sudoku
前回はファイルからデータを取り出して、int型の二次元配列に取り込む、ということをしましたが、このままでは数独の解析は難しいでしょう。
なので、マス目一つ一つをオブジェクトとして、様々なデータを持つようにしたいと思います。
とりあえず、今考えているのは、
- 確定した値
- 確定したかどうか
- 候補となる数字
- etc…
とりあえず、これを実装してみたいと思います。
class Square
{
class Candidate
{
public bool value1;
public bool value2;
public bool value3;
public bool value4;
public bool value5;
public bool value6;
public bool value7;
public bool value8;
public bool value9;
public Candidate()
{
this.value1 = false;
this.value2 = false;
this.value3 = false;
this.value4 = false;
this.value5 = false;
this.value6 = false;
this.value7 = false;
this.value8 = false;
this.value9 = false;
}
}
// 確定した数字
private int _value;
// 確定したかどうか
private bool _confirmed;
// 候補の数字
private Candidate _candidate;
public Square()
{
this._value = 0;
this._confirmed = false;
this._candidate = new Candidate();
}
public Square(int val)
{
this._value = val;
if(val == 0)
{
this._confirmed = false;
}
else
{
this._confirmed = true;
}
this._candidate = new Candidate();
}
public int GetValue()
{
return this._value;
}
public void SetValue(int val)
{
this._value = val;
this._confirmed = true;
}
public bool isConfirmed()
{
return this._confirmed;
}
}
まずは、こんな感じでマス目のクラスSquareを定義しました。
これで完全とは思っていません。
今後も必要に応じて追加していきます。
これに、ファイルから取得したデータを設定します。
static class FileAccess
{
/**
* ファイルからデータを取得する
*/
public static Square[,] OpenFile(string filePath)
{
int[,] matrix = new int[9, 9];
// ファイルを開く
bool error = false;
using (var stream = new StreamReader(filePath))
{
int row = 0;
while (stream.EndOfStream == false)
{
string lineText = stream.ReadLine();
var val = lineText.Split(',');
int col = 0;
foreach (var v in val)
{
int i;
if (int.TryParse(v, out i))
{
matrix[row, col] = i;
}
else
{
error = true;
}
col++;
}
row++;
if (row > 9)
{
error = true;
}
}
}
if (error)
{
Console.WriteLine("Illegal format.");
return null;
}
Square[,] ret = new Square[9, 9];
for (int row = 0; row < 9; row++ )
{
for(int col = 0; col < 9; col++ )
{
Square sq = new Square(matrix[row, col]);
ret[row, col] = sq;
}
}
return ret;
}
// debug
public static void Output(Square[,] sq)
{
using (var stream = new StreamWriter(System.Environment.CurrentDirectory + "\\output"))
{
for (int row = 0; row < 9; row++)
{
for (int col = 0; col < 9; col++)
{
stream.Write(sq[row, col].GetValue());
}
stream.Write("\r\n");
}
}
}
}
前回のファイルリード、ライト処理をクラス化しました。やっていることに大きな変更はありません。
これで、Main関数もスッキリするはずです。
class Program
{
static void Main(string[] args)
{
// パラメータチェック
if (args.Length != 1)
{
Console.WriteLine("usage : sudoku.exe [input file]");
return;
}
// ファイルの存在を確認
string filePath = Environment.CurrentDirectory + "\\" + args[0];
if (File.Exists(filePath) == false)
{
Console.WriteLine("File not found.");
return;
}
var sq = FileAccess.OpenFile(filePath);
if(sq == null)
{
return;
}
// debug
FileAccess.Output(sq);
}
}
前回と同じ結果を取得することができました。
取り込みが美味く機能していることが言えます。
とりあえず、今日はここまで。
実際にロジックを考えてみます。
「【C#】【数独】マス目のデータをどう持つか、を考える。」への1件のフィードバック