オセロ


 

オセロは、 日本人によって考案された世界中で親しまれている極めて人気が高い

ゲームです。また、数百円前後でオセロのゲームソフトも買えるようになっています

。ここでは、ゲーム作りの一環としてオリジナルなオセロソフトを作ってみます。

 

まずは、オセロの盤面を表示するプログラムを考えてみます。プログラムの商業的

な利用は考えていないのでより本質的な記述だけに集中します。

 

以下に、 その十進BASICのプログラムを示します。後での利用を考えてプログラ

ムに行番号は振りません。

 

PROGRAM-OSERO-SHOKI-BANMEN.GIF - 6,090BYTES

 

図形を描く各種命令文については、 2Dグラフィックス3Dグラフィックスの所で

も詳しく説明します。

 

上のプログラムを実行した結果を以下に示します(図1参照)。

 

OSERO-SHOKI-BANMEN.GIF - 6,642BYTES

(図1、十進BASICによる2Dグラフィックス)

 

次に、石がある場所とその色のデータを記憶しておく所を二次元の配列を使って作

ります。  この配列をG(I,J)とします。  左下のマス目のデータはG(1,1)に格納さ

れ、右上のマス目のデータはG(8,8)に格納されます。 データについてですが、石

が白ならば0を黒ならば1をそして石がなければ2を格納することにします。  したが

って、 初期の盤面の状態ではG(4,4)とG(5,5)が0、 G(4,5)とG(5,4)が1、

、それ以外の要素はすべて2ということになります。

 

では、 初期盤面の状態をデータ化してみましょう。 そのプログラムは以下のように

なります。

 

PROGRAM-OSERO-SHOKI-BANMEN-DATA-KA.GIF - 4,770BYTES

 

上のプログラムにおいて、 後半の部分は格納されたデータをチェックする為のもの

なので、実際のオセロプログラムでは削除してください。

 

ここで、 オセロのルールを簡単にお浚いして置きます。  ゲームは初期盤面の状態

からスタートします。 先手の方(白石または黒石)が後手の方の石を横または縦そ

して斜めに挟むようにして取り、石の色を自分の石の色に変化させます。 これを交

互に繰り返して行き、 最終的に石の数の多い方が勝者になります。 相手の石を取

れない場合は自分の石を打つことはできません。したがって、石を打つ権利は相手

に自動的にパスされることになります。 また、石が取れるにも拘わらず意図的に石

を打つ権利を相手にパスすることもできません。以上がオセロのルールです。

 

白が先手でスタートした場合の白が打てる場所を紫の石で示します(図2参照)。

 

OSERO-SHOKI-BANMEN-SHIRO-SENTE-UTERU-BASHO.GIF - 7,055BYTES

(図2、十進BASICによる2Dグラフィックス)

 

第一段階として、人間と人間が戦う時に役立つプログラムを考えます。 人間とコン

ピュータが戦うより人工知能的(?)なプログラムは後で考えることにします。

 

プログラムのアルゴリズムとして次の二つが重要になります。

 

(1) 競技者が選んだマス目に石を打てるかどうかを判断して、打てない場合は競

技者に警告を出す。どこにも打てなければ、パスを指示する。

(2) 競技者が打った石に伴って取られる相手の石の位置を割り出し、 そこにある

石の色を取った側の石の色に変える。

 

最初に、 (1)から検討してみます。 横方向、 縦方向そして斜め方向で相手の石が

取れるかどうかを順番にチェックすることが必要になります。  それぞれの方向に関

して、石を打とうとしているマス目のすぐ隣に、相手の石があるかどうかを確認しま

す。 もし、 相手の石があれば、その方向の延長線上に自分の石があるかどうかを

さらに確認します。もし、自分の石があれば、そのマス目に自分の石を置くことがで

きます。

 

今、石を置きたいマス目の位置を(M、N)とします。 このマス目の周りには、最大8

つのマス目があります。  (M−1、N)、(M+1、N)、(M、N−1)、(M、N+1)、(

M−1、N−1)、(M+1、N+1)、(M−1、N+1)、(M+1、N−1)の 8つです。

これらのマス目のデータの一つが相手の石の色になっていれば、さらにその 延長

線上を調べることになります。 図2の場合では、(5、4)が黒石であり、 その上隣り

の(5、5)が白石であるため、 (5,3)に白石を置くことができます。 同様にして、(

6,4)、(3,5)そして(4,6)にも白石を置けます。

 

(2)については、 (1)の過程で石が置けると判った段階で取れる相手の石の情報

を得て石の色を変えればいいでしょう。  プログラムは、 メインプログラムと機能別

に分かれた 外部副プログラムで構成されます。 石が打てる場所を 予め自動的に

表示するために、外部副プログラムから 別な外部副プログラムを 呼び出すように

しています。以下に、その外部副プログラム名を示します。

 

INITIAL(初期の画面を形成する)

START(ゲームを開始しマス目が石で全て埋まれば終了する)

RESULT(ゲームの結果を表示する)

POSITION(STARTから呼び出され打てる場所を自動表示する)

 

プログラムの具体的なコードについては、次のリンクに飛んで確認してください。使

い方と共に説明しています。

 

オセロの全体プログラム(人間対人間)

 

初心者の方は、 上記のプログラムにバグがないかを調べてみてください。 市販の

ソフトと比較しながらチェックするとよいでしょう。 中級者の方は、盤面の表示をさら

に充実させたり機能を追加したりしてプログラムの修正を試みてください。  上級者

の方は、人間とコンピュータが対戦できるようにコンピュータ側のアルゴリズムを考

えてみてください。 人工知能的なプログラミングの良い訓練になります。 それぞれ

のアルゴリズムをネット上で競わせてみると、刺激があって面白いと思います。

 

課題(その1)

 

オセロプログラムのバグを効率よく見つける方法論を議論してください。 バグの数

が完全に0であるとどうすれば判断できますか。

 

課題(その2)

 

オセロの正式版は8X8ですが、 4X4または6X6の簡易版を作成してください。 そ

の場合、先手(または後手)の必勝パターンはありますか。

 

オセロの簡易版プログラム

三次元オセロのプログラム

 

図3に、ゲーム終了時の盤面を示します。オセロのフリーソフトと合わせるために、

最初に 示した初期盤面の白と黒の石の位置を 反転させてゲームを開始していま

す。

 

<黒の勝利、黒が39石で白が25石>

OSERO-SAISHUU-BANMEN.GIF - 10,196BYTES

(図3、十進BASICによる2Dグラフィックス)

 

上記の対戦に関する詳細な棋譜は以下のようになっています。 黒が先手で始まり

最終的に白の60手目で終わっています。

 

黒(4、6)->白(3、4)->黒(4、3)->白(3、6)->黒(3、5)->白(5、6)->黒(3、3)

->白(4、2)->黒(5、3)->白(6、4)->黒(6、5)->白(6、6)->黒(7、5)->白(6、

3)->黒(5、2)->白(8、5)->黒(8、6)->白(2、5)->黒(3、2)->白(6、2)-> 黒(

8、4)->白(7、4)->黒(7、6)->白(2、4)->黒(7、3)->白(8、3)-> 黒(6、1)->

白(2、3)->黒(4、7)->白(3、7)->黒(5、7)->白(6、7)->黒(6、8)->白(8、7)

->黒(5、8)->白(3、1)->黒(1、6)->白(2、6)->黒(4、8)->白(4、1)->黒(3、

8)->白(5、1)->黒(1、5)->白(7、1)->黒(1、4)->白(7、7)->黒(1、3)-> 白(

2、7)->黒(8、8)->白(7、8)->黒(8、2)->白(2、2)->黒(1、1)-> 白(7、2)->

黒(2、1)->白(1、2)->黒(8、1)->白(2、8)->黒(1、8)->白(1、7)

 

第二段階として、人間とコンピュータが戦うプログラムを考えます。 人間の思考過

程を理解する上でも役立つと思います。ただし、最終的に取れるであろう石の数を

考慮しつつ一手一手を読みながら打つ終盤を別にすれば、序盤・中盤での石の打

ち方にはあまり明確な定石はないように思われます。ここでは、次の二点を注意し

つつ、コンピュータに石を打たせることを考えます。

 

(1)四隅のマス目やその近傍のマス目など重要な場所を相手に取らせない。

(2)(1)を考慮しつつ、次に自分が打つことができる場所の数を最大化する。

 

以上から、中盤までは上記の点を評価関数化しそれに基づいて石を打ち、終盤は

最終的に取れる石の数を予想する読み重視の方法で石を打つようにします。

 

 

 

 


 

Topへ