ミジンコによるNandGame攻略
目次
NandGameとは
NandGameはCPUアーキテクチャーを学べるゲームです。自作CPUに興味を持っている方に向いています。
最初はリレーでNANDゲートを構築し、それをベースとして徐々に複雑なデジタル回路を構成していきます。マシン語やアセンブリ言語の実装を経て、最終的にプロセッサーまで構築します。
インストール不要で、ブラウザーでアクセスするだけ遊べます。アカウントの作成も不要です。組んだ回路のセーブデータはブラウザーが保持していますので、再度アクセスした際には途中から再開できます。
「From NAND to Tetris – Building a Modern Computer From First Principles」プロジェクトにインスパイアされて開発されたとのことです。
NandGameの特徴
- 完全無料。
- これが強い。
- ブラウザーでアクセスするだけ。
- アカウントの作成、ソフトウェアのインストールなし。
- オートセーブ。
- 明示的にセーブして、別の回路を組んでから、先の回路をロードするということがやりにくい(実質的にできない)。
- 別マシン(あるいは別ブラウザー)とセーブデータを共有しにくい。
- 英語。
- 実装したマシン語やアセンブリー言語を用いたプログラミングに関するステージはほとんどない。
- 仕様の説明がたまに雑、不親切。特に後半の課題に、この問題が当てはまる。
Turing Completeとの比較
似たゲームとしてTuring Completeがありますが、比較すると次のような違いがあります。
| NandGame | Turing Complete | |
|---|---|---|
| 価格 | 無料 | 有料 |
| 環境 | OSに依存しない | Windows、MacOS |
| ゲーム性 | 中 | 高 |
| セーブ機能 | オートセーブ | Steamクラウドにセーブされ、OS別で共有可 1つの課題に複数の回路のセーブできる。 |
| カスタムコンポーネント機能 | あり | あり ※Labステージ以降で使える。 |
| サンドボックス機能 | なし | あり ※独自の回路を組んで楽しんだり、シミュレーターとして活用したりできる。 |
| ボリューム | 中 | 大 |
| デジタル回路のステージ | リレーを用いてNANDゲートを構成するステージからスタート。 最終的にマルチタスクをサポートするプロセッサーを作る。 | NANDゲートからスタート。 最終的に2つのCPUを作る。 |
| アセンブリー言語のステージ | マシン語やアセンブリー言語の実装ステージはあるが、プログラミングステージはあまりない。 | プログラミングステージも豊富。 |
個人的にはTuring Completeのほうが楽しく遊べました。
各レベルの攻略記事
NandGameではステージをレベル(Level)と表現しています。それに習って、当サイトでも「レベル」という呼称を使うことにします。
NandGameで用意されているレベルは、Hardware、Software、Optional Levelsの3部構成になっています。
カテゴリー内のステージを全クリアした時点で次のカテゴリーにアクセスできます。
例えば、最初のHardwareをクリアするとSoftwareが表示され、SoftwareをクリアするとOptinal Levelsが表示されます。
ここで解説する内容は、2023年12月時点のNandGameになります。
NandGameがバージョンアップされ、レベルの内容が新しくなっていたり、新レベルが追加されていたりしてします。
そのため、解説記事とギャップが出てくる可能性があります。
Hardwareカテゴリー

| No. | グループ | レベル名 |
|---|---|---|
| 1.1.1 | Logic Gates | Nand |
| 1.1.2 | Logic Gates | Invert |
| 1.1.3 | Logic Gates | And |
| 1.1.4 | Logic Gates | Or |
| 1.1.5 | Logic Gates | Xor |
| 1.2.1 | Arithmetics | Half Adder |
| 1.2.2 | Arithmetics | Full Adder |
| 1.2.3 | Arithmetics | Multi-bit Adder |
| 1.2.4 | Arithmetics | Increment |
| 1.2.5 | Arithmetics | Subtraction |
| 1.2.6 | Arithmetics | Equal to Zero |
| 1.2.7 | Arithmetics | Less than Zero |
| 1.3.1 | Switching | Selector |
| 1.3.2 | Switching | Switch |
| 1.4.1 | Arithmetic Logic Unit | Logic Unit |
| 1.4.2 | Arithmetic Logic Unit | Arithmetic Unit |
| 1.4.3 | Arithmetic Logic Unit | ALU |
| 1.4.4 | Arithmetic Logic Unit | Condition |
| 1.5.1 | Memory | Latch |
| 1.5.2 | Memory | Data Flip-Flop |
| 1.5.3 | Memory | Register |
| 1.5.4 | Memory | Counter |
| 1.5.5 | Memory | RAM |
| 1.6.1 | Processor | Combined Memory |
| 1.6.2 | Processor | Instruction |
| 1.6.3 | Processor | Control Unit |
| 1.6.4 | Processor | Computer |
| 1.6.5 | Processor | Input and Output |
Softwareカテゴリー

| No. | グループ | レベル名 |
|---|---|---|
| 2.1.1 | Low level | Machine code |
| 2.1.2 | Low level | Assembler Language |
| 2.1.3 | Low level | Assembler program |
| 2.1.4 | Low level | Escape Labyrinth |
| 2.1.5 | Low level | Display |
| 2.1.6 | Low level | Network |
| 2.2.1 | Stack machine | Init stack |
| 2.2.2 | Stack machine | Push D |
| 2.2.3 | Stack machine | Pop D |
| 2.2.4 | Stack machine | Pop A |
| 2.2.5 | Stack machine | Push Value |
| 2.2.6 | Stack machine | Add |
| 2.2.7 | Stack machine | Sub |
| 2.2.8 | Stack machine | Neg |
| 2.2.9 | Stack machine | And |
| 2.2.10 | Stack machine | Or |
| 2.3.1 | High-level language | Tokenize |
| 2.3.2 | High-level language | Grammar |
| 2.3.3 | High-level language | Code generation |
| 2.4.1 | Conditionals | Eq |
| 2.4.2 | Conditionals | Gt |
| 2.4.3 | Conditionals | Lt |
| 2.4.4 | Conditionals | Not |
| 2.4.5 | Conditionals | Goto |
| 2.4.6 | Conditionals | If-goto |
| 2.5.1 | Memory | Push Memory |
| 2.5.2 | Memory | Pop Memory |
| 2.5.3 | Memory | Push Static |
| 2.5.4 | Memory | Pop Static |
| 2.6.1 | Functions | Call |
| 2.6.2 | Functions | Function |
| 2.6.3 | Functions | Return |
| 2.6.4 | Functions | Push argument |
| 2.6.5 | Functions | Pop argument |
| 2.6.6 | Functions | Push local |
| 2.6.7 | Functions | Pop local |
Optional Levelsカテゴリー

| No. | グループ | レベル名 |
|---|---|---|
| 3.1.1 | Transistor level | Nand (CMOS) |
| 3.1.2 | Transistor level | Invert (CMOS) |
| 3.1.3 | Transistor level | Nor (CMOS) |
| 3.2.1 | Logic | Xnor |
| 3.2.2 | Logic | Left Shift |
| 3.2.3 | Logic | Logical Right Shift |
| 3.2.4 | Logic | Artithmetic Right Shift ※"Arithmetic"のスペルミス? |
| Logic | Barrel Shift Left | |
| 3.3.1 | Arithmetics | Max |
| 3.3.2 | Arithmetics | Multiplication |
| 3.4.1 | Floating point | Unpack floating-point value |
| 3.4.2 | Floating point | Floating-point multiplication ※3.4.9と同一名なので注意。 |
| 3.4.3 | Floating point | Normalize overflow |
| 3.4.4 | Floating point | Verity exponent |
| 3.4.5 | Floating point | Align significands |
| 3.4.6 | Floating point | Add signed magnitude |
| 3.4.7 | Floating point | Normalize underflow |
| 3.4.8 | Floating point | Pack floating-point value |
| 3.4.9 | Floating point | Floating-point multiplication ※なぜか3.4.2と同一レベル名。 |
| 3.4.10 | Floating point | Floating-point addition |
| 3.5.1 | Multitasking | Timer Trigger |
| 3.5.2 | Multitasking | Mode controller |
| 3.5.3 | Multitasking | Register with backup |
| 3.5.4 | Multitasking | Program Counter |
| 3.5.5 | Multitasking | Register bank |
| 3.5.6 | Multitasking | General-purpose Memory |
| 3.5.7 | Multitasking | Virtual Memory |
| 3.5.8 | Multitasking | Control Unit |
| 3.5.9 | Multitasking | Processor |
その他の情報
異なるPC(あるいはブラウザー)間でセーブデータを共有する
NandGameのセーブデータはローカルストレージに保存されているようです。
エクスポートしたデータを別PCでインポートすれば、実質的にセーブデータを移行できるとのことです。
情報提供ありがとうござました。

























