「Logic Puzzle」の説明

プロでも音を上げた思考関数に、あなたはどこまで挑戦出来るでしょうか?
多くの人にお馴染みのドットで絵を描く「Logic Puzzle」ですが、人間の考え方をそのままプログラムに組み込むのは 非常に難しく、過去多くのプログラマが挑戦していますが、途中で挫折したケースは枚挙にいとまがありません。
それほどこのプログラムは難しく腕を磨くには絶好のテーマです。

初級者に取ってパズルを解く以前の問題として、メインプログラムの作成は大きなハードルです。
そこで私は Logic Puzzle のメインプログラムとパズルの解法に必要な Object Class を作成して提供することにしました。
あなたがたは DLL(Dynamic Link Library) を作成するだけなので、少しでもプログラムの経験があるなら 「誰でも初歩のプログラム」は作成できるでしょう。
英語の始めは「ABC」と言いますが、英字のパズルぐらいは解ける DLL に挑戦して下さい。
本当に難しくなるのは DOT ファイルの半分ぐらいが解ける ようになってからです。

Logic Puzzle のプログラムは次のページから Down Load して下さい。
Game Program & Tool のダウンロード

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

ゲームの概要

  1. Logic Puzzle のデータファイル(*.dot) を入力して、パズルを解いて画像を表示します。
  2. LZH で圧縮されたファイルをダウンロードして解凍して下さい。
    Logic のフォルダーの中に必要な全てのファイルが格納されています。
  3. 次の2個のファイルを同じフォルダーに格納して Logic.exe を起動して下さい。
    Logic.exe Logic Puzzle の Main Program
    Logic.dll 思考関数の DLL です
  4. メニューから DLL のレベルを選びます。
    但し最初は Level_0 しかプログラムされていません。
  5. [ファイル][ファイル入力] から I.dot ファイルを入力して下さい。
    データファイルは Dot のフォルダーに格納されています。
    [思考実行][行と列で思考する] を選ぶとパズルを解いて I の文字が表示されます。
    メニューから選択して実行する代わりに「A」のショートカットキーが使えます。
  6. 最初のプログラムは I.dot と E.dot が解けるだけです。
    多くのパズルが解けるようにプログラムして下さい。


メニューの説明

  1. [ファイル]メニュー
    1. [ファイル入力]
      DOT ファイルを入力してパズルの初期画面を表示します。
    2. [SAVE]
      現在の状態でファイルに保存します。
      保存したファイルを LOAD で入力して再現することができます。
    3. [LOAD]
      SAVE で保存したファイルを入力して状態を再現します。
  2. [思考レベル]メニュー
    Level_0 ~ Level_9 の思考関数のレベルを選びます。
  3. [思考実行]メニュー
    1. [完成確認]
      行や列に矛盾が無いか調べて、パズルの完成を確認します。
    2. [クリア]
      ドット絵のウインドウをクリアします。
    3. [行で思考する]
      先頭の行から順に DLL を実行してマークします。
    4. [flag のリセット]
      デバッグ情報が表示されるようにフラグをリセットします。
    5. [列で思考する]
      先頭の列から順に DLL を実行してマークします。
    6. [逆行で思考する]
      先頭の行から順に左右を反転して DLL を実行してマークします。
    7. [逆列で思考する]
      先頭の列から順に上下を反転して DLL を実行してマークします。
    8. [行と列で思考する]
      行と列と逆行と逆列の順に DLL を実行してマークします。
  4. [ヘルプ]メニュー プログラムのバージョンとパズルIDを表示します。


マウス & キー

  1. 横(行)または縦(列)のウインドウから、行(列)をクリックすると行(列)が選択されて DLL が実行されます。
  2. 右クリックすると逆行(逆列)で DLL が実行されます。
  3. DLL の実行結果として、マークに進展があればパズルのウインドウに表示されます。
    特定の行(列)だけを試すときは、この方法で実行して下さい。
  4. DLL を実行したくない(自分で考える)ときは、プログラムされていない Level に設定して下さい。
  5. パズルのウインドウを左クリックすると「マーク」「空白」「マークチェック」「空白チェック」「NULL」の順に切り替わります。
    右クリックすると「NULL」に設定されます。
  6. 新しいロジックを組み込んだときは、クリックでパターンを設定して行(列)を実行して試して下さい。
  7. [行と列で思考する] のショートカットキーとして「A」が使えます。


DLL の作成

  1. DownLoad したファイルを解凍すると DLL を作成するプロジェクト一式が格納されています。
  2. LogicDLL.dsp をダブルクリックして Visual C++ を起動します。
  3. [ビルド(B)][LogicDLL のビルド(U)] を実行すると DLL が作成されます。
    Release Mode でコンパイルすると DLL のファイルサイズが小さくなります。
  4. 次のような警告が出ることがありますが無視して下さい。
        LINK : warning LNK4098: defaultlib "LIBC" は他のライブラリの使用と競合しています;
               /NODEFAULTLIB:library を使用してください
        LINK : warning LNK4089: "GDI32.dll" へのすべての参照は /OPT:REF によって廃棄されます
        LINK : warning LNK4089: "USER32.dll" へのすべての参照は /OPT:REF によって廃棄されます
        
  5. Debug または Release のフォルダーに DLL のプログラムファイルが作成されます。
    このファイルを Logic.exe と同じフォルダーにコピーして起動して下さい。


思考関数の DLL

  1. Logic Puzzle を解く最初の DLL プログラムです。
    最初は Level_0 しかプログラムされていません。
        // LogicDLL.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
        //★Logic Puzzle  を解く DLL を作成します。
    
        #include "stdafx.h"
        #include "LogicDLL.h"
        #pragma  comment(lib,"LogicApp.lib")
    
        short   sum;    //data の総マーク数
        short   dcnt;   //data で指定されたマークの件数
        short   nul;    //ゼロの個数
        short   mk;     //マークされている数
        short   sp;     //空白の個数
        short   Bcnt;   //Block Count
        short   i,j;    //関数を呼び出すと壊れるので注意
    
        BOOL APIENTRY DllMain( HANDLE hModule, 
                               DWORD  ul_reason_for_call, 
                               LPVOID lpReserved
                             )
        {
            return TRUE;
        }
    
        // マークと数値のカウント
        void  Count(short data[16], short len, short tbl[])
        {
            sum= 0;
            for(dcnt=0; dcnt<16 && data[dcnt]; dcnt++)
            {   sum+= data[dcnt];
            }
            nul=mk=sp= 0;
            for(i=0; i<len; i++)
            {   switch(tbl[i])
                {   case 0: nul++;  break;  //NULL
                    case 1: mk++;   break;  //マーク
                    case 2: sp++;   break;  //空白
                }
            }
        }
    
        // ★Main から参照される思考関数
        // Level-0 思考関数(マーク=0を設定)
        EXPORT short Level_0(LOGIC *App, short data[16], short len, short tbl[])
        {
            Count(data,len,tbl);
    App->DMsg(data,16);
    App->DMsg("dcnt",dcnt);
            //残り全て空白
            if(sum==mk)
            {   for(i=0; i<len; i++)
                    if(tbl[i]!=1)   tbl[i]= 2;
                return(0);
            }
            //残り NULL を全てマーク
            if(sum==mk+nul)
            {   for(i=0; i<len; i++)
                {   if(tbl[i]==0 || tbl[i]==1)  tbl[i]= 1;
                    else                        tbl[i]= 2;
                }
                return(0);
            }
            return 0;
        }
    
        // Level-1 思考関数
        EXPORT short Level_1(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-2 思考関数
        EXPORT short Level_2(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-3 思考関数
        EXPORT short Level_3(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-4 思考関数
        EXPORT short Level_4(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-5 思考関数
        EXPORT short Level_5(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-6 思考関数
        EXPORT short Level_6(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-7 思考関数
        EXPORT short Level_7(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-8 思考関数
        EXPORT short Level_8(LOGIC *App, short data[16], short len, short tbl[])
        {   return 0;
        }
    
        // Level-9 思考関数(パラメータのチェック)
        EXPORT short Level_9(LOGIC *App, short data[16], short len, short tbl[])
        {
            App->DMsg("len",len);
            App->DMsg(data,16);
            App->DMsg(tbl,len);
            Bcnt= App->Block(data,len,tbl);
            App->Bcheck(Bcnt,tbl);
            return 0;
        }
        

[Next Chapter ↓] 思考関数(DLL)の解説

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