MENU

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

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

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

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

・クラス宣言

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

Public Class Coord

・プロパティ

プロパティはX座標とY座標のみです。Y軸は一般の画像ソフトと同じで下方向がプラスです。スコープはReadOnlyなので他のクラスからは変更不可です。クラス内で変更するときは、プロパティ名の先頭にアンダースコアを付けた特別な名前を使用します。

ReadOnly Property X As Integer   '水平方向(右がプラス)
ReadOnly Property Y As Integer   '垂直方向(下がプラス)

・初期化

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

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

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

・座標の変更

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

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

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

・複製(関数)

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

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

'=====(例)=====
Dim p1 As New Coord(1, 2)
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) And (c1.Y = c2.Y)
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)
Dim p2 As New Coord(1, 2)
If p1=p2 Then
   MsgBox("True")   'Trueが表示されます
Else
   MsgBox("False")
End If

・座標の回転

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

Public Sub AntiClockWiseRotate(ct As Integer)   'ct:1=90度,2=180度,・・・
   Do While ct > 0
      Dim W = X
      _X = Y
      _Y = -W
      ct -= 1
   Loop
End Sub

'=====(例)=====
Dim p1 As New Coord(1, 2)
p1.AntiClockWiseRotate(1)   '90度回転、p1は(2,-1)になります

・反転

Y軸に対して折り返します。

Public Sub HorizontalReverse()
   _X = -X
End Sub

'=====(例)=====
Dim p1 As New Coord(1, 2)
p1.HorizontalReverse()   'p1は(-1,2)になります


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

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

   ReadOnly Property X As Integer   '水平方向
   ReadOnly Property Y As Integer   '垂直方向

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

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

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

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

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

   '(0,0)を中心に反時計回り回転
   Public Sub AntiClockWiseRotate(ct As Integer)   'ct:1=90度,2=180度,・・・
      Do While ct > 0
         Dim W = X
         _X = Y
         _Y = -W
         ct -= 1
      Loop
   End Sub

   'y軸に対して反転
   Public Sub HorizontalReverse()
      _X = -X
   End Sub

End Class

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