85DATA OTHELLO PAGE ホームへ
MYCARオセロプログラムの作り方掲示板BLOGプロフィール

OthelloPage HOME → プログラムの移植


クルマ(AE86=倉庫代わり)を廃棄したため、その中に入っていたパーツがダンボール5箱になってしまいました。
そんな訳で物置と押し入れを整理(不要なものは棄てて)していると、 
押し入れの箱の中から、高校の時のアルバム、写真、レポート用紙などなど・・・・懐かしい
そんななかに、1枚のフロッピィディスク(2DD)がでてきました。

ラベルを見ると”オセロ”と書いてあります。
「そうそう、高校3年の時に作ったヤツだ」 思い出しました。
※正確にはシャープX1にて製作、その後 富士通FM77に移植したモノ

ちょっとした「タイムカプセルを開けた」感じです。
「20年前のオレが作ったソフト・・・確かめたい・・・・やってみたい」
・・・・という訳で、”懐かしさついで”にWindows版に移植してみましたよ。

1. まずはコンバード (旧機種FM77フォーマット→DOSフォーマットへ)

出てきたフロッピィは、この2DD
FM77AV用です。(南野洋子さんがイメージキャラだったのですね)
※もちろん実機はありません。


「オセロ」って書いてあります。
このフロッピィは古いので当然、現在のパソコンで読み取る事は出来ません。

そこで、FM−TOWNS登場です。
(TOWNSもFM77に比べると相当新しい)

FM7エミュレータ(TOWNS用) EM7に付属のコンバートツール使いました。
※FM77AVの実機が無い為に、エミュレータ本体は動作しません。(実機からROMデータを抜き出す必要があります)

幸いにして、BASICソースをアスキーセーブ(※)していたのでコンバートが出来た訳です


※データをコンバートした後、フロッピィを仮想化したかったのですが、もう2度と読めなくなってしまいました。なぜでしょう?
フロッピィが既に限界状態だったのか?それともTOWNSのフロッピィドライブがフロッピィを壊しちゃったのか???
ソイツが残念です。FM7エミュレータで「そのまんま」を動作させたかったなぁ

2.テキストファイルからF−BASIC97へコンバート(手作業) 

元のFM77による作成はオールBASICではありませんでした。機械語にて先読みMIN-MAX処理をおこなっていました。「置けるか判定」と「石を裏返す」という単純処理も機械語です。その箇所だけ追加作成です。
ソースの大半はそのまま利用出来て、さほど手間はかかりませんでしたね。(機械語エリアを盤にしていたので、それをBASICの配列変数に置き換える事は修正しました。小変更として「石の描画」程度です)

3.どんな思考ロジックか?

 このオセロ(リバーシ)ソフトは、私が高校3年の時に作成したものです。
はっきり言って、「オセロ素人」です。もちろん現在も私自身の強さに変化はありません。(いや弱くなっているかな)
そんな私が作った思考ロジックは、全く参考にならないはずです。オセロ経験者からすれば、全くの的外れだと思います。

と言う訳で、このソフトは相当弱い部類ですが、どのように作成したかを簡単に説明します。
(それでもレベル3においては、作者自身より強いです。ほとんど勝てません)

 私が一番最初にオセロを作成したのは、ポケコンPB−700という機種でした。
その時は「隅から置ける場所を探して置けたら置いちゃう」という、まるで思考とは言えないモノでした。
(そんな単純な処理なのに、コンピュータが石を置くのに10数秒かかっていたという記憶があります。ポケコンのBASICって遅かったんですね)

 次に考えたのが、「置いてから評価する※」です。例えば、隅に置けたら+100点、辺がコノ形なら+30点と言った具合に盤位置の評価値を累計する仕組みです。人間側も評価してコンピュータ−人間 = 評価とします。
※もちろん、「置いてから」と言っても画面の表示上は置いていませんよ。内部での処理の話です。
この辺の評価パターンを多くする事によって、ある程度は「考えているみたい」になってきました。
また、「置ける数」と「確定数」※も評価に加えます。
※序盤、中盤は少なく返すのが基本でしょう。(相手の石を多く返してしまうと次に自分が置ける場所が減ってしまう。最終的には不利な場所に置かざるをえなくなる)
また、隅も含めて最後まで変化しない石があることは良いというようにしました。これを確定数と言います。なお確定数は辺のみの計算による近似値になります。
これが、レベル0です。
ソコソコ遊べる仕様ですが、やはり終盤に弱いですね。

 そこで、先読みを行なう処理を追加しました。2手先読み(コンピュータ→人間)して評価するのがレベル1、3手以上先読みがレベル2です。
複数の選択肢がある場合、相手が自分にとって一番不利になる手を打ったと仮定し、その中から最高の手を選択する。
例えばAとBと2箇所の選択肢がある場合,Aの次に相手が自分にとって最悪の手を選択した場合とBの次に相手が最悪の手を選択した場合を比較し最高の手を打つ・・・と言った考え方です。
これは2手先読みの場合です・・・レベル1がこれに相当します。
3手以上の場合も考え方も同様なのですが、少し考え方は複雑(?)になります。
ポイントは先読み終了時点まで読んでから、評価をボトムアップしていくというロジックになっています。
(これをmini-max法と言う基本的な考え方らしいです。当時、名前は知りませんでした。と言うか独自で考えた私って「すごいじゃん」
多分、上記の説明では解りずらいでしょう。興味のある方は"mini-max"で検索かけてみて下さい


レベル3は終盤ラスト10手の全てのパターンで読み取ります。
10手目がコンピュータだった場合の選択肢の中で、そこに置いたらnパターンある中の勝率から最善位置に置くという仕組みです。

実はこのソースを見て気が付いたのですが、「終盤読みきりルーチン」の考え方間違っていました。
この勝率というのが、そもそも誤りですね。
人間のミス(悪手)も含めて、勝率50%の箇所と、コンピュータのミス(悪手)も含めて、勝率50%の箇所では重みが違いますよね。

具体例では、10手目にAという場所に置いて、それ以降コンピュータが常に最善手を打っていけば勝率100%なのに、コンピュータが悪手を置く場合も勝率にカウントしてしまっているので50%になってしまう場合もあります。
10手目にBという場所に置いて、それ以降人間が最善手を打ち、コンピュータも最善手を打って60%の勝率だとします。
この場合だと後者を選んでしまうのです。つまりAに打てば絶対勝てるのに、可能性60%のBに打ってしまうということです。

このバグ(?)も、敢えて直していません。

あくまでも、「トモ高校生バージョン」オリジナルのままなのです。

(2008.3.15加筆)
 レベル3では、当初(移植した直後では)全くと言っていい程勝てませんでした。
高校生の時には5回に1回くらいは勝てていたような記憶があるだけに、自分自身が弱くなってるのでしょう。
(と言うか勘が鈍っている?)
しかし、最近では4回やって3回勝ちました。
やっぱり弱いオセロソフトなんだな → 勝って「勘が戻ってきた」のは嬉しいのですが、ソフトが弱いのはあんまり嬉しくないですね。
(しかし、その翌日は2回やって2回負けています・・・前日と累計すると6戦3勝です。実力としては当ソフトの方が少し強いかな?)
そんな訳で、このソフトがどの程度の実力なのかは非常に興味がありまして、色々なオセロ(リバーシ)ソフトを試して対戦させてみました。
しかし、私が楽勝で勝てる相手(コンピュータソフト)にも、このソフトは負けてしまいました。
きっと、私の考え方をプログラミングしているので、ミスが無い分(先読みも正確に行ないますし)
”私だけには圧倒的に強い”・・・のかもしれません。
とにかく、”全ての相手にとって強いプログラムでは無い”のでしょう。

やはり、(自分で作成したソフトが)負ける→弱いというのは、悔しいものです。
もちろん、最強のオセロソフトを作りたいと思っている訳ではありませんが、ある程度の安定した”強さ”は追求していきたいと、最近考えるようになりました。
 そこで、オセロの事を調べてみましたら、とても親切に解説が載っているサイトを発見しました。
”さきとぴよのオセロこうざ”と言うサイトです。リンクさせていただきました)
「なるほど!」と思える事が多く、自身の強さをアップしてみたいと思いました。

そのうち、高校生バージョンからバージョンアップするかもしれません。
(・・・いつになるかは分かりません。私自身が強くならねばなりませんので・・・・)

(2008.3.22加筆)
 私のオセロソフトがなぜ弱いのか何となく解ってきました。ハッキリ言えば私のプログラム技術の無さです。
  (他にも要因があるとは思いますが一番の要因でしょう)
色々調べて見ると、先読みの深さが(私のソフトと比べ)全然違います。
その割には、他のソフトは優秀で高速で先読みを行なえるんですよね。
先読みレベルを深くすれば、ある程度の強さになりそうなのですが、かなり待たされてしまいます。
20数年前のプログラムを単純移行しただけなので、現在の言語に焼直せば速度は期待できるかもしれません。
現在はαカットとβカットもしてないのでmini-maxをα-βに直してみようかな。

(2008.5.4加筆)
 先読み速度の向上を図る為に開発言語をF-BASIC97からActive−BASICに変更してみました。
また、α−βを実装し、処理速度は当初の3〜5倍程度(?実測していません)になりました。
その為に3手先読みならば、瞬間的(?)に処理が可能となり、4手先読みでも、それほど待たされることは無くなりました。
(それでも他のソフトに比べると「遅い」「弱い]です)