MENU

【VB】ペントミノ3Dパズルを解く(6)DEFクラスを作る

このクラスはプログラムの鑑です。プログラムIDや作成日などのプログラム諸元や共有で使用する定数や関数などをまとめて記述しておくクラスです。クラス名の "DEF" は定義(define)から採っています。

・クラス宣言

クラスの名前は "DEF" です。

Public Class DEF

・プログラム諸元

筆者は自作のプログラムにはこのような鑑を記述しています

Public Const myProgramID = "**********"          'プログラムID
public Const myVersion = "********"              'バージョン
Public Const myDateWritten = "****/**/**"        '作成日
Public Const myAuthor = "**********"             '作者名
Public Const myName = "ペントミノソルバー3D"

・定数:シノニム(回転,鏡映)除外の判定部品

Shelfクラスの説明の表で、部品数が24のもの("P"または"F")を指定します。

Public Const SynonymJudgePieceName As String = "P"

・変数:SolutionNo

パズルの解番号

Public Shared SolutionNo As Integer 

・変数:キャンセルフラグ

プログラムの途中放棄に使用します

Public Shared CancelFlag As Boolean

・関数:部品棚作成

引数のShelvesに12種類の部品棚を作ります

Public Shared Sub 部品棚作成(shelves As List(Of Shelf), box As Box)
   With shelves
      .Add(New Shelf("F", Color.FromArgb(70, 153, 241), "RDRdL", box))   '青
      .Add(New Shelf("I", Color.FromArgb(70, 212, 255), "DDDD", box))    '空色
      .Add(New Shelf("L", Color.FromArgb(181, 252, 91), "DDDR", box))    '黄緑
      .Add(New Shelf("N", Color.FromArgb(255, 76, 138), "DLDD", box))    'ピンク
      .Add(New Shelf("P", Color.FromArgb(255, 176, 70), "RDLD", box))    'オレンジ
      .Add(New Shelf("T", Color.FromArgb(255, 162, 234), "RRdLD", box))  '薄い紫
      .Add(New Shelf("U", Color.FromArgb(60, 178, 174), "DRRU", box))    '青緑
      .Add(New Shelf("V", Color.FromArgb(184, 72, 185), "DDRR", box))    '紫
      .Add(New Shelf("W", Color.FromArgb(81, 89, 191), "DRDR", box))     '濃い青
      .Add(New Shelf("X", Color.FromArgb(229, 64, 72), "DLdRrU", box))   '赤
      .Add(New Shelf("Y", Color.FromArgb(70, 177, 110), "DLrDD", box))   '緑
      .Add(New Shelf("Z", Color.FromArgb(178, 178, 178), "RDDR", box))   '灰色
   End With
End Sub

・経過時間

startTime から endTime までの時間を "HH:mm:ss" 形式の文字列にして返します

Public Shared Function 経過時間(startTime As Date, endTime As Date) As String
   Dim seconds = DateDiff(DateInterval.Second, startTime, endTime)
   Dim hours = Fix(seconds / 3600)
   seconds -= hours * 3600
   Dim minutes = Fix(seconds / 60)
   seconds -= minutes * 60
   Return Format(hours, "00") & ":" & Format(minutes, "00") & ":" & Format(seconds, "00")
End Function


以上が「DEFクラス」です。クラス全体のソースは以下のとおりです。

Public Class DEF

   'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
   'Z
   'Z        ペントミノソルバー3D(DEF)
   'Z
   'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

   Public Const myProgramID = "**********"
   public Const myVersion = "********"
   Public Const myDateWritten = "****/**/**"
   Public Const myAuthor = "**********"
   Public Const myName = "ペントミノソルバー3D"

   'シノニム(回転,鏡映)除外の判定部品("F","P"のどちらか)
   Public Const SynonymJudgePieceName As String = "P"

   Public Shared SolutionNo As Integer            '解カウンター
   Public Shared CancelFlag As Boolean

   '********************
   '*   部品棚作成
   '********************
   Public Shared Sub 部品棚作成(shelves As List(Of Shelf), box As Box)
      With shelves
         .Add(New Shelf("F", Color.FromArgb(70, 153, 241), "RDRdL", box))   '青
         .Add(New Shelf("I", Color.FromArgb(70, 212, 255), "DDDD", box))    '空色
         .Add(New Shelf("L", Color.FromArgb(181, 252, 91), "DDDR", box))    '黄緑
         .Add(New Shelf("N", Color.FromArgb(255, 76, 138), "DLDD", box))    'ピンク
         .Add(New Shelf("P", Color.FromArgb(255, 176, 70), "RDLD", box))    'オレンジ
         .Add(New Shelf("T", Color.FromArgb(255, 162, 234), "RRdLD", box))  '薄い紫
         .Add(New Shelf("U", Color.FromArgb(60, 178, 174), "DRRU", box))    '青緑
         .Add(New Shelf("V", Color.FromArgb(184, 72, 185), "DDRR", box))    '紫
         .Add(New Shelf("W", Color.FromArgb(81, 89, 191), "DRDR", box))     '濃い青
         .Add(New Shelf("X", Color.FromArgb(229, 64, 72), "DLdRrU", box))   '赤
         .Add(New Shelf("Y", Color.FromArgb(70, 177, 110), "DLrDD", box))   '緑
         .Add(New Shelf("Z", Color.FromArgb(178, 178, 178), "RDDR", box))   '灰色
      End With
   End Sub

   '********************
   '*     経過時間
   '********************
   Public Shared Function 経過時間(startTime As Date, endTime As Date) As String
      Dim seconds = DateDiff(DateInterval.Second, startTime, endTime)
      Dim hours = Fix(seconds / 3600)
      seconds -= hours * 3600
      Dim minutes = Fix(seconds / 60)
      seconds -= minutes * 60
      Return Format(hours, "00") & ":" & Format(minutes, "00") & ":" & Format(seconds, "00")
   End Function

End Class

次回はいよいよ最後「フォーム」です。デザイン部分とコード部分に分けて詳しく解説します。