読者です 読者をやめる 読者になる 読者になる

白黒はっきりつけようじゃないか

開発

久々(半年振り!)にゲーム制作に手を出してみました。
この前まではシューティングゲームを作っていたのですが、もともとゲームを作ろうと思ったきっかけは、将棋ゲームを作ることが目的でした。多少プログラムにも慣れたことだし、今回はより将棋っぽいのということで、オセロにチャレンジしてみます。
 
シューティングと比べてボードゲームの一番難しいところが、"読み"。
自分がオセロをやっている時、漠然とした「ここに置いたら良さそう」と思ったときのその根拠は何なのか、そこをきっちりと文章化しなければならないのが大変でもあり、面白さにはまってしまう要因でもあります。
 
とりあえず解説ページなどを参考に一人用で遊べるようになったので、Yahoo!オセロで腕前を判定してしました。
 
 
弱い。全然勝てない・・・。
参考にしたページにあった戦略は、

  1. 角を取られないようにする
  2. 角を優先的に取るようにする

だけでした。これではさすがに勝てない、ということで、改良を加えていきます。
 

Lv2 次に石を置ける箇所が多いほうがいい

一手打った後の着手可能位置を、なるべく多い場所に打つようにしました。こうすることでなるべく自分の石を中央に寄せる効果もあるのだとか。
 

Lv3 石はあまり取らないほうがいい

最初に欲張りすぎると、周りが自分の石ばかりになってしまい、置くところがなくなってしまいます。そこで序盤は相手の石と自分の石の差分を、評価値に加えるようにしました。終盤では逆に、たくさん取ったほうがプラスに働きます。
 
 

勝てない・・・。敗因の分析

ここまで改造しても、Yahoo!オセロでは全然勝てません。序盤は悪くないのですが、中盤以降端を取るようになるとダメなようです。
そこで、自分の読みをもう一回まわして「自分がここに置いた場合、自分だったら次にどこに置くか」を考えさせました。ここから本格的に"読み"を作り始めます。
 
 

Lv4 一手読み Ver.1.01

なんか弱くなってるような気がする・・・。
評価値がちゃんと働いていないのか、角の斜め横とかに平気で置こうとしてしまうミスが。
 

Lv5 一手読み Ver.1.02

これまでの評価軸を整理。現在の盤面に対して固定の点数と、仮に打ったときに与えられる点数のクラスを分け、評価値も調整してみました。
写真は自分とCPUとの対戦の結果。もちろん自分が黒。まだ全然弱いです*1
 
 

初勝利! だがしかし。

ここでYahoo!オセロ初勝利! だけど、冷静に見ると実力が上がっているわけではなさそう。たまたまと考えた良さそうです。
他の人と戦うとボッコボコにされてしまうのは、どうも端の攻防がヘボいせいだと気づきました。隣に敵の石があるのに平気で置いたりするので、あっという間に端を占拠されてしまいます。
これまでは「角の隣は−40点。それ以外の1段目は+20点」という感じで評価値を決めていたのですが、これだと平気で相手の石の隣に石を置いてしまったりするのです。
これでは勝負にならない。端を強化しなければ!
 
 
この前の三連休から作り始めてなんとかここまで来ました。
最初にも書きましたが、自分の思考をプログラムに、言語に置き換える作業にはかなりハマるものがあります。分からないときはすごく悩むけど、解決法が分かるとすごく楽しい。
そろそろ盤面の保存機能や一手戻しといった、インターフェースのほうにも手をつけたいのだけど、当面は無理だろうな・・・。来週は端の攻防の強化に心血を注ぐことになりそうです。

*1:自分はプログラムの弱点を知っているので、という部分もあるけど