まぁいろいろありましたが、数独解析ツールが完成しましたので、ご報告いたします。
ダウンロードはこちら(gitHub)
https://github.com/takishita2nd/sudokuGUI/releases/tag/1.02
zipファイルを解凍してsudokuGUI.exeを実行してください。
操作はマウスでクリックするだけなのでわかりやすくなっていると思います。
何かありましたらコメントください。
あと、ネタもください。
まぁいろいろありましたが、数独解析ツールが完成しましたので、ご報告いたします。
ダウンロードはこちら(gitHub)
https://github.com/takishita2nd/sudokuGUI/releases/tag/1.02
zipファイルを解凍してsudokuGUI.exeを実行してください。
操作はマウスでクリックするだけなのでわかりやすくなっていると思います。
何かありましたらコメントください。
あと、ネタもください。
前回までの状況はこちら。
最新ソースはこちら(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オブジェクトを渡すことで対応させました。
もっとスマートな方法があると思うんですが、次回の開発までの課題にします。
たぶん、ほぼほぼこれで完成だと思います。
買いました。
Raspberry Pi 4 Model B 2GB RAM。
これの一個前がRaspberry Pi 2 Model Bだったから、それより大幅なパワーアップです。
メモリもプロセッサーも強化されていますが、わかりやすいところで言うと、
HDMIポート1個から、Micro HDMIのポート2つになりました。
4K出力もできるみたいよぉ。
Micro HDMI対応のケーブルなんてほとんど出回っていないので、本体と一緒に注文しました。
Micro HDMI – HDMIのケーブルです。
これが無いと、ディスプレイに画面を表示できません。
そして、もう一つ、左側にあるのが電源です。
端子はUSB-Cなのですが、これを動かすのに3Aの出力が必要なので、一般に出回っているUSB-Cケーブルでは動きません。
これも本体と同時に対応電源を注文しました。
あとは、ストレージとなるMicro SDカード。
これだけでこのラズパイは動かせるのですが、ついでなので、もうちょっと遊べるパーツを買いました。
このボードに温度計、湿度計などなど、あと右下にジョイスティック、8×8のLEDディスプレイが付いているパーツです。
ラズパイ4でも動くはず。
さあ、セットアップするぞ。
この一式はこちらのサイトで購入しました。
https://raspberry-pi.ksyic.com