第5講 問題における数字の配置をいかにするか?
第5話 はじめの位置と飛びをランダムにする


 ①はじめる位置は0以上80以下のランダムな数字とする
 ②飛びも2以上78以下のランダムな数字とする
 ③ヒント数もシートから取得する
 ただし、②は81と互いに素でない場合が出てしまいますから、
 Do While文を永久ループにしておいて使い互いに素なときだけ、
 Do文を強制的に抜けるようにして問題を解消してください。
の解答例
'hntはヒント数、tbは飛び、iz(80)とjz(80)はそれぞれy座標とx座標
Dim hnt As Byte, iz(80) As Byte, jz(80) As Byte
Private Sub CommandButton1_Click()
  CommandButton2_Click
  hnt = Cells(4, 15)
  hitaisyou '非対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou() '非対称に配置する場合の座標作りと表示
  Dim i As Integer, a As Integer, w As Integer, tb As Integer, h As Byte
  w = Int(81 * Rnd) 'はじめの位置をランダムに取得
  Do While 1 '81と互いに素になるtbを自動的に探す。
    tb = Int(81 * Rnd)
    h = 1
    For i = 2 To tb
      If i * i > tb Then Exit For
      If (81 Mod i) = 0 Then
        If (tb Mod i) = 0 Then
          h = 0
          Exit For
        End If
      End If
    Next
    If h = 1 Then Exit Do
  Loop
  For i = 0 To hnt - 1
    a = (w + tb * i) Mod 81 'aはセル(箱)番号を表す変数
    iz(i) = Int(a / 9)
    jz(i) = a Mod 9
    Cells(4 + iz(i), 2 + jz(i)) = "*"
  Next
End Sub
Private Sub CommandButton2_Click()
  Range("B4:J12").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル


 Ⅰと同じ条件ですが、w + tb * iがあるために、すべての変数をInteger型にしてありますが、
 工夫してすべてByte型に戻してください。
の解答例
'hntはヒント数、iz(80)とjz(80)はそれぞれy座標とx座標
Dim hnt As Byte, iz(80) As Byte, jz(80) As Byte
Private Sub CommandButton1_Click()
  CommandButton2_Click
  hnt = Cells(4, 15)
  hitaisyou '非対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou()
  Dim i As Byte, a As Byte, w As Byte, tb As Byte, h As Byte
  'wははじめる位置、tbは飛び
  w = Int(81 * Rnd)
  Do While 1 '81と互いに素になるtbを自動的に探す。
    tb = Int(81 * Rnd)
    h = 1
    For i = 2 To tb
      If i * i > tb Then Exit For
      If (81 Mod i) = 0 Then
        If (tb Mod i) = 0 Then
          h = 0
          Exit For
        End If
      End If
    Next
    If h = 1 Then Exit Do
  Loop
  For i = 0 To hnt - 1
    a = ((w Mod 81) + (tb Mod 81) * (i Mod 81)) Mod 81 'aはセル(箱)番号を表す変数
    iz(i) = Int(a / 9)
    jz(i) = a Mod 9
    Cells(4 + iz(i), 2 + jz(i)) = "*"
  Next
End Sub
Private Sub CommandButton2_Click()
  Range("B4:J12").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル

次の課題は、上下に線対称になるようにする配置です。
そして、左右の線対称配置を行うSubプロシージャの名称を
retutaisyouとします。
次話の課題は、偶数のときには中央の行は空欄、奇数のときは1つだけ中央の行に入れるに、
限定します。
いきなり中央の列に適切な割合で入れるとすると飛躍が大きすぎるからです。
ただし、hitaisyouは削除しないで残しておいてください。
後に、シートの方からタイプ(非対称・上下対称・左右対称・点対称など)を選べるようにするからです。

考え方を書いておきましょう。
a
ヒント数が偶数のときには、0から35の間に半分を配置して、
残りの半分は今配置した数字と上下に対称な位置に配置すれば、
bと上下に対称に配置されます。
尚、a = ((w Mod 81) + (tb Mod 81) * (i Mod 81)) Mod 81
などでは複雑すぎますので、
  Dim
i As Integer, a As Integer, w As Integer, tb As Integer, h As Byte
としましょう。

第4話へ 第6話へ


トップへ