LoginSignup
0
0

More than 5 years have passed since last update.

JVMに数独を解いてもらう

Last updated at Posted at 2019-02-01

前書き

このページは、JavaFXとか使って手探り開発した時のメモの続編のようなもので、あちらを表示に寄った記事にし、こちらを内容に寄った記事にしようというものである。
正直、クラスの設計とかでかなり無駄が多かったので、NumberPlaceSolver 2.0を始動するにあたって記事を新しくした、というくらいの話。
表示についてはガッツリ排除した。
以前の仕様はこちらには書かないので、元記事を読んでいただきたい。

作ろうとしてるもの

数独解いてくれるモノ。学校の自由課題にて。

環境その他

Java(8) ...はある程度学習済み(使用経験は浅い)
IDEとして、講師オヌヌメのintelliJIDEA(ver.3.2)最近アプデが入って若干UIとか変わった模様。リファクタ機能が強すぎて、こないだeclipse使ったらいろんなところかゆかった。

いくつかの簡単な対応について

  • FXMLで指定したfx:idはControllerでは@FXMLを直前で指定しないと怒られる。delimiter単位でつけないとやっぱり怒られる。
  • 配列xに、配列yをx=yみたいにして渡すと(仮称)参照値渡し(後述)となる。xとyは同じオブジェクトを指す名前となる。
    • 新しい別のオブジェクトとして扱いたい場合はcloneメソッドを使用して、x=y.clone()とする。
    • この問題はString型の同一の文字列を格納した別のオブジェクトを条件演算子==で結ぶ(すなわち、str==new String(str))と、オブジェクトの参照値を比較するために、falseが返されることを連想させる。ただしString型自体が若干特殊な仕様を含んでいるようなので、取り扱いに注意すべきか。
  • 数独では行と列のほかに、3x3のsubRegionでも重複を禁じている。この3x3のグループを順番に追う式を書いた。
for (int i = 0; i < 9; i++) for (int j = 0; j < 9; j++) {
  int idev3= i/3 , jdev3= j/3 ;

  int x= idev3 * 3 + jdev3 ,
      y= i % 3 * 3 + j % 3 ;

  subRegion[x][y] = cell[i][j]
//  逆関数が同様の式になる(名前忘れた)ので、[i][j]と[x][y]は逆にしても目的を果たす。
//  subRegion[i][j] = cell[x][y];
}
  • 二次元配列x = new Object[i][j]のlength`について。
    • x.lengthi
    • x[0].lengthj。ただしもしi==0ならば、ArrayIndexOutOfBoundsExceptionを吐く。

共有データを操作させるにあたって

Javaでは、C言語でいうところのポインタを、「参照変数」とか「参照値」とか呼ぶっぽい。

各リージョンに参照値を納めさせて、テーブル一個分のセルのデータ群だけで処理ができるようにしたい。
つまり、リージョンからの操作で、テーブルに存在するセルのデータも変更されるようにしたい。

以下はつたないイメージ図

Cell Region image

各クラスの設計説明の前書き

冒頭でも書いたし、内容読めばわかる人にはわかるでしょうし、プロフにも書いたはずなのでわかるとは思いますが、

わたくし、バリバリの初心者にござる。
何やるにしても拙いものになると思いますので、どうかご容赦を。(批判とか改善策とかのコメントは歓迎いたします。)
同輩の初学者様がたも、こんなの参考にしちゃダメです。参考にするにしても、教育者の意見をもらってからにしましょう。


元記事の同じ場所から後ろは、できれば失敗談として、あるいは比較対象として、
読んでほしくない(読まなくてもわかるように書いていきたい(願望))

ここまで、元記事と同じとはいえ必須と思われる部分。

これからの方針

既に書いた設計を基に、改善したものを作成する。

盛り込みたいこと

  • クラス設計見直し : 無駄と思われるメソッドの削除等。
  • 複数スレッドで仮置き : 仮置き処理を複数スレッドですることで、処理スピードを底上げ
  • 全体のデータを管理するstatic Boardを用意 :「denyされた」情報を全スレッドで共有化
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0