TIS-100

【ティーアイエスワンハンドレッド】

ジャンル シミュレーション
対応機種 Windows XP/Vista/7/8/10
Macintosh OS 10.9, or later
Ubuntu 10.10+, SteamOS
発売元 Zachtronics
発売日 2015年7月21日
定価 698円
判定 なし
ポイント プログラミング知識が必要なパズル


概要

  • 偶然手に入れた奇妙なコンピュータ、「TIS-100」をデバッグして、謎を解くという設定のパズルゲーム。
  • 最大の特徴はパズルを解くためにプログラミング言語(アセンブリ言語)を使う必要があるということ。実在のアセンブリ言語と比べて命令の数は少なめで簡略化されているとはいえ、使われている用語や文法は本物とほぼ変わらない。ゲームのマニュアルも謎のコンピュータ「TIS-100」の仕様書という形式をとっている。

仕様

  • ゲームはノードと呼ばれるコードを書くことのできる四角形の箱が12個並んだ画面がメインとなる。
  • ノードは横4列縦3段の並びになっており、個々のノードには他のノードと数値をやりとりするためのポートが上下左右に4個ついている。
  • 問題では、一番外側のノードに、テスト用の数値を受け取るIN(入力)ポートと答えとなる数値を送り出すOUT(出力)ポートが最低ひとつ存在する。INから受け取った数値をもとに、問題の条件にあった数値をOUTに送り出すことがゲームの目標となる。
  • また、各ノードには数値を記憶するためのレジスターが2つある。
    • ひとつはACCというメインとなるレジスター。自由に数値を変更することができる。数値の加算や減算を行う際はこのACCを利用することになる。また、条件分岐にも使用される。
    • もうひとつはBAKという予備のレジスター。こちらはACCの数値をコピーしたり、ACCと数値を入れ替えることができる。しかしACCと違い、直接数値を指定したり、加算、減算を行うことはできない。
  • 問題を解くときはこれらの要素をノードの中に書き込んだ命令(インストラクション)で操作していくことになる。

代表的な命令

  • MOV <読み込み元>, <書き込み先>……<読み込み元>の数値を<書き込み先>に書き込む。レジスターに数値を記録するのに使う他、ポートからポートに数値を渡すことができる。もっとも代表的な命令。
    • (例)MOV UP,RIGHT 上(UP)のポートの数値を右(RIGHT)のポートに渡す。
  • ADD <数値>……そのノードのACCに<数値>を足す。
  • SUB <数値>……そのノードのACCから<数値>を引く。
    • 掛け算、割り算を行う命令は 存在しない 。しかしゲーム中には容赦なく掛け算、割り算を要求する問題が出てくる。つまり、プレイヤーは自ら掛け算割り算の回路を作成することになる。
  • JMP <ラベル>……ノード内のコードに書いたラベルの位置からプログラムを続行するジャンプ命令。通常、ノード内のコードは上から順番に実行されるが、JMPを使うことでその流れを変えることができる。また、JMPの亜種として、ACCの状態が0と同じか、小さいか、大きいかに応じてジャンプするかどうかを決定する条件分岐用のJEZ,JGX,JLZという命令もある。
  • SAV……ACCレジスターの数値をBAKレジスターにコピーする。ACCレジスターは計算や条件分岐に多用されるため、ノードに数値を保存しておきたいときなどにはこの命令が有用。
  • SWP……BAKレジスターとACCレジスターの数値を入れ替える。BAKレジスターはSAV命令とSWP命令以外で直接アクセスすることはできない。

その他重要な仕様

  • ノード内に書いたコードは一番最後の行まで実行された後、自動的に一番最初の行に戻って続行される。どの問題でもテスト用の数値は無数にあるが、自分でわざわざループさせる必要はない。
  • 各ノードのコードは基本的には全て同時に、並列に実行される。プログラミングのやり方によっては、ノード同士がやりとりをするタイミングを調節し、同期させなければならないこともある。ただし、後述のポートの仕様によってある程度ノードが動作する順番を操作できる。
  • ポートに書き込まれた数値はMOV命令などで読み込まれると自動的に消滅する
  • ポートに数値を書き込むためにはそのポートに何も数字がない状態でなければならない。逆にポートから数値を読み込むためにはそのポートに数値がなければならない。
  • もし前述の状態でポートから読み込みや書き込みができない場合、そのノードは読み込み、書き込みができるようになるまでその後のコードの実行を待機する。これによりノードがコードを実行する順番をある程度コントロールできるが、プログラムが完全に動きを止めてしまうデッドロックの原因にもなる。
  • 隣接する二つのノードがお互い同時につながっているポートに同じ命令(MOVによる読み込み、書き込みなど)を行った場合、デッドロック状態になりそれ以上動かなくなってしまう。

評価点

  • 自由度の高さ
    • プログラミングがゲーム性の中心になるので、ひとつの問題でも解き方は無数にある。ひとつの問題につき3つまでプログラムを保存できるので、様々な解法を試すことができる。
    • 問題クリア時にはすべてのテストを行うのにプログラムが何回動いたか、コードの長さ、使用したノードの数などの統計が表示される。自分が全プレイヤーの中でどのあたりの位置にあるのかもわかるので、より短い時間で実行できるプログラムを作ったり、できるだけ短い行数でコードを書くなど、よりスマートな解法を求めてチャレンジすることができる。
    • ゲームには問題作成機能もついている。問題を解くだけでなくオリジナルの問題を作ることも可能。
  • 快適なUI
    • ゲーム自体は難解だが、UIは直感的でわかりやすい。全命令の簡単な説明はF1キーでいつでも参照可能。コピーペーストやノード間を移動するショートカットキーは複雑にならない程度に充実している。
    • デバッグ機能も使いやすい。コードを順番に実行するSTEP実行機能や、特定の命令が来たら一時停止するブレイクポイントなど、実際のデバッガーとそん色ない機能が用意されている他、数値の流れが視覚化されているので、どこがバグの原因になっているのか(普通のプログラミングよりは)分かりやすい。

問題点

  • ハードルの高さ
    • かなり簡略化されているとはいえ、ゲーム性の大部分がプログラミング、それもアセンブリ言語というそれほど触れる機会のないものなので、まずゲーム性を理解するためのハードルが高い。
    • チュートリアルといえるようなものもなく、マニュアルも「TIS-100の仕様書」という体裁をとっているのでまずどのようなゲームなのかが実際に試行錯誤してみないと分かりづらい。

総評

基本的なアセンブリ言語の知識が必要になるという点で敷居が高いのがネック。しかしゲームの仕様自体はかなり単純化されており、実際のアセンブリ言語に比べて覚える命令や仕様の数は少なく、仕様書(マニュアル)も数ページでまとまっている。
問題文もたいてい数行で「入力Aと入力Bの数を足して出力Aに結果を送れ」や「入力Aと入力Bを掛け算して出力しろ」のような小学生でも簡単に理解できるものなのに、実際に作ってみると考えなくてはいけないことがいくつもありなかなか難しい。
それだけに自分が作ったプログラムがすべてのテストを突破して問題をクリアしたときの達成感は高い。万人にオススメできるゲームではないが、プログラミングやコンピュータに興味がある人は、あるいはアセンブリ言語の基礎を学んでいて腕試ししてみたいという人にはうってつけのゲームになるだろう。