SSブログ

Core Wars(月刊ASCII 1988年1月号6) [月刊アスキー廃棄(スクラップ)]

CoreWarsの記事
「第1回コア戦争トーナメント」をスクラップする。
ASCII1988(01)d01COREWARS_W520.jpg

対戦模様の写真をスクラップする。
ASCII1988(01)d02COREWARS_写真1_W520.jpg
ASCII1988(01)d04COREWARS_写真2_W520.jpg

優勝したECALLの解説が詳しい。
ASCII1988(01)d05COREWARS_リスト1_W350.jpg
 ECALLの名前(Enemy-CALL)は,このプログラムの動きをそのまま表現しているといえる.
 作者であるCatFace氏自身によれば,ECALLは,次のようなプログラムであるという
 まず,ECALLは,基本的にあまり攻撃的なプログラムではなく,また増殖も一切行わない.
 具体的には,(“SPL 0"爆弾ではなく)"JMP-8"爆弾を8番地間隔で投下していく.つまり,この爆弾が,相手の本体に命中するか,相手がこの爆弾の落ちた後を実行すると,そのプロセスは8番地前に分岐しながらメモリを遡っていくこことになる.
 うまくいけば,敵のこのプロセスは,ECALL本体までたどりつき,ECALL本体の後部に設けられたプールに蓄積される.そして,相手のプロセス(最大64個)がすべて集まったところでプールを破壊してしまうわけである.
 ただ,これだけではMICEなどに対して勝てるとは限らない.相手のプロセスが,“JMP-8"爆弾の攻撃間隔である8wordの間でループしているケースがあるからだ。
 そこで,ECALLでは,プール内に蓄えられた敵のプロセスを利用する!
 相手のプロセスをプールしておくだけなら,プールは、単純な無限ループで十分であるが,これでは,せっかく集まっているパワーがもったいない.この捕虜となった敵プロセスにもこちらの戦略の手伝いをしてもらおうというわけである.実際には,これらのプロセスは,“SPL 0"爆弾を絞殺爆撃しているのだ.
 このように,相手のプロセスも攻撃に利用しているため,ECALL自身はプロセスを増やさない.そのため、非常に効率良く,“JMP-8"爆弾の投下を行うことができる.
 CatFace氏によれば,こうしたECALLの基本的なアイディアは,ASCII-NET(PCS)の中で,誰かが「敵プロセスをどこかにまとめておき,それを破壊するというようなプログラムは出来ないだろうか」と書いてあったものを,彼流に考え,プログラムしてみたものであるという.
 ECALLのゲームでは,ほぼこのシナリオどおりの動きを画面で見ることができる.ECALLの“JMP-8"爆弾が画面の上から下へ向かって整然と投下されると,次に色の異なる相手のプロセスが,今度は下から上へ次々とこの上を伝わってプールに飛び込んでいく…(写真1).増殖しないタイプのコア戦士であれば,プールの入口にある"spl"命令によってあっという間に64個に増やされ,そのままやられてしまうのだ。


ECALLのアルゴリズム
 ECALLのプロセスが実行するのは、下に示した、プログラムの最初の4行のみである。
Main  MOV  Mis,@P
  ADD  #8,P
  MOV  MisM,MT
  JMP  Main
 この部分で、8番地おきに"JIMP-8"を書き込んでいく。ここでは,高速化のために、自分自身を書き換えないようにするためのチェックは一切していない。そのかわり,適当な位置に"DAT"命令を置いて、書き換えられる部分もちょうど"JMP-8"になるように工夫されている.ただ一カ所,"JMP-3になっている部分は、3行目で書き直して書き換えられるのを防いでいる。
 それでは、ECALLの残りの部分は何のためにあるのだろうか?実はこの部分は,敵のプロセスが実行するのである.
 相手のプロセスが,ECALLの落とした“JMP-8"爆弾をそれと知らずに実行してしまうと、次々に8番地前の“JMP-8"をたどってメモリを遡り,最終的にこのECALLの後半部分へ飛び込むようになっているのだ。
 この部分は、さらに大きく2つの部分に分けられる。最初の部分は,“JMP-8"爆弾をたどってきた相手プロセスが最初に飛び込む「入口」であり,次のようになっている.
ADD  SPL  0
  DJN  Pool,COUNT
  JMP  CLOSE
 プールに蓄積される敵プロセスは,必ず2行目の“DJN”命令を実行するため、64個目のプロセスが飛び込んで来たときには3行目の“JMP"命令が実行され,プールが破壊される。ちょっと考えると,これで十分敵を倒せるように思えるしかし、敵が“JMP-8"爆弾の隙間でループしているような場合には、これでは不十分である。
 そのような相手を確実に倒すには、繊殺爆撃を行うしかないのだが、自分でSPLして,“JMP-8"爆弾の投下と絨緞爆撃を同時に行うようにすると,それぞれのプロセスの実行速度が落ちてしまうという欠点がある。 この問題に対するECALLの解答は、「プールに蓄積した相手のプロセスに絨緞爆撃を行わせる」というものである。
 次に,プールの本体は,下に示したようになっている。
Pool  MOV  ADD,@C
  CMP  #30,C
  DJN  Pool,C
  MOV  #-30,C
  JMP  CH
 この部分で、相手のプロセスを利用して、“SPL0"爆弾を連続的に書き込んでいくのだ。
 ここで,「“DAT"命令を書き込んだ方が敵を確実に殺せて良いのではないか?」と考える人もおられるだろう。しかし,こうすると,もし敵の健全なプロセスがまだ生き残っていた場合,それがMICEの様な自己増殖型のプログラムであれば,一カ所で敵を殺すとSPLが可能になってしまうので,相手を復活させてしまうことにもなりかねない。プールに相手のプロセスがすべて集まるまでは殺さない,というECALLの戦略は妥当なものと考えられる。
 もちろん,ECALLにも弱点はある。例えば,相手が1プロセスで,しかも8word以下の部分でループしているような場合には,ECALLの戦略はまったく効果がない。また、相手をとらえる前にこちらが破壊されてしまう危険もある.実際,今回のトーナメント中の対戦でも、何回か繰り返してみると,実力を発揮する前にやられてしまうこともあるようだ。この辺りが今後の課題だろう.


PAR6のプログラムリスト
ASCII1988(01)d06COREWARS_リスト2_W318.jpg

PICKのプログラムリスト
ASCII1988(01)d06COREWARS_リスト3_W365.jpg

過去のスクラップ記事は
Core Wars(月刊ASCII 1987年7月号12)

Core Wars(月刊ASCII 1987年9月号6

Core Wars システムとアセンブラ(月刊ASCII 1987年9月号7

1対1の対戦ではなく、三国志のように3つのプログラムが戦うゲームはどうだろう。他の2つを滅ぼすようなプログラムができるのだろうか。漁夫の利を狙うプログラムができるのだろうか。4つ以上のプログラムで戦国時代のようなゲームをしてみたい。

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。