はじめに

今回の作品の紹介です。今回私はプログラミング言語にLISPを 用いた自己学習型の陣取合戦ゲームを考えました。ちなみに これは大学の授業のレポートに向け作ったプログラムを 少しいじくったものです。

ゲームの説明

このゲームは16マスの升目に自分とコンピュータが 3隻ずつ戦艦を配置し、相互に攻撃しあい、どちらが早く 相手を全滅させるかというものです。戦艦の数が 減るとそれだけ攻撃できる回数が減ります。相手より先に1隻目を 破壊できれば3対2の戦いとなり、勝つ可能性がぐんと上がります。

コンピュータに「癖」を付けたい

一般的なプログラムでは現在時刻をseed(種)として乱数を発生し、 ランダムに攻撃して来ます。しょせん機械との対戦であり、 全く予想の付かない乱数と戦うわけです。それではユーザ側も面白くないので ユーザの癖等に併せて戦術を変化させるような 癖のあるコンピュータだったら面白いかも 知れません。そこで何とかコンピュータ側に人間と同様の「癖」の様なものを 付けさせられないかと考えました。

コンピュータに癖を付けよう

もしも完全にランダムであれば人間側から見ると、まったく癖のない 相手に見えるはずです。しかしそれでは先程述べたとおり、 面白くない。それにプログラミングのなかに「癖」にあたる部分を書いてしまう と、今回は単純なゲームなので必勝法のようなものが生まれてしまう。 しかし、もし、人間側の攻め方をみて、 記憶し、それに基づいて戦術をコンピュータが組み立てていけば 各々のユーザの対戦相手は「癖」をもち、かつ、対戦した相手によって コンピュータ自身も各々独自の「癖」を持つことになるだろうと考えました。

完全にランダムであればコンピュータが勝負に強くなることは 分かっていますが、敢えて弱くなってもいいから癖が付くようなプログラム にしたいと思いました。 そのようなプログラムを書くのは別にC言語でも 可能ですが、敢えてLISPを選んだ理由はうまく作ればLISP特徴の1つ、 プログラムの自己増殖が可能という特徴を用いて コンピュータの 判断部分までも相手に合わせて変更することが可能であると考えたからです。

ゲームの実行風景

次に実行画面の御紹介をします。下の図が実行画面です。

ゲーム実行画面

これが今回作ったプログラムの実行画面です。(実行画面が貧相だ!と言う突っ 込みは禁止!)このような感じのゲームで相手の艦を3鑑全て沈めるのが目的です。 見て頂けるとお分かりでしょうが、私が一隻コンピュータに沈められた 瞬間を捉えたものであります。私はコンピュータ相手になかなか勝てません。 修業が足りないみたいです。また、右の方の升目に付いている×印は 私が砲撃した升目を示すのですが、見事に偏っています。 コンピュータの方にもこのような癖を持ってもらいたいのです。

現段階では・・・

まだまだプログラミングの技術が足りず、完全な完成には至っておりませんが、 中々強いコンピュータに育っています。(あまり勝てない)

さいごに

今回は用いた題材が陣取合戦という非常にルールが簡単なゲームであるという ことで、少し面白みに欠けたかも知れません。しかし、このアイデアを用い、 例えば将棋のゲームで、定石にとらわれること無く、コンピュータが 相手の指し方を学習し、考え、(強くはならないかも知れないが) 相手にあわせた戦術を 展開ようなものが作れると 全くあたらしいゲームとして 非常に面白いことになると思います。

そうすれば自分の育てたプログラムと他の人の育てたプログラムを戦わせるよう な、新しい楽しみ方も生まれるでしょう。実現すれば とても面白そうですね。

プログラムのソース

ソースへのリンクです。著作権は全て私(中川 nakira@cogni.cs.kumamoto-u.ac.jp) に帰属します。転載は自由ですがクレジットを記載して下さい。(する奴はいるのか?) プログラムはVineLinux2.1.5上のGCL(GNU Common Lisp) Version(2.2.2)上で 動作確認を行っております。未完成であることをお断りしておきます。
ソース

ホームページに戻る