ゲームを記憶する

N:0 Y:0 X:0
N:0 Y:0 X:1
N:0 Y:0 X:2
N:0 Y:1 X:0
N:0 Y:1 X:1
N:1 Y:0 X:0
N:2 Y:2 X:2
N:0 Y:1 X:2
N:0 Y:2 X:0
N:0 Y:2 X:1
N:0 Y:2 X:2
三目並べゲームでAI(人工知能 artificial insemination)に触れてみます。
C# で ArrayList から Cell を連鎖して三目並べゲームを記憶します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 将棋や囲碁でコンピュータがプロを負かすほど強くなってきました。
    強くなった理由はAI(人工知能 artificial insemination)が使われるようになったからです。
    チェスでコンピュータがプロに勝ったのは1996年で、囲碁のような複雑なゲームではコンピュータは勝てないと言われてきました。
    所が最近(2017年)では、将棋や囲碁でプロが敵わないぐらいにコンピュータが強くなってきました。
    囲碁で使われているAIは「ディープラーニング」と呼ばれる深層学習機能です。
    囲碁は無理でも、オセロ・ゲームぐらいならと始めたのですが、なかなか難題で手におえません。
    そこでもっと簡単な三目並べゲームから始めることにしました。
    三目並べゲームは、3行3列の盤に黒白交互に駒を打って、縦横斜めのいずれかに3個並べば勝ちの単純なゲームです。
  2. 三目並べのゲームを念頭に、ArrayList から Cell を連鎖してゲームの手を記憶します。
    ゲームの実行プログラムは Windows Mode で作成しますが、今回は Console Mode です。
    //★ 三目並べの連鎖構造    前田 稔 ★
    using System;
    using System.Collections;   //ArrayList を使うとき
    class Cell
    {   public ArrayList AL = null;
        public int n;   // N 手目
        public int y;   // Y 座標
        public int x;   // X 座標
    }
    
    class Prog
    {
        public static void Main()
        {
            Cell top = new Cell();
            Cell wk;
            int  i;
    
            // top に一手目を登録
            top.AL = new ArrayList();
            for(i=0; i<9; i++)
            {   wk = new Cell();
                wk.n = 0;
                wk.y = i/3;
                wk.x = i%3;
                top.AL.Add(wk);
            }
    
            for(i=0; i<top.AL.Count; i++)
            {   wk = (Cell)top.AL[i];
                Console.WriteLine("N:" + wk.n + " Y:" + wk.y + " X:" + wk.x);
            }
            Console.ReadLine(); 
        }
     }
    
  3. class Cell が手を記録する構造体(Class)で、ArrayList AL から Cell を連鎖します。
    メンバーとして何手目かを表す n と駒を打つ座標 y, x を定義しています。
    ArrayList の連鎖は ArrayList の連鎖 を参照して下さい。
    class Cell
    {   public ArrayList AL = null;
        public int n;   // N 手目
        public int y;   // Y 座標
        public int x;   // X 座標
    }
    
  4. top が連鎖する構造体のトップポインターです。
    wk は作業用で、Cell の連鎖に使用します。
    top が指し示す ArrayList AL に一手目(3*3=9個)の Cell を登録します。
        public static void Main()
        {
            Cell top = new Cell();
            Cell wk;
            int  i;
    
            // top に一手目を登録
            top.AL = new ArrayList();
            for(i=0; i<9; i++)
            {   wk = new Cell();
                wk.n = 0;
                wk.y = i/3;
                wk.x = i%3;
                top.AL.Add(wk);
            }
    
  5. ArrayList AL に登録された一手目(9個)の Cell を印字します。
            for(i=0; i<top.AL.Count; i++)
            {   wk = (Cell)top.AL[i];
                Console.WriteLine("N:" + wk.n + " Y:" + wk.y + " X:" + wk.x);
            }
            Console.ReadLine(); 
    

二手目, 三手目を追加

  1. 3*3の中央を一手目として、二手目(左上 0,0)を追加します。
    new Cell() でセルを生成して、n, y, x を格納します。
    中央の一手目(top.AL[4])の ArrayList を初期化して、セル(wk)を登録します。
            wk = new Cell();
            wk.n = 1;
            wk.y = 0;
            wk.x = 0;
            pt = (Cell)top.AL[4];
            pt.AL = new ArrayList();
            pt.AL.Add(wk);
    
  2. 二手目の ArrayList に三手目(右下 2,2)を追加します。
    new Cell() でセルを生成して、n, y, x を格納します。
    現在 pt は二手目を指しているので pt = (Cell)pt.AL[0] で三手目に設定します。
    ArrayList を初期化して、セル(wk)を登録します。
            wk = new Cell();
            wk.n = 2;
            wk.y = 2;
            wk.x = 2;
            pt = (Cell)pt.AL[0];
            pt.AL = new ArrayList();
            pt.AL.Add(wk);
    
  3. Cell の連鎖をたどって印字する関数 Print() を呼び出します。
            Print(top);
            Console.ReadLine(); 
        }
    
  4. Cell の連鎖をたどって印字する Print() 関数です。
    Cell top で渡されたセルの ArrayList AL を先頭から印字します。
    もし AL から二手目のリンクがあれば、Print() 関数を再帰で呼び出します。
    ページ先頭のリストが二手目, 三手目を追加した結果です。
        public static void Print(Cell top)
        {   Cell wk;
            int  i;
            for (i=0; i<top.AL.Count; i++)      // ArrayList(手番で列挙)の印字
            {   wk = (Cell)top.AL[i];
                Console.WriteLine("N:" + wk.n + " Y:" + wk.y + " X:" + wk.x);
                if (wk.AL != null)  Print(wk);  // AL[i] から Cell にリンク
            }
        }
    

[Next Chapter ↓] 三目並べの学習機能
[Previous Chapter ↑] ArrayList の連鎖

超初心者のプログラム入門(C# Frame Work)