MENU

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

前回はクラスの概要の説明でした。今回はさっそくクラスの作成に取り掛かります。Visual Studio で空白のプロジェクトを用意してください。

プロジェクトの名前は "ペントミノソルバー3D" です。

最初は「Coordクラス」、3次元の空間にある点を表す座標クラスです。クラス全体のソースはページの最後にまとめて載せます。

・クラス宣言

クラスの名前は "Coord" です(座標を表す英語 Coordinate の略)。

Public Class Coord

・プロパティ

プロパティはX, Y, Z の各座標のみです。X軸は右、Y軸は手前、Z軸は上 がプラスです。スコープはReadOnlyなので他のクラスからは変更不可です。クラス内で変更するときは、プロパティ名の先頭にアンダースコアを付けた特別な名前を使用します。

ReadOnly Property X As Integer   '左右(Width:右がプラス)
ReadOnly Property Y As Integer   '前後(Depth:手前がプラス)
ReadOnly Property Z As Integer   '上下(Height:上がプラス)

・初期化

引数に座標( x, y, z )が必要です。

Sub New(x As Integer, y As Integer, z As Integer)
   _X = x
   _Y = y
   _Z = z
End Sub

'=====(例)=====
Dim p As New Coord(1, 2, 3)

・座標の変更

指定の座標に変更します。

Public Sub MoveTo(x As Integer, y As Integer, z As Integer)
   _X = x
   _Y = y
   _Z = z
End Sub

'=====(例)=====
Dim p As New Coord(1, 2, 3)
p.MoveTo(3, 4, 5)           'pの座標は (3, 4, 5) に変更されます

・複製(関数)

同じプロパティを持つインスタンスをもう一つ作るときのために、このような関数を作っておくと便利です。下の例では p2, p3 はいずれも p1 と同じ座標を持ちますが p1 と p2 は同じインスタンス、p1 と p3 は違うインスタンスになります。

Public Function Clone() As Coord
   Return New Coord(X, Y, Z)
End Function

'=====(例)=====
Dim p1 As New Coord(1, 2, 3)
Dim p2 = p1                '同一インスタンス(p2 is p1)
Dim P3 = p1.clone()        '別インスタンス(p3 isNot p1)

演算子定義

2つのクラスを比較する is演算子 は、インスタンスが同一かどうかのみを評価します。インスタンスではなくプロパティが等しいかどうかを評価したいときは自分でコーディングするしかありません。VB.Net はこのように自作した評価コードに =演算子 や <>演算子 が使えるので便利です。

Public Shared Operator =(c1 As Coord, c2 As Coord) As Boolean
   Return (c1.X = c2.X) AndAlso (c1.Y = c2.Y) AndAlso (c1.Z = c2.Z)
End Operator

Public Shared Operator <>(c1 As Coord, c2 As Coord) As Boolean
   Return Not (c1 = c2)
End Operator

'=====(例)=====
Dim p1 As New Coord(1, 2, 3)
Dim p2 As New Coord(1, 2, 3)
MsgBox(If(p1 Is p2, "True", "Flase"))   'Falseが表示されます
MsgBox(If(p1 = p2, "True", "Flase"))    'Trueが表示されます

・座標の回転

反時計回りに90度単位で回転させます。引数には90度単位の回転回数を指定します。

'XY平面で反時計回りに回転
Public Sub RotateXY(ct As Integer)
   Do While ct > 0
      Dim W = X
      _X = Y
      _Y = -W
      ct -= 1
   Loop
End Sub

'XZ平面で反時計回りに回転
Public Sub RotateXZ(ct As Integer)
   Do While ct > 0
      Dim W = Z
      _Z = X
      _X = -W
      ct -= 1
   Loop
End Sub

'YZ平面で反時計回りに回転
Public Sub RotateYZ(ct As Integer)
   Do While ct > 0
      Dim W = Y
      _Y = Z
      _Z = -W
      ct -= 1
   Loop
End Sub

'=====(例)=====
Dim p1 As New Coord(1, 2, 3)
p1.RotateXY(1)   'XY平面で反時計回り90度、p1は(2,-1, 3)になります


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

Public Class Coord
   '**********************************************
   '*            Coord  (座標クラス) 
   '**********************************************

   ReadOnly Property X As Integer   '左右(Width:右がプラス)
   ReadOnly Property Y As Integer   '前後(Depth:手前がプラス)
   ReadOnly Property Z As Integer   '上下(Height:上がプラス)

   Sub New(x As Integer, y As Integer, z As Integer)
      _X = x
      _Y = y
      _Z = z
   End Sub

   '座標の変更
   Public Sub MoveTo(x As Integer, y As Integer, z As Integer)
      _X = x
      _Y = y
      _Z = z
   End Sub

   '複製
   Public Function Clone() As Coord
      Return New Coord(X, Y, Z)
   End Function

   '演算子定義(=)
   Public Shared Operator =(c1 As Coord, c2 As Coord) As Boolean
      Return (c1.X = c2.X) AndAlso (c1.Y = c2.Y) AndAlso (c1.Z = c2.Z)
   End Operator

   Public Shared Operator <>(c1 As Coord, c2 As Coord) As Boolean
      Return Not (c1 = c2)
   End Operator

#Region "回転 ct:1=90度,2=180度,・・・"

   'XY平面で反時計回りに回転
   Public Sub RotateXY(ct As Integer)
      Do While ct > 0
         Dim W = X
         _X = Y
         _Y = -W
         ct -= 1
      Loop
   End Sub

   'XZ平面で反時計回りに回転
   Public Sub RotateXZ(ct As Integer)
      Do While ct > 0
         Dim W = Z
         _Z = X
         _X = -W
         ct -= 1
      Loop
   End Sub

   'YZ平面で反時計回りに回転
   Public Sub RotateYZ(ct As Integer)
      Do While ct > 0
         Dim W = Y
         _Y = Z
         _Z = -W
         ct -= 1
      Loop
   End Sub

#End Region

End Class

次回は「部品クラス」です。