覚えていますか?
1983年 「ウォーゲーム」という映画がありました。当時は米ソ冷戦、核戦争とコンピューターをテーマにした作品でした。最終場面で三目並べゲームが出てきます。どう頑張っても引き分けにしかならないのでした。あれから40年くらい。まさか21世紀においてこの映画にリアリティーが出てくるとは?!
Easy-ISLispにTCLTKのライブラリを整備しましたので、テストがてら三目並べを書いてみました。
イメージ
必ず引き分けになる
映画で人工知能のジョシュアは三目並べが必ず引き分けになることから、核戦争ゲームに勝者がいないことを学ぶのでした。ほんとに引き分けになるのかな? GUIのテスト用なので思考ルーチは手抜きです。大丈夫? 大丈夫みたいです。
コンピューター側は後手の☓です。思考戦略は下記のとおりです。
初手 先手が真ん中に打ってきたら左上角に打ちます。先手が真ん中以外に打ってきたら真ん中に打ちます。
その後
コンピューターがリーチなら勝ちを取ります。
人間がリーチなら妨害します。
両者ともにリーチでないなら空いている角をとります。
いずれでもない場合にはどこか空いているところをとります。
コードは下記のとおりです。
;; first step
(defun computer1 (i j)
(cond ((and (= i 1) (= j 1)) (setq init nil) (list 0 0))
(t (setq init nil) (list 1 1))))
;; after first step
(defun computer2 ()
(block after
;; if computer player one-more, get win
(let ((res (one-more-p 2)))
(if res (return-from after res)))
;; if human player one-more, disturb win
(let ((res (one-more-p 1)))
(if res (return-from after res)))
;; if not one-more, occupy corner
(let ((res (computer-free-corner)))
(if res (return-from after res)))
;; other case occupy free position
(let ((res (computer-free)))
(if res (return-from after res)))))
単純なゲームだと案外単純な思考ルーチンでもイケるもんですね。
与太話
さて、Easy-ISLispのTKはうまくいってるようです。調子にのって与太話
ロシアのプーチンさんが三目並べのことをしらないはずはありません。ゲームが単純化すれば最後まで手を読み切れます。もしもロシアが原子炉を攻撃する、あるいは局所戦術核兵器を使ったらNATO加盟国は核ミサイルを全弾ロシアに向けて発射すると宣言するとゲームは単純にならないものでしょうか?(あくまで妄想ですよ) 不毛で不幸な戦争が終わることを願っております。