2023-10-22に更新

CgfGoBan112を改造しようぜ(^~^)? (2023年)

他の記事

📖 CGFGoban109を改造しようぜ☆(^~^)

cgfthink

x86

多分、 cgfgoban.exe が恐らく x86 なので、 cgfthink.dll も x64 ではなく x86 で作らなければいけないと思う

構成の種類

アプリケーション( .exe )ではなく ダイナミック ライブラリ.dll )に変更

ヘッダーファイルが読み込めない場合

cgfthink.h が上手く読み込めない場合は、 #include "cgfthink.h" の箇所に そのファイルの内容をベタ書きする

cgfthink.c ファイルのエンコード

UTF-8 with BOM

CgfGoBanで cgfthink.dll を使って対局するときは

Computer(GTP) ではなく Computer(DLL) を選ぶ

文字化けを直す

以下のように直せばいいが、関連する他の箇所も直さないといけない。自力で頑張って欲しい。説明省略

// printf()の代用関数。
void PRT(const wchar_t* fmt, ...)
{
    // 可変長引数か?
    va_list ap;

    int len;
    static wchar_t text[PRT_LEN_MAX];
    DWORD nw;

    if (hOutput == INVALID_HANDLE_VALUE) return;
    va_start(ap, fmt);

    len = _vsnwprintf_s(text, PRT_LEN_MAX - 1, _TRUNCATE, fmt, ap);
    va_end(ap);

    if (len < 0 || len >= PRT_LEN_MAX) return;

    WriteConsole(hOutput, text, (DWORD)wcslen(text), &nw, NULL);
}

const char*

Original:

    char* str[4] = { "・","●","○","+" };

Refactoring:

    const char* str[4] = { "・","●","○","+" };

LPCWSTR

Original:

SetConsoleTitle("CgfgobanDLL Infomation Window");
````

Refactoring:  

```cpp
// 関数名の末尾にA が付いた
SetConsoleTitleA("CgfgobanDLL Infomation Window");

📖 Set console title in C++ using a string

_vsnprintf

Original:

    len = _vsnprintf(text, PRT_LEN_MAX - 1, fmt, ap);

Refactoring:

    // 関数名に w が含まれ、末尾に _s が付いた
    // _TRUNCATE という引数が増えた
    len = _vsnwprintf_s(text, PRT_LEN_MAX - 1, _TRUNCATE, fmt, ap);

Fail GetProcAddress() .. 2

多分、もともと .c のファイルを .cpp にすると おかしくなるのかもしれない。

cgfgoban

大変なのでcgfgoban.cppは改造しない方がいい

st

大変なのでcgfgoban.cppは改造しない方がいい

Original:

```c++
char *st[5] = { "+","●","○","★","☆" }; // 埋まったのが黒。空洞が白


Refactoring: ```c++ const char *st[5] = { "+","●","○","★","☆" }; // 埋まったのが黒。空洞が白

他同様

sBC

大変なのでcgfgoban.cppは改造しない方がいい

Original:

```c++
static char *sBC[SBC_NUM] = {
"●","◆","★",
"○","◇","☆","◯", // 0x819b, 0x81fc,コードが違う。
"┏","┯","┓",
"┠","┼","┨",
"┗","┷","┛",
"・","-","+",
"|","-","+",
"┌","┬","┐",
"├","╋","┤",
"└","┴","┘",

};


Refactoring: ```c++ static const wchar_t *sBC[SBC_NUM] = { L"●",L"◆",L"★", L"○",L"◇",L"☆",L"◯", // 0x819b, 0x81fc,コードが違う。 L"┏",L"┯",L"┓", L"┠",L"┼",L"┨", L"┗",L"┷",L"┛", L"・",L"-",L"+", L"|",L"-",L"+", L"┌",L"┬",L"┐", L"├",L"╋",L"┤", L"└",L"┴",L"┘", };

他同様

PRT

大変なのでcgfgoban.cppは改造しない方がいい

Original:

```c++
void PRT(char *fmt, ...); // 可変のリストを持つprintf代用関数


Refactoring: ```c++ void PRT(const char *fmt, ...); // 可変のリストを持つprintf代用関数

文字列

大変なのでcgfgoban.cppは改造しない方がいい

Original:

```c++
MessageBox( ghWindow, "CgfGoBan's Internal Error!\nIf you push OK, Program will be terminated by force.", "Debug!", MB_OK);


Refactoring: ```c++ // 文字列の頭に L を付けた MessageBox( ghWindow, L"CgfGoBan's Internal Error!\nIf you push OK, Program will be terminated by force.", L"Debug!", MB_OK);

他同様

LPSTR, LPWSTR

大変なのでcgfgoban.cppは改造しない方がいい

Original:

```c++
LPSTR lpStr;


Refactoring: ```c++ // W が付いている方に思い切って変える LPWSTR lpwStr;

他同様

char xTmp[256]

大変なのでcgfgoban.cppは改造しない方がいい

Original:

```c++
char sTmp[256];


Refactoring: ```c++ // 仕方ないので、思い切って変える wchar_t sTmp[256];

Original:

```c++
sprintf( sTmp,"%d手",tesuu);


Refactoring: ```c++ wsprintf( sTmp,L"%d手",tesuu);

Original:

```c++
nLen = strlen( lpwStr );


Refactoring: ```c++ nLen = wcslen( lpwStr );

📖 vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, _vsnwprintf_s_l

Original:

```c++
for (k=0;k<SBC_NUM;k++) if ( strncmp(p,sBC[k],2) == 0 ) break;


Refactoring: ```c++ for (k=0;k<SBC_NUM;k++) if ( wcsncmp(p,sBC[k],2) == 0 ) break;

芋づる式に変える

strcpy

大変なのでcgfgoban.cppは改造しない方がいい

Original:

c++ strcpy(lpStr,SgfBuf);

.

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント