第6講 数独自動生成アプリVer.1の開発
第6話 ハイブリッドにするための考え方
ハイブリッドを実現するためにはいくつか課題があります。
ヒント数が多いときの手順をもう一度確認しますと、
①ヒント数0数独の解答を作る
②解答から問題に配置する以外のセルは0(空欄)に戻すことのよって問題を作成する
③②で作った問題を再び解き直して、唯一解であるときのみにシートに吐き出す。
ということになります。
第5話ではonとoffの2段階しかありませんでしたから、
onoffというグローバル変数を用意しましたが、
①②③に対応して3段階になりますので、
変数名をmdに変更して、関連するコードを
If md = 0 Then
If g + 1 < hnt Then
f (g + 1)
If cn = 1 Then Exit Sub
Else
cn = cn + 1
If cn = 1 Then Exit Sub
End If
End If
If md = 2 Then
If g + 1 < n * n Then
f (g + 1)
If cn = 1 Then Exit Sub
Else
cn = cn + 1
If cn = 1 Then Exit Sub
End If
End If
If md = 1 Then
If g + 1 < n * n Then
f (g + 1)
If cn = 2 Then Exit Sub
Else
cn = cn + 1
If cn = 1 Then
For j = 0 To n - 1
For k = 0 To n - 1
cm(j, k) = m(j, k)
Next
Next
End If
If cn = 2 Then Exit Sub
End If
End If
とします。
①は
md = 2
f (0)
としてクリアします。
②と③にも克服すべき課題があります。
まず、dainyuは2重に変更する必要があります。
コピー元はシートのB4からJ12のセルではなく、
cm(?, ?)です。
dainyuの最初にm(i, j)は0に初期化してありますので、
問題配置のところだけを代入すればよいのです。
そのために代入の部分は1次元For文となります。
cm(?, ?)の?を適切なものにして代入してください。
気をつけなければならない点は、
md = 2
f (0)
によって、
Do While 1
Select Case ty
Case 0
hitaisyou
Case 1
retutaisyou
Case 2
gyoutaisyou
Case 3
tentaisyou
End Select
の色のついている部分で作った座標が壊されていますので、
座標を復元する必要があります。
座標が壊されてしまうのは、
Sub f(g As Byte)
Dim i As Byte, j As Byte, k As Byte, h As Byte, w As Byte
Dim y As Byte, x As Byte, yy As Byte, xx As Byte, ii As Byte, iii As Byte
Dim hg(8) As Byte, hr(8) As Byte, hb(8) As Byte
If onoff = 1 Then nyuryokujyun (g)
があるためです。
nyuryokujyun (g)で新に座標が作り直されてしまうからです。
問題配置は一切無視して最も早く解ける方法で座標をつくることがnyuryokujyun (g)の任務であるからです。
座標を復元ためには、
md = 2
f (0)
で座標が壊される前に座標の複写をしておくことが必要となりますので、
Dim ciz(80) As Byte, cjz(80) As Byte
といったグローバル配列を用意しておくとよいでしょう。
壊される前に複写して、そこから座標を復元するのです。
もちろん、ヒント数が27以下のときと28以上の場合分けが必要になります。
さあ、皆さん数独自動生成アプリVer.1を完成させましょう。