COREWAR

/
Step 21: 実戦デビュー:爆弾の間隔を調整して標的を破壊せよ
🎯0400番地の敵にDAT爆弾を命中させて撃破(勝利)する(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 21 OF 30第4章:戦闘用Warriorの解剖と並列・知覚制御⏱ 読了目安:約5分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

実戦空間におけるアドレス算術(Address Arithmetic)と初期オフセット校正

ポインタの配置番地・初期値・加算ストライドの3つを合成して、0400番地の敵を一撃で射抜く弾道計算

#Address Arithmetic#Pointer Calibration#Base + Offset + Stride#First-Strike Precision#Multi-Warrior Arena
🔬Step 21: 実戦デビュー:爆弾の間隔を調整して標的を破壊せよ

いよいよ初めての 敵(赤いWarrior 2) が右側のArena(0400 番地)に登場しました! 敵は 0400 番地で JMP $0 を繰り返して待ち構えています。

こちらのDwarfの宛先メモ(0003番地)には最初から #392 がセットされています(0003 + 392 = 0395番地)。 しかし1行目が ADD.AB #4, $3 のままだと、最初の爆弾は 395 + 4 = 0399 番地、次は 0403 番地に落ちてしまい、敵のいる 0400 番地 を飛び越してしまいます!

🎯 やってみよう 1行目(0000 番地)の A(左の数値) を #4 から #5 に変更して [PLAY] を押し、最初の1発(395 + 5 = 0400 番地)で敵を直撃・撃破しましょう!

1. 初めての敵(Warrior 2)の出現とターン制交互実行

Step 21で、ついにあなたは1人きりの練習場(Single-Player Mode)を卒業し、右側のArenaの『0400 番地』に待ち構える赤い敵プログラム(Warrior 2)との実戦デビューを果たしました!

2体のWarriorがアリーナに配置されたとき、MARS仮想プロセッサはどのように時間を進めるのでしょうか? MARSは完全に公平な「交互ターン制(インターリーブ実行)」を採用しています。 ・Cycle 1:青コーナー(あなた:Warrior 1)が1命令を実行する。 ・Cycle 2:赤コーナー(敵:Warrior 2)が1命令を実行する。 ・Cycle 3:再び青コーナー(あなた)が次の1命令を実行する。

このように、双方のプログラムカウンタが1サイクルずつ順番に命令を実行し合い、どちらかの実行ポインタがすべて『DAT』を踏んで消滅(プロセス数 0)した瞬間に、生き残った側の「勝利(WIN)」となります。

Target Formula: Landing Address = (Pointer Row) + (Initial B-Value) + (1st ADD Stride)
  ├─ Original (#4): 0003 + 392 + 4 = 0399 (Misses Enemy at 0400! Next shot is 0403)
  └─ Tuned    (#5): 0003 + 392 + 5 = 0400 (🎯 Direct Hit on Enemy at 0400 on Shot #1!)

2. 1発目の着弾番地を導き出す「アドレス算術(3要素の足し算)」

今回のミッションでは、0400 番地にいるたった1行の小さな敵(『JMP.A $0, #0』)を仕留めるために、1行目の加算ステップ幅を『#4』から『#5』へと調整しました。なぜ『#4』では当たらず、『#5』にすると1発目で直撃したのか、その弾道計算(アドレス算術)を完全に解き明かしましょう。

Dwarfが1発目の爆弾を投下する番地は、以下の【3つの数値の合計】で決まります。 ① ポインタ箱自身が置かれている番地(Base Row):4行目なので『0003 番地』です。すべての間接参照(@)は、このポインタ箱自身の番地を基準(スタート地点)として距離を測ります。 ② ポインタ箱の初期B値(Initial Offset):0003 番地のDATには、最初から『#392』が入っていました。この時点で、ポインタは『0003 + 392 = 0395 番地』を指しています。 ③ 1周目の『ADD』で足されるステップ幅(Stride):爆弾を投げる(MOV)直前に、1行目の『ADD』が実行されてポインタの数値が増えます。

したがって、もし1行目が『ADD.AB #4, $3』のままだと、1発目の着弾点は『0003 + 392 + 4 = 0399 番地』、2発目は『0399 + 4 = 0403 番地』となり、0400 番地にいる1行の敵を綺麗に飛び越してしまいます! そこであなたが1行目を『ADD.AB #5, $3』に変えたことで、1発目の着弾点が『0003 + 392 + 5 = 0400 番地』へとピタリと補正され、開始わずか2手目(MOV実行時)に敵の心臓部を直撃したのです。

3. オフバイワン・エラー(1つズレのバグ)を防ぐ空間感覚

「狙ったつもりの番地から1マスだけズレていて当たらない(0399番地に落ちて0400番地に当たらない)」という現象は、現実のプログラミングにおいても『オフバイワン・エラー(Off-by-One Error:境界値の1つズレバグ)』として非常に頻繁に発生します。

特にアセンブリ言語やポインタ演算では、「①基準となる番地はどこか(0000番地ではなく、ポインタがある0003番地!)」「②値を参照する前に足し算(ADD)が行われるのか、参照した後に足し算が行われるのか」という順序を正確に把握することが不可欠です。このStep 21で『0003 + 392 + 5 = 0400』の感覚を掴んだあなたは、もうポインタのオフセット計算で迷うことはありません。

🔒

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

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