昨日の報道ですが、オセロ考案者の長谷川五郎さんが、20日に亡くなったそうです。
すぐに何か書こうと思ったけど、昨日は忙しくて書けませんでした。
僕は氏のことを全然知らない。
オセロの開発話は本やテレビで何度か見たことがあるし、それなりには知ってる。
でも、氏に対しての思いは特にない。
それで訃報を書くのもどうかと思うのだけど、オセロに関して思うところはいろいろある。
ちょうどよい機会だし、偉大な方だと思うので、自分の思い出を少し書こうと思う。
テレビゲームが子供の遊びの主役となる前、どこの家にも将棋やオセロなんかがあったと思う。
人生ゲームなんかもあるのだけど、あれは大人数で遊ぶ時用。
オセロなら、2人いれば十分で、しかも短時間で遊ぶことができた。
僕は兄弟が多く、兄や姉とよく遊んだのだけど、大抵は負ける。
小学校低学年の頃だったから、まだ論理性が身についていない。
オセロは、「多くとれる」ところを責めると、自分の色の駒がたくさん並んだ状態を作り出してしまう。
それは、とりもなおさず相手にとって「多くとれる」ことを意味する。
だから、闇雲に攻めちゃいけない。でも、そんなこともわからずに闇雲に攻めていたのだった。
小学校4年生の頃だと思うが、ゲームセンター向けにオセロのゲームがあった。
白黒画面で、○と×で駒を示しているやつ。
それを見たときは、「コンピューター相手にオセロができるんだ」とは思ったのだけど、お金を出してまでやろうとは思わなかった。
小学生にとって 100円は大金だし、オセロだったら家に持っているから。
#注:まだゲームセンターに小学生が行っても問題なかった時代。
よく、金もないのにゲームセンターに入り、人のプレイやアドバタイズを見るだけでわくわくしていた。
そして、小学校6年の頃だったと思う。
オセロの販売元のツクダオリジナルが、オセロを遊べる家庭用テレビゲーム機を発売していた。
実はセガ SG-1000 の互換機で、カートリッジを入れないときはオセロが起動するようになっている。
おもちゃ屋の店頭に、遊べる状態で置いてあったのだけど、この「人工知能」に対して…確か、強さを選べて、一番弱い場合だったとは思うのだけど…必勝法を見つけ出した。
コンピューターは、こちらが同じ手を出せば、全く同じ手を出してきた。成長がなかった。
それで、5~6手進めただけで、すべて自分の色になってゲーム終了、という手順があった。
この手順を発見して、その店の店頭を通るたびに、わざわざ「完勝」して、誇示するようにその画面のままにして去ったのだ。
コンピューター相手にオセロをやったのは、たぶんこれが初めてなのだけど、「コンピューター、馬鹿だな」と思っていた。
中学生になり、ファミリーベーシックを入手した。
面白くもないゲームを作ることが楽しかったのだけど、ある日ベーマガに「オセロ」のプログラムを見つけた。
他機種用。でも、人工知能ってとても高度なもので、BASIC で簡単に組めるとは思わなかった。
興味を持って、プログラムを読んでみるのだけど、何をしているのかどうも意味が分からない。
プログラムのほとんどは、オセロのルール…挟んだらひっくり返るとか、ひっくり返せない場所にはおけないとか、そういう細々したことを実現するためのものだった。
人工知能らしい、高度な部分はない。
人工知能の思考ルーチンはと言うと、盤面の中で「駒を置ける場所」を見つけたら置いてしまう、と言うだけ。
ただし、置ける場所の順番は示されていて、単にマス目を端から見ていくのではない。
ふーん、すると、この順番に何か秘密が隠されているんだな。
ファミリーベーシックに移植して遊んでみる。
そのプログラムは、それほど強くはなかったけど、適当に相手をしても勝てない程度には強かった。
石を置く順番…取るべき優先順位は簡単な話で、盤面の四隅は最優先。
その隣は、最も優先順位が低かった。
オセロでは「駒を挟むとひっくり返せる」というのが最重要ルールだ。
でも、隅にあると絶対に挟めないから、自分の駒を置くと相手にとられない。
安全地帯なのだから、何よりも優先して確保しなくてはならない。
そして、相手の駒を挟む形でしか新しい駒は置けない。
隅の隣に駒を置かなければ、相手に隅を取られることはないことになる。
だから、隅の隣を迂闊に取るのは悪手。優先順位を下げないといけない。
でも、単純に優先順位をつけるだけでは、「多くとれるところ」を見逃すことにもなりかねない。
プログラムを改良して、位置の情報に「優先順位」フラグを付けた。
置ける場所が見つかっても、同じ優先順位のところがまだあるなら、そちらにも置けるか試す。
一番多くの駒をひっくり返せるところの位置は覚えておいて、同じ優先順位の場所が無くなったところで、「一番良いところ」に駒を置く。
ちょっとした改良で、ちょっとだけ強くなった。
これを友達に渡して遊ばせたら「何度か遊んだけど一度も勝てなかった」と言われた。
僕が遊ぶと、アルゴリズムを知っていることもあって、これでもかなり弱い。
一度も勝てないはお世辞じゃないかと思ったけど、そいつは思考ゲームは嫌いだったので、適当に遊んだら勝てなかったのかもしれない。
まがりなりにもオセロの思考ルーチンを考えたことがあったので、興味を持ってはいた。
その後、たしか雑誌の「ログイン」で、森田和郎さんが「森田オセロ」の解説をしていた。
森田和郎さんというのは、当時の有名プログラマで、オセロとか将棋を作るのを得意としたのね。
もっとも、ゼビウスに類似したゲームを、当時の非力なマシンで作り上げて、ナムコの許可を得て販売したりもしている。
アクションゲームも十分作れるし、複雑な思考ゲームも作れる。凄腕のプログラマだった。
話がそれたけど、森田オセロでは、もちろん「駒を置く位置」も考慮しているけど、それでいくつの駒をとれるか、置いた駒の周辺に空きマスはないか(空きマスがあれば、そこに相手が駒を置くことでひっくり返されやすい)、など、多くのパラメーターに点数をつけることで複合的に置く場所を決めているという。
そして、何より大切なのが「先読み」だった。
駒を置ける可能性のある場所はいくつもある。
その中でどこに置くかを決めるのに上に書いたように点数を使うのだけど、一番高得点のところに置けばいいというものではない。
そこに置いたとしたときに、次に相手はどんな戦略をとれるか。ここでも得点を出し、一番高得点のところに置くとする。
じゃぁ、それに対して今度は自分は…これを数手繰り返せば、先読みができる。
たくさんひっくり返したけど、その次の手でそれを全部取り返される、なんて間抜けな手を打たなくなる。
森田和郎さんの記事では、αβ狩りも説明されていた。
ややこしいので詳細は省くけど、先読みの範囲を絞り込んで、効率よく最善手を見つけ出すための方法。
実は、先読みまでするオセロを試作したことはあるのだけど、未完成なまま飽きた。
大学の時に Lisp 言語を入手したのね。
Lisp なら人工知能だろうって、当時の浅い知識で短絡してオセロを作り出した。
先読みルーチンを作るには、「今の盤面の状態」を記憶したまま、次々と「先読みした盤面」を作り出す必要がある。
具体的にいえば、先読みのために1階層深くサブルーチンを呼び出すたびに、新しいメモリを確保して盤面を保持した配列をコピーしないといけない。
関数に対して配列が渡せれば簡単なのだけど、C言語ではそのようなことは出来ない。
もちろん、BASIC でもできない。そもそも BASIC にはサブルーチンはあっても関数はない。
でも、Lisp は元からそういう言語構造だった。
データは呼び出しの際にコピーされる。だから先読みプログラムを作りやすい。
で、先に書いた通り、未完成なまま飽きた。
Lisp に慣れておらず、何か処理しようとするたびに方法を考えないといけなかったし、そもそも Lisp は「人工知能のアセンブラ」と言われるくらい、アセンブラのように命令が貧弱だった。
(…という考え方が間違っているのは、今ではわかっている。でも当時の僕はそう思った)
それ以降、こうした思考ルーチンは面倒くさくて作ってない。
興味はあるから、それなりに話を追いかけてはいるけれど。
もう、長谷川さんの訃報とはほとんど関係なくなっているね。
以上、オセロに関する僕の思い出話でした。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |