Mesoscopic Programming

タコさんプログラミング専門

ヌメロン製作講座第1回

毎度おなじみヌメロン製作講座のお時間がやってまいりました。
ソースコードは空白入れて1万行弱程度のものです。
グラフィックデータは一切使わないのでリソースファイルはありません。
なのでVisual C++以外でもビルド可能かもしれません。試してませんが。
起動すると以下のような感じになります。
f:id:hidakas1961:20120915234508j:plain:w200
開始ボタンを押すと以下のような画面になります。
f:id:hidakas1961:20120915235549j:plain:w200
分析ボタンを押すとこうなります。
f:id:hidakas1961:20120915235709j:plain:w200

棋譜データを保存すると以下のようなテキストファイルが作成されます。ちなみにこれはコンピュータ同士に対戦させた結果です。

Numer0n.dat

// 共通データ

Title	"Numer0n 2012/9/15 23:58";
Column	3;
Rule	Numer0n6;

// 先攻データ

First	Name	None;
First	Type	Com;
First	Card	0 1 2 3 4 5 5 6 6 7 7 8 8 9 9;
//	After	0 0 1 2 3 4 5 5 5 6 6 7 7 8 8 9 9 9;
First	Item	HighLow Double Shuffle;
//	After	Double Shuffle;
First	Number	Secret "BJH";

// 後攻データ

Second	Name	None;
Second	Type	Com;
Second	Card	0 1 2 3 4 5 5 6 6 7 7 8 8 9 9;
//	After	1 2 3 4 5 6 6 7 7 8 8 9;
Second	Item	HighLow Double Shuffle;
//	After	Double;
Second	Number	Secret "AJF";

// 棋譜データ

First	Call	083 0 - 1;
Second	Call	017 0 - 2;
First	Call	206 0 - 1;
Second	Call	670 0 - 1;
First	Call	618 0 - 0;
Second	Call	781 2 - 0;
First	Call	950 1 - 2;
Second	HighLow	High High Low;
Second	Call	751 2 - 0;
Second	Shuffle	Secret "FAJ";
First	HighLow	High Low High;
First	Call	905 3 Eat;

メインウィンドウは、前回ご紹介した「ウィンドウ基底クラス」を継承して使用しますので、まずは空のプロジェクトに例のwindow.hとwindow.cppを追加しておいてください。
そして以下に示すmain.hとmain.cppを追加します。

main.h

#ifndef MAIN_H
#define MAIN_H

#include "window.h"

#include <tchar.h>

class Application : public Window
{
public :

    static const SHORT  wndWidth    = 640;
    static const SHORT  wndHeight   = 480;
    static LPCTSTR      className;

    BOOL    Init( HINSTANCE hInstance, int nCmdShow );
    VOID    Run();
    VOID    OnDestroy();
};

#endif // MAIN_H

main.cpp

#include "main.h"

LPCTSTR     appName = _T( "Numer0n" );
Application app;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    if ( app.Init( hInstance, nCmdShow ) )
    {
        app.Run();
    }

    return 0;
}

LPCTSTR Application :: className = _T( "Application" );

BOOL Application :: Init( HINSTANCE hInstance, int nCmdShow )
{
    WNDCLASSEX  wcx;
    HWND        hWnd;

    wcx.cbSize          = sizeof( WNDCLASSEX );
    wcx.style           = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wcx.lpfnWndProc     = Window :: WindowProc;
    wcx.cbClsExtra      = 0;
    wcx.cbWndExtra      = sizeof( HANDLE );
    wcx.hInstance       = hInstance;
    wcx.hIcon           = LoadIcon( NULL, IDI_APPLICATION );
    wcx.hCursor         = LoadCursor( NULL, IDC_ARROW );
    wcx.hbrBackground   = ( HBRUSH ) ( COLOR_MENU + 1 );
    wcx.lpszMenuName    = NULL;
    wcx.lpszClassName   = className;
    wcx.hIconSm         = LoadIcon( NULL, IDI_WINLOGO );

    RegisterClassEx( & wcx );

    hWnd = CreateWindow( className, appName, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                         CW_USEDEFAULT, CW_USEDEFAULT, wndWidth, wndHeight,
                         NULL, NULL, hInstance, ( LPVOID ) this );

    ShowWindow( hWnd, nCmdShow );
    UpdateWindow( hWnd );

    return TRUE;
}

VOID Application :: Run()
{
    MSG msg;

    while ( GetMessage( & msg, NULL, 0, 0 ) )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
}

VOID Application :: OnDestroy()
{
    PostQuitMessage( 0 );
    
    lresult = 0;
}

ビルドして下さい。次のような画面が立ち上がると思います。
f:id:hidakas1961:20120916003112j:plain:w200

とりあえず今回はここまで。