数値解析Ⅱ 「オセロプログラムの作成」 班員 荒木 岸 倉田 長田 井口 元輝 (班長) 一大 (プレイヤー) 紳一郎 (アルゴリズム) 州平 (プログラマー) 雄太 (広報) 我々は過去に多くのチームが挑み続けてき た「オセロゲーム」にとりくむことを決めた。 我々が目指す先は今日までに生み出され た数多くのプログラミングを超える、最強の オセロプログラムの制作である。 開発に基づき、我がチームはまず、個々の 役割を明確かつ詳細に分割することで作業 の効率化を図った。また、自由な発想が奇 抜で斬新な戦略を作り出すことを再確認し た上で、多方面からオセロを分析することを 徹底し、作り上げた案をスムーズにプログラ ミングに反映できる体制を構築した。 <使用したプルグラムソース> 工学社 「楽しく学べるJAVAゲーム・アプレット > (第3版) 以上のプログラムをまず班全員で作成し、プ ログラマーがプログラムを解析、班全員でオセ ロのルール調査及びアルゴリズムの検討した。 そしてプログラムの方向性を決め、元のプログ ラムを改変して実際に動かし、新たな改善点 を見出す、ということ繰り返してより強いプログ ラムを模索した。 <使用プログラム> ・ 人対コンピューターでオセロを行うプログラム。 JAVA Appletによるソースプログラムでブラウザ 上で動作する。 ・ 必ず人間が黒で先手。人間が勝つと次のゲー ムはコンピューターが白先手で始まり、コン ピューターが勝つと再び人間が黒の先手をとる。 ・ 途中終了のためのResetボタンと打つところの ない時ようにPassボタンがある。勝敗は盤面が すべて埋まった時のみ判断できる。盤面上が一 色または、双方が置けなくなった時はResetす るしかない。 • 使用プログラムの構成 初期変数を読み込み、{ゲームの初期 設定}を行った後、{プレイヤーの石の置 き場所選定}→{ある場所に石が置ける かどうかのチェック}→{コンピューターの 置き場所選定}→{ある場所に石が置け るかどうかのチェック}を繰り返し、{ゲー ム終了判定}で1ゲームが終わる。 ・重要な変数として、盤面の場所指定のためのstone[x]という 配列がある。 左上から盤面に番号xをつけ、黒の場合は1、白なら2、ない 時は0をこの配列に格納する。 0 8 16 24 32 40 48 56 1 9 17 25 33 41 49 57 2 10 18 26 34 42 50 58 3 11 19 27 35 43 51 59 4 12 20 28 36 44 52 60 5 13 21 29 37 45 53 61 6 14 22 30 38 46 54 62 7 15 23 31 39 47 55 63 <わが班の基本方針> ・ コンピューターの石の置き場の選び方において、元のプログ ラムソースのアルゴリズムは乱数によってランダムに置き場 所を指定し、{ある場所に石が置けるかどうかのチェック}を 通れば置くというものであった。しかし、これではまったく戦略 的ではなく、ランダムの置き場所指定が300回を超えるとパ スしまうので、いい手悪い手の判断がただの運頼みになって しまう。これでは強いプログラムになるはずがない。強いプロ グラムの作成には置き場所をどう判断するかが、最大の課 題となる。 ・ オセロを分析していく中で気付いたこと、それは有利な場所 と不利な場所があるということである。そこで我々は有利なと ころには高い、不利なところには低いポイントを設定し、この ポイントの高さに応じてコンピューターが置き場所を選ぶよう なプログラミングを作成した。 <ポイント制プログラム> ・ポイント制のプログラムの要はポイントの設定である。ポイントの設定をうま くすることで思い通りにコンピューターに打たせることが可能である。ここ で有利な場所、不利な場所がどのような場所なのか考える。例えば、角 は重要な場所であると言える。よってより有効である場所に置くように、 基本の盤面ポイントをpoint[x]という変数配列を作りxに場所、変数として 以下の図のポイントを代入する。 50 5 40 40 40 40 5 50 5 5 15 15 15 15 5 5 40 15 30 30 30 30 15 40 40 15 30 1 1 30 15 40 40 15 30 1 1 30 15 40 40 15 30 30 30 30 15 40 5 5 15 15 15 15 5 5 50 5 40 40 40 40 5 50 • しかし、この固定されたポイント表を適用したままでは 不具合を生じる場合が出てくる。例えば、先ほどのポ イント表に従うと、四隅と接する3マスは5ポイントと低 く設定されているが、 もしこの四隅に自分の石があれば、そのとなりに置 いても取られることはなく、むしろ置いておきたい有効 な手となり得る。 つまり、より強いプログラムを作るには、状況に合わ せて有利になるよう‘変化する’ポイント表の存在が 不可欠となる。 そこで我々はプログラムの中にif文を取り入れることで この問題を解消した。具体例をいくつか紹介したい。 <具体例> (Ⅰ)・・・四隅を取ったらその周囲は有利である。 (+40) つまり四隅の隣は、(もともとの5)+40=45となる。 ○ (+40) (+40) (+40) (Ⅱ)・・・たとえ端でも相手の隣には置きたくない。 (-15) つまり相手の石の隣は、(もともとの40)-15=25となる。 (-15) ○ (-15) (Ⅲ)・・・端から一つ離れた場所であっても、置くことでその列が すべて自分の石になる場合は置く。 (+14) (+14) (+14) ● ○ ○ ○ ● ● ○ ○ ● ● ● ○ また我々独自のプログラムに‘手数’に応じてポイントを変えるという ものを加えた。以下に示す。 (Ⅳ)・・・終盤(手数が49手以上)対角斜めがすべて自分の石であるなら四 隅から一つ隣におきたい。 (+5) (+5) ○ ○ ○○ ○○ ○ (+5) ○ (+5) <ポイント制プログラムの考察> 基本的に相手のミスには自分が有利になるように打つ プログラムであるため、的確にミスをついて来る。し かし、今の段階では自分から有利な状況を作り出す ことはできないので、相手が強い時は置き場が少な くなり、不利な場所に相手より先に打たざるを得な い状態になる。正直、まだ強いレベルではない。 結論として最強のプログラムを作るには、すべての盤 面の状況に対して最善の一手を打つように作れば いいわけであるが、もしそれを作ろうものならプログ ラムの数は天文学的な数となり、とても我々が作成 できる代物ではない。 オセロに限らず、ボードゲームでの強さとは、 目先の局面だけにとらわれず、相手の心を読 み、いかにして勝利というゴールにたどり着く かである。その道のりには数々の駆け引きが 存在するため何手も先読みできるだけの想 像力が不可欠になる。現時点でのプログラム にそれを理解させることは極めて困難である。 今回の課題を通じて感じたこと、それは人間 の「考える」という行為がどれほど複雑で偉大 で奥深いものであるか、ということである。
© Copyright 2024 ExpyDoc