Clean Architecture で将棋エンジンを作ろうぜ☆(^~^)?

あぽぽぽぽーん☆(^~^) 公開下書き

前の記事

20201216shogi62.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 将棋エンジンの思考部って Enterprise Business Rules の Entities に全部含まれるよな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ Clean Architecture にするも何も、もともと できてるじゃないか☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Application Business Rules の UseCases との絡みを考えましょうよ?」

  • 指し将棋をする
    • 初期局面から
    • 指定局面から
  • 詰将棋をする
  • 検討をする

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ だいたい こんなもんで、リーグ戦をするとか floodgate に放流するとかは GUI の方の機能だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Controlls が いわゆる USIパーサー、 SFENパーサーで、
Presenters が いわゆる 盤のコンソール表示だろ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 パーサー部と、盤を動かす部分を分けてないよな☆ むしろ 直結した方が手短……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 まあ、分けてみようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 指し将棋って 英語で 何て言うんだぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Shogi よ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ちょっと捻って Match にするか……☆」

20201216shogi62a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Match って なんだか分かんないな……☆
Match に向かって ready ok とか呼び掛けないだろ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 将棋エンジンは Behaviour Driven Development ではないんで☆」

20201216shogi62a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Regular bout にするか……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 駒落ちだって Regular bout 足りえるでしょ!」

20201216shogi62a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Regular rule match で☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 普通に Play でいいのでは☆?」

20201216shogi62a4.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ちょっと捻って Playing で☆」

class Playing:
    UsiOk(
        engineName: string,
        engineAuthor: string
    )

    SetOption(
        name: string,
        value: string
    )

    ReadyOk( )
    UsiNewGame( )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 疑似コードで書くとこんな感じだぜ☆
usiok では、エンジン名と 著者名だけ Engine の実装から渡せるようにしようぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 それっぽく なってきたな☆」

class Playing:

    // ループ2つ目
    Position( )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ position って パースして どうモデルにするんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 Position オブジェクトにしろだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 きふわらね ちゃんはまだ Bonanza 6.0 も、 Stockfish の知識も無くて、 Position というオブジェクトは持ってないわよ?」

class Playing:

    GoPonder( )

    // `timeout` - millisecond or "infinite"
    GoMate(string timeout)

    GoInfinite( )

    // Go( string btime, string wtime, string byoyomi, string binc, string winc )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Go( ) は複雑なので後回しで☆」

class Playing:

    Stop( )
    PonderHit( )
    GameOver( string result )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ だいたい こんなもん……、あとは Go( ) か……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 2014年時点では フィッシャー・クロック・ルールは無かったからな☆ 追加しとこ……☆」

<書きかけ>

何度でもクリック!→

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

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

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

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

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

ボードとは?

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位 の最近の記事