Logic Puzzle Object Class の説明

Logic Puzzle Object Class で提供されるメンバー関数(メソッド)に付いて説明します。
Logic Puzzle を解くために便利なメンバー関数を Object Class として組み込んで提供しています。

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

Object Class の領域

  1. Main Program で定義されているパズルの領域とマークの表現です。
    DLL に渡されるときは 3,4 は 0 に変換されるので「0,1,2」だけを考慮して下さい。
        short       TBL[40][60];
    
        ・0 NULL 初期状態
        ・1 マーク確定
        ・2 空白確定
        ・3 マークチェック
        ・4 空白チェック
        
  2. デバッグ用のメッセージを表示するメンバー関数です。
    配列にも対応していて MessageBox に編集して表示されます。
    NO をクリックすると MessageBox が表示されなくなります。
    表示を再開するには「メニューからフラグのリセット」を実行して下さい。
        void        DMsg(char *chr, short n);
        void        DMsg(short *tbl, short n);
        
    【例】実際の使用例は Level_9 を参照して下さい。
        App->DMsg("カウント",cnt);
        App->DMsg("len",len);
        App->DMsg(data,16);
        


Block の Object Class

列(行)の状態のまま解析できることは、たかが知れています。
そこで列を空白で区切られた Block に分けて解析するのですが、そのための強力な関数をサポートしています。
ブロックに分けないで解析することも出来るのですが、ブロック分けと同じような処理をする必要があるでしょう。
  1. BLOCK 構造体の定義です。
        ※BLOCK 構造体
        typedef struct
        {   short   flag;       //フラグ
            short   st;         //ブロック開始位置
            short   len;        //ブロックの長さ
            short   mk;         //ブロック内のマークの数
            short   dat[16];    //仮に割り当てられたマーク
            short   dn;         //dat[] の個数
            short   sum;        //dat[] のマークの総数
            short   mx;         //dat[] の最大マーク
            short   mx2;        //mx の次に大きいマーク
            short   mn;         //dat[] の最小マーク
        }   BLOCK;
    
        BLOCK       B[31];      //列を Block に分ける
        
  2. BLOCK 構造体の flag の設定です。
    ビット位置ON のときOFF のとき
    Bit-0マークされているマークは無い
    Bit-1dat が配分されたdat の割り当ては無し
    Bit-2配分が確定 仮に配分しただけ
    Bit-3Block が完成した未完成
  3. 列を空白で区切って Block に分ける関数です。
    リターン値として Block の個数が返されます。
    Block に含まれるのはマークと NULL の2種類だけです。
        short       Block(short data[16], short len, short tbl[]);
        
    【例】実際の使用例は Level_9 を参照して下さい。
        short   Bcnt;       //Block Count
    
        Bcnt= App->Block(data,len,tbl);
        
  4. Block 分けされた状態を調べる関数です。
    BLOCK 構造体のメンバーの値を確認することができます。
    NO をクリックするとメニューからフラグのリセットするまで表示されなくなります。
        void        Bcheck(short bcnt, short tbl[]);
        void        Bcheck(BLOCK *B, short tbl[]);
        
    【例】実際の使用例は Level_9 を参照して下さい。
        App->Bcheck(Bcnt,tbl);
        App->Bcheck(B,tbl);
        
  5. Block から String を抽出して解析する領域です。
    先頭から String の長さが格納されます。
        short       SL[31];             //Block を String に分割した長さ
        
  6. String を抽出する関数です。
    Block の区切りが空白なので、String はマークと NULL の2種類です。
        short       STlen(BLOCK *B, short tbl[]);
        
    【例】
        short   SN;         //Block を STring に分けた SL[] の有効数
    
        SN= App->STlen(B,tbl);      //Block を String に分ける
        
  7. String の確認は App->DMsg() で行って下さい。
    【例】
        App->DMsg(App->SL,SN);
        


Block に対する data の割り当て

App->Block() 関数を実行すると空白で区切られた Block に分割して data が割り当てられます。
このとき割り当てられた data は、ブロック長に合わせて前詰めで計算されただけです。
DLL を作成するときは、誤解の無いように次のことを確認しておいて下さい。
  1. data は Block の先頭から Block 長に合わせて詰めて割り当てられます。
  2. 先頭から調べて、マークが確定している Block が続く間は正しい割り当てですが、以降の Block は単に詰めて計算されただけです。
  3. 先頭からの割り当てが終わると、後部からマークとデータの関係を見直します。
  4. どの方法で data を割り当てても、パズルの答えが解からない状態で割り当てる以上、完全な割り当てはできません。
  5. 先頭から割り当てられたマークの数とマーク長が一致したブロックに「確定フラグ」を設定します。
  6. 先頭から調べて、data が割り当てられていないブロックに「配分が確定」のフラグを設定します。
    これはブロックサイズが小さくて data が割り当てられなかった場合です。
  7. 先頭から調べて、マークのあるブロックと data が1:1に対応するときは data の割り当てが確定します。
  8. ブロックにマークのあるときは「マークがある」のフラグを設定します。
  9. ブロックに data が割り当てられているときは「dat が配分」のフラグを設定します。


Block の種類

  1. 確定フラグがオンの Block ((flag & 8) == 8)
    マークが確定して完成した Block です。
  2. マークがあり dat が配分された確定 Block ((flag & 7) == 7)
    dat 配分が確定した Block で、解析することによりマークや空白を設定できる可能性があります。
    特に dat が一件のときは、より綿密な解析が可能です。
  3. マークが無く dat が配分された確定 Block ((flag & 6) == 6)
    ゲームを開始したときの列(行)の全体もこの状態です。
    左右から配置して、重なる部分のマークを設定できます。
  4. マークがあり dat が配分された未確定 Block ((flag & 3) == 3)
    最初の未確定 Block は、一件目の dat だけは配分が確定しています。
    この Block の解析方法がパズルの正解を導く上で、最も大きな影響を与えます。
    二件目以降の Block は配分が確定していないこともあり、解析するのは困難です。
  5. マークが無く dat が配分された未確定 Block (flag == 0)
    この Block は配分が確定していないこともあり、解析するのは困難です。

[Next Chapter ↓] Logic Puzzle の解法
[Previous Chapter ↑] 思考関数(DLL)の解説

超初心者のプログラム入門(Win32API C++)