ライフゲーム その2

先日のコードより後退して、最小限のコードを書いた。

  • 初期状態はコード上で決め打ち。
  • 出力はLog出力の最小限アプリ。

以上の2点しかないのに、テンプレートから作成したので無駄なWindowが出る。

モデルクラスの使い方

モデルクラスは、LGOMModelです。インスタンス化する時に、格子のサイズを指定して作成します。

{
   LGOMSize theSize    = {32, 32};
   self.model = [LGOMModel modelWithSize:theSize];
   .
   .
   .

上記は、32x32の格子サイズを持つライフゲームのモデルを作成します。

初期状態の設定

初期状態の設定用に3つのメソッドを用意しています。

// すべてのセルを非生存状態にします。
- (void) clearAll;

// すべてのセルの生存状態/非生存状態を乱数で設定します
- (void) randomizeAll;

// 文字列でセルの状態を指定します。
- (void) gameBoardSetup:( NSString* _Nonnull )inNewLifeGameBoard;

clearAllとrandomizeAllはコメントの通りです。 gameBoardSetupメソッドに引き渡す文字列は、以下のような形式になります。

 // 8x8の格子でLGOMModelを作成した場合
[model gameBoardSetup:
 @"........\r"
 @"...OOO..\r"
 @"........\r"
 @"........\r"
 @"........\r"
 @"...OOO..\r"
 @"........\r"
 @"........\r"

それぞれの文字の意味を以下の表に示します。

文字 意味
“O” セルが生存状態
“.” セルが非生存状態
“r” 次の行、または終了マーカー

世代の進行

メソッド”next”を呼び出すと、モデルの内容を次の世代に書き換えます。

各セルの値の確認と変更

それぞれのセルの状態を確認変更するメソッドは以下の2つです。

// inPointで示す位置のセルの状態をBOOLで返します。YES:生存 NO:非生存
- (BOOL) aliveAtPoint:(LGOMPoint)inPoint;

// inPointで示す位置のセルの状態をinAliveで指定した値に変更します。
- (void) setAlive:(BOOL)inAlive atPoint:(LGOMPoint)inPoint;

すべてのセルの状態確認

descriptionメソッドで出力するようにしています。

- (NSString*) description

サンプルコードでの使用方法

NSApplicationのdelegateに設定している、LGOMApplicationDelegateの中のawakeFromNibメソッドで使用しています。

- (void) awakeFromNib
{
   LGOMSize theSize    = {32, 32};
   self.model = [LGOMModel modelWithSize:theSize];

   [self.model gameBoardSetup:
    @"................................\r"
    @"...OOO..............O...........\r" // ブリンカー
    @"....................OO..........\r" // ブロック
    @"...........OOOO.................\r" // 蜂の巣
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @".............OOO................\r" // Tテトロミノ
    @"..............O.................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"...O............................\r"// グライダー
    @"....O...........................\r"
    @"..OOO...........................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"
    @"................................\r"];


   NSLog(@"\r%@\r", self.model );
   [self.model  next];

   NSLog(@"\r%@\r", self.model );
   [self.model  next];

   NSLog(@"\r%@\r", self.model );
   [self.model  next];

   NSLog(@"\r%@\r", self.model );
   [self.model  next];

   NSLog(@"\r%@\r", self.model );
   [self.model  next];

   NSLog(@"\r%@\r", self.model );
   [self.model  next];
}

出力結果は以下の通り。

2016-09-04 23:21:11.141 LifeGameOnMac[38776:1497000]
................................
...OOO..............O...........
....................OO..........
...........OOOO.................
................................
................................
................................
................................
................................
.............OOO................
..............O.................
................................
................................
................................
................................
...O............................
....O...........................
..OOO...........................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................

2016-09-04 23:21:11.144 LifeGameOnMac[38776:1497000]
....O...........................
....O...............OO..........
....O.......OO......OO..........
............OO..................
............OO..................
................................
................................
................................
..............O.................
.............OOO................
.............OOO................
................................
................................
................................
................................
................................
..O.O...........................
...OO...........................
...O............................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
以下省略

多分、最も原始的なCocoaアプリでのライフゲイムだと思う。

ソースコードはここ。( LifeGameOnMac_01.zip )

次は、GUIで編集できるコードの解説をします。じゃあね。