COREWAR

/
Step 23: お手本観察:条件比較命令「SEQ / CMP」で敵を探す
🎯スキャナーで0400番地の敵を検知して撃破する(0/1)

ミッション一覧 (全30ステップ)

第1章:画面とメモリの基本 (1-6)
BASIC★☆☆
Step 1: 時間を進める「STEP」ボタン
🔒
BASIC★☆☆
Step 2: プロセスの停止と「RESET」での復旧
🔒
BASIC★☆☆
Step 3: 「編集できる状態」と「実行中の状態」EDIT
🔒
BASIC★☆☆
Step 4: メモリの箱の3つの部屋(右の部屋 B を変える)EDIT
🔒
BASIC★☆☆
Step 5: 左の部屋(A)と右の部屋(B)を書き換えるEDIT
🔒
BASIC★☆☆
Step 6: 「数値(#)」と「番地($)」の記号の違いEDIT
第2章:代表的な命令とループ (7-13)
🔒
ARITHMETIC★☆☆
Step 7: 足し算の命令「ADD」の観察
🔒
ARITHMETIC★☆☆
Step 8: 足す「数値(A)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 9: 足す「相手の場所(B)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 10: 引き算の命令「SUB」を使ってみようEDIT
🔒
BASIC★☆☆
Step 11: 箱を丸ごとコピーする命令「MOV」EDIT
🔒
CONTROL★☆☆
Step 12: 時間を巻き戻すジャンプ命令「JMP」EDIT
🔒
CONTROL★☆☆
Step 13: 簡単なプログラムを作ろう(自動カウンター)EDIT
第3章:ノイマン型とデジタル生命 (14-18)
🔒
BASIC★☆☆
Step 14: なぜ「DAT」が爆弾になるのか?EDIT
🔒
BASIC★☆☆
Step 15: 自分自身の命令をコピーする(コード=データ)EDIT
🔒
BASIC★☆☆
Step 16: お手本観察:最古の生命体「Imp」をSTEP実行する
🔒
BASIC★☆☆
Step 17: Impの簡単な変更(コピー先の観察と実験)EDIT
🔒
ARITHMETIC★★☆
Step 18: 間接参照(@ポインタ)の仕組みを知るEDIT
第4章:伝統的アルゴリズム (19-24)
🔒
STRATEGY★★☆
Step 19: お手本観察:爆撃機「Dwarf」をSTEP実行で解剖する
🔒
STRATEGY★★☆
Step 20: Dwarfの簡単な変更(爆弾の間隔を変える)EDIT
🔒
STRATEGY★★☆
Step 21: 実戦デビュー:爆弾の間隔を調整して標的を破壊せよEDIT
🔒
CONTROL★★☆
Step 22: お手本観察:分裂命令「SPL」と増殖の仕組み
🔒
CONTROL★★☆
Step 23: お手本観察:条件比較命令「SEQ / CMP」で敵を探すEDIT
🔒
STRATEGY★★☆
Step 24: お手本観察と変更:防衛罠「Imp-Gate」でImpを止めろEDIT
第5章:実戦改造と総合演習 (25-30)
🔒
STRATEGY★★☆
Step 25: 【Stone(石)】高速爆撃機の観察とステップ幅の改造EDIT
🔒
STRATEGY★★☆
Step 26: 【Paper(紙)】自己複製スウォーム「Mice」を観察する
🔒
STRATEGY★★★
Step 27: 【Paperの改造】クローン投下距離を変更して増殖せよEDIT
🔒
STRATEGY★★☆
Step 28: 【Scissors(鋏)】索敵スキャナーの観察とスキャン間隔の改造EDIT
🔒
STRATEGY★★★
Step 29: 【Trap(罠)】敵の魂を誘拐する「Vampire」の観察と改造EDIT
🔒
STRATEGY★★★
Step 30: 卒業試験:愛機のチューニングと総合バトルEDIT
🟢 編集モード(セルをクリックして変更できます)
[番地][命令 (Opcode)][A (左の値)][B (右の値)]
📦 データ領域 / 爆弾 (DAT)
0000
▼MOV
#
$
👈 ここを変更
0001
▼MOV
<
<
0002
↺JMN
$
$
0003
❖SPL
@
#
0004
+ADD
#
$
0005
↺JMP
$
$
0006
■DAT
$0
$0
++ 命令を追加
0007
■DAT
$0
$0
0008
■DAT
$0
$0
0009
■DAT
$0
$0
0010
■DAT
$0
$0
0011
■DAT
$0
$0
0012
■DAT
$0
$0
0013
■DAT
$0
$0
0014
■DAT
$0
$0
0015
■DAT
$0
$0
0016
■DAT
$0
$0
0017
■DAT
$0
$0
0018
■DAT
$0
$0
0019
■DAT
$0
$0
0020
■DAT
$0
$0
0021
■DAT
$0
$0
0022
■DAT
$0
$0
0023
■DAT
$0
$0
0024
■DAT
$0
$0
0025
■DAT
$0
$0
0026
■DAT
$0
$0
0027
■DAT
$0
$0
🏟️ARENA (20 ROWS)SCOPE: 0000 - 0019
[メモリ空間 800番地 (20行 × 40列)]左のエディタと1対1で同期
P1: 0
P2: 0
CYC: 0
📖 講義ノート // STEP 23 OF 30第4章:戦闘用Warriorの解剖と並列・知覚制御⏱ 読了目安:約5分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

感覚器(SEQ / CMP)による条件分岐——「盲目の爆撃」から「知覚による狙撃」への進化

メモリの中身を見比べて次の命令をスキップする条件分岐が、デジタル生命に「眼(知覚フィードバック)」を与える

#SEQ / CMP (Compare)#Conditional Branching#Skip-Next-Instruction#Closed-Loop Feedback#Scanner Archetype
🔬Step 23: お手本観察:条件比較命令「SEQ / CMP」で敵を探す

Dwarfは何もない空地にも盲目的に爆弾を投げますが、「スキャナー(Scanner)」 は 眼(比較命令 SEQ / CMP) を持っています!

2行目の SEQ.I @3, $4 は、 - 「ポインタ(@3)が指す遠くのマス」と「空っぽの基準箱($4=DAT #0, #0)」を見比べます。 - もし同じ(=ただの空地)なら、次の3行目(MOV 爆撃)をスキップして飛ばす! - もし違う(=敵がいる!)なら、スキップせずに3行目の MOV でそこへ爆弾を撃ち込む!

🎯 やってみよう 1行目(0000 番地)のスキャン歩幅 A(左の数値) が #0 で止まっています。これを #8 に変更して [PLAY] を押し、0400 番地の敵を見つけ出して精密狙撃しましょう!

1. 盲目のDwarf(オープンループ)と眼を持つScanner(クローズドループ)

Step 19〜21で扱った爆撃機Dwarfは、強力ではあるものの「眼(感覚器)」を一切持っていませんでした。そのため、狙った番地が空っぽの荒野(DAT #0, #0)であろうと敵の陣地であろうとお構いなしに、毎回必ず1サイクルを使って『MOV』で爆弾を投げ続けていました。制御工学では、このように外界の状態を観察せず一方的に動作し続ける仕組みを「オープンループ制御(開ループ制御)」と呼びます。

それに対し、このStep 23で登場した『スキャナー(Scanner)』は、比較命令『SEQ(Skip if Equal:同じなら次をスキップ/旧名 CMP)』という「眼」を持っています! ・まず遠くのメモリ番地を覗き見る(Scan)。 ・もしそこが「空っぽの空地(DAT #0, #0)」なら、爆弾を投げる行(MOV)をスキップして時間を節約し、すぐ次の番地の調査へ向かう! ・もしそこが「空地ではない(=敵のコードがある!)」なら、スキップせずに次の行の『MOV』を実行し、発見した敵へピンポイントで爆弾を撃ち込む! このように外界からの情報(フィードバック)に応じて行動を切り替える知的な仕組みを「クローズドループ制御(閉ループ制御)」と呼びます。

[0000] ADD.AB #8, $4   ──► 1. Advance scan pointer by +8
[0001] SEQ.I  @3, $4   ──► 2. Compare remote cell (@3) with blank DAT ($4 = [0005])
         │
         ├── If EQUAL (Empty space) ──► SKIP Line 0002! Jump straight to [0003] JMP!
         └── If NOT EQUAL (Enemy!)  ──► Do NOT skip! Execute [0002] MOV to snipe!
[0002] MOV.I  $3, @2   ──► 3. Snipe the detected enemy with a DAT bomb!
[0003] JMP.A $-3, #0   ──► 4. Repeat scan loop

2. CPUにおける「条件付きスキップ(Skip-Next)」のアーキテクチャ

高級言語の『if (A == B)』という条件分岐が、機械語のレベルでどのように実現されているかを見てみましょう。 CoreWar(ICWS-94)の比較命令『SEQ.I A, B』は、非常にシンプルかつ美しいルールで動きます。 ・ALUが「Aが指す箱」と「Bが指す箱」の中身を丸ごと(.I修飾子)比較する。 ・もし2つの箱の中身が【完全に一致(Equal)】していたら、通常は『PC + 1』に進むはずのプログラムカウンタを『PC + 2(1行飛ばして2つ下の行)』へと進める! ・もし2つの箱の中身が【不一致(Not Equal)】だったら、通常通り『PC + 1(すぐ下の行)』へ進める。

初期の多くのRISCプロセッサやマイクロコントローラ(PICマイコンやARMの条件実行など)でも、この「条件が満たされたら次の1命令をスキップする(Skip Next Instruction)」というハードウェア機構が広く採用されてきました。なぜなら、次の1命令(今回の『MOV』)を無効化(NOP化)するだけで済むため、ジャンプ先番地を複雑に計算するよりも回路が単純になり、わずか1行の追加で「敵がいないときはMOVを飛ばし、敵がいるときだけMOVを実行する」というif文が完成するからです。

3. スキャン歩幅の最適化と「自己スキャン回避」

今回のミッションでは、1行目(0000番地)のスキャン歩幅を『#0』から『#8』に変更することで、0004番地のポインタ(初期値 #388)に8を足して『396』にし、ポインタ自身の番地(0004)からの相対距離『0004 + 396 = 0400番地』に潜んでいた敵を1発で見つけ出して狙撃しました。

注意深い方は、2行目の『SEQ.I @3, $4』の右オペランド『$4』が、0001番地から4つ下にある『0005番地(DAT.F #0, #0)』を指していることに気づいたでしょう。なぜポインタ箱である 0004番地(DAT.F #0, #388)ではなく、わざわざ 0005番地に「もう1つの空っぽのDAT #0, #0」を用意して見比べているのでしょうか? それは、アリーナの大半を占める「誰もいない空地」の中身が『DAT.F #0, #0』だからです! 0005番地に置いた「無垢な空地の見本(DAT #0, #0)」と遠くのマス(@3)を見比べることで、相手がほんの少しでも命令や数値を置いていれば「見本と違う=敵発見!」と100%確実に検知できるのです。

🔒

🔒 MISSION CLEAR で講義ノートの全編が解放されます

上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)