グローバル変数と永久ループを失礼して

専門学校でプログラムを学んだ時、紙にフローチャートを書いてC言語に落とし込むMS-DOSのコマンドを呪文書のようにノートに書き取った通りに打ってコンパイラを起動する。そんな授業を週に数回、半年ほど受けた。

そして課題はmain関数からサブルーチンひとつふたつほどで完結するものばかりで、高専から来ていた谷周太郎といつも競争で課題をしていた。だいたい谷が勝つ。谷が勝つと残りの学生は何人か谷のデータをフロッピーにコピーして名前を変え、平然と教官に持っていく。だから、負けるときというのは谷の次に書いていても4番目5番目になることが多かった。

それはさておき、指導として終了条件のないループとグローバル変数は極力使わないということが周知されていた。出来ない子は最後の手段として使って、後の方に課題を出す。だが大橋遼平は結構速いのだがグローバル変数と永久ループで課題を解決し、別室に呼ばれて説教を食らっていた。外に漏れる声を聞いていたら「先生そんなん言うけど」と食い下がっていた。

それでプログラム授業では優等生だった俺だが、卒業制作にはゲームソフトでなくコンピュータグラフィックスで取り組むこととしていた。面白いからただただ夢中で取り組んだ。

ただ映像芸術としてその道で仕事がある人というのはその当時は雲の上。プログラマなら職が見つかるということでそうしたが、バイトしていたメディックス社でゲームグラフィックの担当はCGというよりデザイン学校を出た美術さんのみでフォトショップでの手描き1枚絵でアニメーションや3Dは会社的に手を出せないでいた。

それもさておき、自分でゲームを作ろうとしたら1枚絵と文字で進むアドベンチャーがせいぜいで、アクションゲームとかシューティングゲームは作れないでいた。家でネットを介してゲームシステム開発キットをダウンロードしてシューティングを作ってみたことはあるが、キットがないと作れない。つまり模型で言うとプラモデル組み立て状態でフルスクラッチにずっと憧れを抱いていた。

会社での仕事にも飽きてゲーム会社を夢見ていたある日のこと、転職活動としてゲームシステム開発キットで作ったゲームをキットで作ったと明かして作品として2社から面接を受けた。そのうちの片方にどうにかこうにか紛れ込むと、そこはもう会社と読んでいいのかどうか、会社っぽい部屋の一角とゲーム筐体からむき出しのコードが絡まって作業机のパソコンとつながっている現場で、下っ端としてスクリプトを書く仕事が与えられた。

俺が組みたいのはスクリプト部でなく子供の頃からゲームがどう動いているか知りたいコアの部分だと、勝手にLANでつながった技術チーフのパソコンにアクセスした。

そこはなんと!

グローバル変数と終了条件のないループの開始の宣言であった。

それから俺はまた家でプログラムに没頭して自作のゲームを何本か作ってネットで売ってみた。さらに人の紹介で大手ゲーム会社の下請けのオフィスに入れてもらった。その現場は仕事がすべてソフト化されており、机にはひとり1台のパソコンと2画面の液晶パネルが全員に与えられ、誰もが画面に向かって何かを打ち込んでいる。俺はそこで仕事中にお茶ではなくペットボトルのコーラを飲んでゲップをして怒られた。

さらにそれからネットで売ったゲームが誰の作であるのか、俺がひとりで全部作ったと言っても誰にも信じてもらえない状態になって困惑していた。画像の一部に市販のゲームから画像をパクって使ったようなやつは著作権法侵害の問題で訴えられたりしたらニュースになるのかもだが、そうでなくそっとサーバーから消されて何の連絡もないということもあった。

ただ、グローバル変数と永久ループで作ったゲームは開発が滞っている。飽きたとか諦めたとか嘘だったとかではなく、作った自分も時間が経つとあの時の狂気は何だったのかと思うようなプログラムでそれ以上手の加えようがないのだ。

そこで再び学校で習ったようにグローバルと永久ループを無くした設計でゲームを組み直そうと試みた。

定数の宣言やサブモジュールの組み込みであっという間に1日が過ぎ、しかし全体像は先に作って掴んだはずなのに、グローバルと永久ループで書くのと違って遅々として進まない。

それはもう、そうやって作ろうとしたらそれでひとりで全部作ったなんて信じられないのも無理のない話だろうなと分かるようになった。結局人はひとりで把握できるもの以外のものをひとりで作ることは出来ない。

ゲームを作る時は大量のグローバル変数にコード中の何処で何がメモリされているかで頭がいっぱいで、小学生になる姪っ子が1足す1が2と習ったのに、そうではないケースがあるとか言うと「きょーすけ、いちたすいちもわからへんねんって」と笑われるほどの始末である。

学校の先生はゲームをしない人でパソコンは実務処理に使うべきであると主張して「放っといたら良いやん、そんな名プログラマー。迷惑の迷と書いて迷プログラマーなんやから」と語っていたなぁとふと思い出すのであった。

学校にプログラマの先生は二人いて、教えてもらった先生には連絡がつかないが、もうひとりの先生には仕事でお世話になたことがあり連絡がついた。将棋コンピュータの大会については「頑張ってください」と言葉を頂いたが、考えたら教わったことの殆どを無に返したかも知れない。明後日に大会を控えて、なんとなくそんなことを思い出した。

「たけわらべ」と俺本人が指してみたぜ!(追記あり)

竹部女流プロデュースの将棋ソフト「たけわらべ」と俺本人が対局してみたぜ!

f:id:karmen:20201118131515p:plain

# KIF形式棋譜ファイル
# Generated by Shogidokoro
手合割:平手
先手:人間
後手:TakeWarabe20201118 MaterialLv999 5.32 64AVX2
手数----指手---------消費時間--
1 7六歩(77) (00:04 / 00:00:04)
2 8四歩(83) (00:27 / 00:00:27)
3 2六歩(27) (00:12 / 00:00:16)
4 3二金(41) (00:10 / 00:00:37)
5 7八金(69) (00:23 / 00:00:39)
6 8五歩(84) (00:04 / 00:00:41)
7 7七角(88) (00:03 / 00:00:42)
8 3四歩(33) (00:08 / 00:00:49)
9 6六歩(67) (00:10 / 00:00:52)
10 3三金(32) (00:10 / 00:00:59)
11 5八金(49) (00:06 / 00:00:58)
12 9四歩(93) (00:25 / 00:01:24)
13 8八銀(79) (00:17 / 00:01:15)
14 4二玉(51) (00:06 / 00:01:30)
15 6七金(58) (00:03 / 00:01:18)
16 4四金(33) (00:04 / 00:01:34)
17 6八角(77) (00:08 / 00:01:26)
18 3二玉(42) (00:24 / 00:01:58)
19 7七銀(88) (00:03 / 00:01:29)
20 4二銀(31) (00:23 / 00:02:21)
21 6九玉(59) (00:01 / 00:01:30)
22 5四歩(53) (00:06 / 00:02:27)
23 7九玉(69) (00:02 / 00:01:32)
24 3一角(22) (00:04 / 00:02:31)
25 8八玉(79) (00:04 / 00:01:36)
26 3三銀(42) (00:04 / 00:02:35)
27 5六歩(57) (00:04 / 00:01:40)
28 2二玉(32) (00:10 / 00:02:45)
29 4八銀(39) (00:03 / 00:01:43)
30 3五歩(34) (00:19 / 00:03:04)
31 4六歩(47) (00:06 / 00:01:49)
32 3四銀(33) (00:16 / 00:03:20)
33 4七銀(48) (00:03 / 00:01:52)
34 3三桂(21) (00:02 / 00:03:22)
35 1六歩(17) (00:21 / 00:02:13)
36 1四歩(13) (00:14 / 00:03:36)
37 1七香(19) (00:39 / 00:02:52)
38 9五歩(94) (00:12 / 00:03:48)
39 5七角(68) (00:47 / 00:03:39)
40 7四歩(73) (00:02 / 00:03:50)
41 6五歩(66) (00:13 / 00:03:52)
42 6二銀(71) (00:20 / 00:04:10)
43 6六金(67) (00:06 / 00:03:58)
44 7三銀(62) (00:03 / 00:04:13)
45 6七金(78) (00:07 / 00:04:05)
46 8四銀(73) (00:03 / 00:04:16)
47 7八玉(88) (00:10 / 00:04:15)
48 5一金(61) (00:10 / 00:04:26)
49 1八飛(28) (00:28 / 00:04:43)
50 4一金(51) (00:07 / 00:04:33)
51 6八角(57) (00:23 / 00:05:06)
52 7三桂(81) (00:02 / 00:04:35)
53 5七金(67) (00:04 / 00:05:10)
54 6四歩(63) (00:13 / 00:04:48)
55 同 歩(65) (00:07 / 00:05:17)
56 同 角(31) (00:06 / 00:04:54)
57 1五歩(16) (00:31 / 00:05:48)
58 同 歩(14) (00:03 / 00:04:57)
59 同 香(17) (00:02 / 00:05:50)
60 1三歩打 (00:08 / 00:05:05)
61 3六歩(37) (00:24 / 00:06:14)
62 同 歩(35) (00:16 / 00:05:21)
63 同 銀(47) (00:02 / 00:06:16)
64 6五歩打 (00:16 / 00:05:37)
65 6七金(66) (00:23 / 00:06:39)
66 3五歩打 (00:02 / 00:05:39)
67 2五銀(36) (00:11 / 00:06:50)
68 同 桂(33) (00:03 / 00:05:42)
69 同 歩(26) (00:02 / 00:06:52)
70 同 銀(34) (00:17 / 00:05:59)
71 4七金(57) (00:19 / 00:07:11)
72 1四歩(13) (00:08 / 00:06:07)
73 4五歩(46) (00:40 / 00:07:51)
74 3四金(44) (00:04 / 00:06:11)
75 3七桂(29) (00:25 / 00:08:16)
76 2七銀打 (00:03 / 00:06:14)
77 4八飛(18) (00:47 / 00:09:03)
78 2六銀(25) (00:02 / 00:06:16)
79 2五桂(37) (00:20 / 00:09:23)
80 同 金(34) (00:04 / 00:06:20)
81 1四香(15) (00:02 / 00:09:25)
82 同 香(11) (00:16 / 00:06:36)
83 4四歩(45) (01:01 / 00:10:26)
84 同 歩(43) (00:02 / 00:06:38)
85 4二歩打 (00:04 / 00:10:30)
86 3一金(41) (00:04 / 00:06:42)
87 3四桂打 (00:11 / 00:10:41)
88 3三玉(22) (00:02 / 00:06:44)
89 4六金(47) (00:17 / 00:10:58)
90 3七銀成(26) (00:06 / 00:06:50)
91 切れ負け (00:34 / 00:11:32)
*時間切れ
まで90手で時間切れにより後手の勝ち

ちょうど良い勝負だけど無念の切れ負け。まあ形勢的にもたぶん負けかな。

f:id:karmen:20201118134345p:plain

追記:たけわらべ対将棋ベーシック改の棋譜です。

# KIF形式棋譜ファイル
# Generated by Shogidokoro
手合割:平手
先手:人間
後手:TakeWarabe20201118 MaterialLv999 5.32 64AVX2
手数----指手---------消費時間--
1 7六歩(77) (00:07 / 00:00:07)
2 8四歩(83) (00:27 / 00:00:27)
3 5五角(88) (00:16 / 00:00:23)
4 4二玉(51) (00:12 / 00:00:39)
5 5八金(69) (00:18 / 00:00:41)
6 3四歩(33) (00:02 / 00:00:41)
7 7七角(55) (00:17 / 00:00:58)
8 同 角成(22) (00:05 / 00:00:46)
9 同 桂(89) (00:12 / 00:01:10)
10 8五歩(84) (00:05 / 00:00:51)
11 6五桂(77) (00:31 / 00:01:41)
12 7七角打 (00:04 / 00:00:55)
13 投了 (02:07 / 00:03:48)
まで12手で後手の勝ち

投了したのは13手目で本来指してはいけない1五角打を指してしまって入力できないため。どうも玉の点数が高いから詰め将棋を自動で詰ませると信じていたのが、両王手に近い局面で玉交換の先を読んでいるという「おバカ」をしているようです。

てかまあ、詰まされ局面以外でそれで負けたら勿体ないなぁ。もちょっといじるか。

和製最強探索部みたいのを目指して書き始めた

週末の電竜戦で実質の負け確から「やっぱ勝ちたい」と思ったのですが。

まあ、一番人気が予想される「みずうら王」も賢い人が組んでいるわけだし、自分のスキル(技術/仕事能力の意)で何ができるかというと地道な設計が一番得意なので、早く結果が欲しいと求められる現場仕事で突貫工事能力を上げて組み上げた将棋ベーシック改よりも、純粋な探索機能で採用されているやねうら王探索部よりもエンジンに採用されるような探索部を書いたらええんちゃうと思ってVC立ち上げました。 

class ShogiBoard {public: ShogiBoard(); ~ShogiBoard();
enum TEBAN { SENTE = 0, GOTE, };
enum KOMAKIND{ OU = 1, // 王将 HIS, // 飛車 KAK, // 角 KIN, // 金 GIN, // 銀 KEI, // 桂馬 KYO, // 香車 HU, // 歩 RYU, // 龍 UMA, // 馬 NARIGIN, // 成銀 NARIKEI, // 成桂 NARIKYO, // 成香 TO, // と BLANK, // 空白 };
union KOMAOBJ { TEBAN teban; KOMAKIND kind; };
KOMAOBJ m_board[81];};

実は整理するとデータ構造これだけで良くないかと。やねうら王も海外のチェスサイトで新版が出るたびにパクってきて改造して解読した結果を日本語解説するという開発手法でやっているように見受けたので(違ったらごめんなさい)

純和製でも丁寧に将棋に必要なデータを1ビットずつ割り出せば必要最小限になってVC++コンパイラ最適化を信用するならこのデータ構造が一番速いはず。

実は数字で描いている将棋ベーシック改とほぼ同じデータ構造なのですが、マジックナンバー使いまくりでプログラム中に数字が出てくる行儀の悪いのより、VC++での参加者が多いならVC++のコードで書いたほうが良いのかなと。

あ、今読み返したら「81」も数字やけど、これは流石に「分かれや」です。

しかし今から3日で探索部として仕上げて電竜戦に間に合わせるのはちょっと厳しいかもだぜ。まあ今後も大会があって開発者も読みに来てくれたら何かの役に立つかも。

あと盤面だけでなく手駒もデータ構造いりますね。また書き足します。


🄫1999-2023 id:karmen