前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/sudokuGUI
やることの三つ目を解決します。
今のままでは、入力データが不完全な状態で解析ボタンを押してしまうと、アプリが固まってしまいます。
原因は、仮置きロジックの再起処理が無限に実行されてしまっているようです。
なので、仮置きロジックが一定回数呼ばれたら失敗として処理終了させてしまいましょう。
class Sudoku
{
private Square[,] _square;
private int kariokiCount = 0;
private Square doKarioki(Square[,] squares)
{
Square ret = null;
List<Square> kariokiList = searchKariokiSquare(squares);
kariokiCount++;
if(kariokiCount >= 100)
{
return null;
}
続いて、エラーを表示させる処理を追加します。
エラーは新しいオブジェクトを画面に追加して表示させます。
なので、フォントデータも作り直しです。
class Message : ObjectBase
{
private string _text;
private const int fontOffsetX = 0;
private const int fontOffsetY = 0;
public Message(int x, int y, string text)
{
width = 256;
height = 64;
_x = x;
_y = y;
_text = text;
_backTexture = new asd.TextureObject2D();
_backTexture.Position = new asd.Vector2DF(_x, _y);
_valueText = new asd.TextObject2D();
_valueText.Text = _text;
_valueText.Font = Resource.getTextFont();
_valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
}
public void show()
{
_valueText.Text = _text;
}
public void hide()
{
_valueText.Text = "";
}
}
テクスチャーは使わないので、書かなくても良かったんですけどね。
// メッセージ
Message message = new Message(10, 640, "解析に失敗しました");
asd.Engine.AddObject2D(message.getTextObject());
message.hide();
こんな感じでAltseedエンジンにテキストを追加します。
最後に、このメッセージの表示をON/OFFする処理を追加します。
class Button : ObjectBase
{
public virtual void onClick(SquareObject[,] squareObjects, Message message)
class AnalyzeButton : Button
{
public override void onClick(SquareObject[,] squareObjects, Message message)
{
if(enable == false)
{
return;
}
Square[,] squares = new Square[9, 9];
for (int row = 0; row < 9; row++)
{
for (int col = 0; col < 9; col++)
{
squares[row, col] = new Square(squareObjects[row, col].getValue(), row, col);
}
}
Sudoku sudoku = new Sudoku(squares);
var ret = sudoku.run();
if(ret == null)
{
message.show();
return;
}
for (int row = 0; row < 9; row++)
{
for (int col = 0; col < 9; col++)
{
squareObjects[row, col].setValue(ret[row, col].GetValue());
}
}
}
}
class ClearButton : Button
{
public override void onClick(SquareObject[,] squareObjects, Message message)
{
message.hide();
for (int row = 0; row < 9; row++)
{
for (int col = 0; col < 9; col++)
{
squareObjects[row, col].setValue(0);
}
}
}
}
bool isButtonClisk = false;
foreach (Button button in buttons)
{
if (button.isClick(pos))
{
button.onClick(squareObjects, message);
isButtonClisk = true;
}
}
実装に悩みましたが、onClickにmessageオブジェクトを渡すことで対応させました。
もっとスマートな方法があると思うんですが、次回の開発までの課題にします。
たぶん、ほぼほぼこれで完成だと思います。