MENU

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

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

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

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

・クラス宣言

クラスの名前は "Coord" です。C#(9.0以降)では新しく record class が導入され、演算子(==)や複製(clone)などが簡単に使えるようになりました。ただしクラスのプロパティはプリミティブ型に限ります。Coordクラスのプロパティは座標(int)のみなので record class として宣言します。

internal record class Coord

・プロパティ

プロパティはX座標とY座標のみです。Y軸は一般の画像ソフトと同じで下方向がプラスです。スコープはPublicですが "private set" の記述で他のクラスからは変更不可となります。

public int X { get; private set; }   // 水平方向
public int Y { get; private set; }   // 垂直方向

・初期化

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

public Coord(int x, int y)
{
    X = x;
    Y = y;
}

//=====(例)=====
Coord p = new Coord(1, 2);

・座標の変更

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

public void MoveTo(int x, int y)
{
    X = x;
    Y = y;
}

//=====(例)=====
Coord p = new Coord(1, 2);
p.MoveTo(3, 4);         //pの座標は (3, 4) に変更されます

・複製(関数)

前述のとおり record class を宣言したので、クラスの複製のためのコードは不要です。例のように "with {}" と書けば、すべてのプロパティ値が同じ別インスタンスが作成されます(中括弧の中には違う値を持つプロパティの設定ができます)。

//=====(例)=====
Coord p1 = new XY(1, 2);
Coord p2 = p1;                 //同一インスタンス(p2 is p1)
Coord p3 = p1 with {};         //別インスタンス(p3 isNot p1)←複製

演算子定義

演算子(==)も record class の宣言でコードの記述なしで使えるようになります。

'=====(例)=====
Coord p1 = new Coord(1, 2);
Coord p2 = new Coord(1, 2);
If (p1==p2)
{
    MessageBox.Show("True");    //Trueが表示されます
}
Else
{
   MessageBox.Show("False");
}

・座標の回転

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

public void AntiClockWiseRotate(int ct)    //ct:1=90度,2=180度,・・・
{
    while (ct > 0)
    {
        int W = X;
        X = Y;
        Y = -W;
        ct--;
    }
}

//=====(例)=====
Coord p1 = new Coord(1, 2);
p1.AntiClockWiseRotate(1);      //90度回転、p1は(2,-1)になります

・反転

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

public void HorizontalReverse()
{
    X = -X;
}

//=====(例)=====
Coord p1 = new Coord(1, 2);
p1.HorizontalReverse();       //p1は(-1,2)になります


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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ペントミノソルバー2D
{
    internal record class Coord
    {
        //****************************************
        //*          Coord  (座標クラス) 
        //****************************************
        public int X { get; private set; }   // 水平方向
        public int Y { get; private set; }   // 垂直方向

        // 初期化
        public Coord(int x, int y)
        {
            X = x;
            Y = y;
        }

        // 座標の変更
        public void MoveTo(int x, int y)
        {
            X = x;
            Y = y;
        }

        // (0,0)を中心に反時計回り回転
        public void AntiClockWiseRotate(int ct)   //ct:1=90度,2=180度,・・・
        {
            while (ct > 0)
            {
                int W = X;
                X = Y;
                Y = -W;
                ct--;
            }
        }

        // y軸に対して反転
        public void HorizontalReverse()
        {
            X = -X;
        }

    }
}

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