【COBOL】コンピュータ将棋【開発日記2】

ハードルを下げる

こんにちは。

アレグラが手放せない今日この頃。皆様いかがお過ごしでしょうか。

私は少し進捗がありました。

COBOLでコンピュータ将棋を作り始めましたが、これは結構な工数がかかるとすぐにわかりました。

山の高さにうんざりしたのですが、そんな時は昔読んだこの本を思い出し、ひとつずつ、ひとつずつ、である。

勇者も最初はLv1なのです。レベルを下げて、ひとつずつやりましょう。

どうぶつしょうぎ

目をつけたのはどうぶつしょうぎ

現役女流棋士北尾まどか氏が考案し、同じく女流棋士である藤田麻衣子氏がイラスト・デザインを担当されたという、 盤面3×4の計12マス、駒8枚の小さなかわいい将棋です。

先ずはどうぶつしょうぎCOBOLで作ってみましょう。

ただ、私はけっこう心配性と言いますか、念には念を入れる所があります。

作戦にはB案を用意するし、1錠飲んで下さいと書かれた薬は2錠飲みます(冗談です!)。

最初はもっとハードルを下げて、そして広げていくやり方がいいですね。

最初なのでライオンだけ

そんなわけで、先ずはライオンだけで動くちょっとしたものを作りました。

ソースはこちら

github.com

一部こちらに載せます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SIKOU.
      * ------------------------------
      * 思考
      * IN
      *   BAN
      *   TE
      * OUT
      *   GOUHOUSHU
      *   GOUHOUSHU_C
      *   R-FLG
      * ------------------------------
       ENVIRONMENT DIVISION.
       DATA DIVISION.
         WORKING-STORAGE SECTION.
         01 W_I PIC S9(1).
         01 W_J PIC S9(1).
         01 W_NEXT PIC S9(2) VALUE ZERO.
         01 WKIJ.
           03 I PIC S9(1).
           03 J PIC S9(1).
         01  WTIME.
           03 HH PIC 9(02).
           03 MM PIC 9(02).
           03 SS PIC 9(02).
      * ------------------------------
         LINKAGE SECTION.
      * ------------------------------
         01 BAN.
           03 RO OCCURS 4.
             05 CU OCCURS 3.
               07 KOMA PIC S9(2).
      * 手
         01 TE.
           03 TENOW.
             05 I PIC S9(1).
             05 J PIC S9(1).
           03 TENEXT.
             05 I PIC S9(1).
             05 J PIC S9(1).
      * 手番
         01 TEBAN PIC X(1).
      * 合法手
         01 GOUHOUSHU.
           03 GOUHOU OCCURS 12.
             05 GTE.
               07 I PIC S9(1).
               07 J PIC S9(1).
      *  合法手数
         01 GOUHOUSHU_C PIC S9(1).
      * リターンフラグ
         01 R-FLG PIC X(1).
      * ------------------------------
       PROCEDURE DIVISION USING BAN, TE, TEBAN,
                                GOUHOUSHU, GOUHOUSHU_C, R-FLG.
      * MAIN SECTION
         MAIN-S.
      *    ライオン位置取得
           PERFORM VARYING W_I FROM 1 BY 1
             UNTIL W_I > 4
            PERFORM VARYING W_J FROM 1 BY 1
              UNTIL W_J > 3
                EVALUATE KOMA OF BAN (W_I W_J)
                    WHEN 24
                      MOVE W_I TO I OF TENOW
                      MOVE W_J TO J OF TENOW
                    WHEN OTHER
                      CONTINUE
                END-EVALUATE
            END-PERFORM
           END-PERFORM.
      *
      *    合法手を生成
           CALL 'GENEMOVES'
             USING BAN, TE, TEBAN, GOUHOUSHU, GOUHOUSHU_C, R-FLG
      *    移動先を決定
           IF R-FLG = '0'
             THEN
      *        適当な移動先を決める
               ACCEPT WTIME FROM TIME
               COMPUTE W_NEXT
                     = (SS / 9) + 1
               IF W_NEXT > GOUHOUSHU_C
                 THEN
                   MOVE GOUHOUSHU_C TO W_NEXT
                 ELSE
                   CONTINUE
               END-IF
               MOVE I OF GTE(W_NEXT) TO I OF TENEXT
               MOVE J OF GTE(W_NEXT) TO J OF TENEXT
             ELSE
               CONTINUE
           END-IF.
      *
           EXIT PROGRAM.
         MAIN-E.

プレイするとこんな感じです。

$ ./main 
盤
   1  2  3
1 11 12 13
2 21 22 23
3 31 32 33
4 41 42 43
--
oLi:後手ライオン
*Li:先手ライオン
--
先手あなた、後手コンピュータ
--
--------------------
01
先手番です。
 11 oLi  13 
 21  22  23 
 31  32  33 
 41 *Li  43 
手を入力してください。
4241
--------------------
02
後手番(コンピュータ)です。
 11 oLi  13 
 21  22  23 
 31  32  33 
*Li  42  43 
--------------------
03
先手番です。
 11  12  13 
 21  22 oLi 
 31  32  33 
*Li  42  43 
手を入力してください。
4131
--------------------
04
後手番(コンピュータ)です。
 11  12  13 
 21  22 oLi 
*Li  32  33 
 41  42  43 
--------------------
05
先手番です。
 11  12  13 
 21  22  23 
*Li  32 oLi 
 41  42  43 
手を入力してください。
3121
--------------------
06
後手番(コンピュータ)です。
 11  12  13 
*Li  22  23 
 31  32 oLi 
 41  42  43 
--------------------
07
先手番です。
 11  12  13 
*Li  22  23 
 31  32  33 
 41  42 oLi 
手を入力してください。
2112
--------------------
08
後手番(コンピュータ)です。
 11 *Li  13 
 21  22  23 
 31  32  33 
 41  42 oLi 
--------------------
09
先手番です。
 11 *Li  13 
 21  22  23 
 31  32  33 
 41 oLi  43 
手を入力してください。
1213

ちょっとまだバグもあるんですけど、先ずは形を作るとやりやすいです。

昔、新入社員研修で悩んでいたら、元プログラマの社長からアドバイスいただきました。

「先ずはこまかく、部分を作るといいよ」と。

これは本当にそうだな〜と思いました。