こんばんは、夜中たわしです。
先日ニンテンドースイッチで配信開始された『ヒューマン・リソース・マシーン』というゲームが非常に面白かったので全力で紹介します。クリア済みです。
『ヒューマン・リソース・マシーン』
直訳すると「人的資源機械」。
そのタイトルが示す通り、プログラミングに従って人間(プレイヤーキャラ)が馬車馬のように働くゲームです。
なにげなくニンテンドースイッチのストアを見ていたところ見つけました。掘り出し物です。こういうのすごく好み。
本作はビジュアルプログラミングツールとパズルゲームの中間の存在です。プログラミング要素はゲームだからと言って子供だましではなく、大人でも頭を悩まされる問題も。なかなか完成度が高いです。
と言ってもプログラミングの知識はまったく必要なく、小学生でもプレイできることでしょう。そしてプログラミングの考え方がある程度身につきます。
しかも安い(1000円)のでニンテンドースイッチを持っていてかつプログラミングに多少なり興味のある方は、買って損はないでしょう。
現状、ニンテンドースイッチのゲーム少ないですし。
紹介動画
こちらが公式の紹介動画です。
プログラム系のパズルゲームなんだろうなーってのと、楽しげな中にやや不気味なムードが漂っていることが伺えますが、ちょっとこれだけではゲーム性がよくわからないと思います。
なので以降でゲームの流れと、どんなコマンド(命令語)が登場するのかについて紹介していきます。
当然ながら多少ゲーム内のパズルについて紹介していますので、事前知識を入れたくない方は読まずにプレイすることを推奨します。
※前回の記事でネタバレの話をしたばかりなので、なんだか妙に気を使ってしまいます
ゲーム内容
本作品はステージクリア型のパズルゲームです。
ステージ選択画面はこんな感じ。
そしてこちらが最初の問題です。
いずれのステージも左コンベアからの入力に対し何らかの処理を行うことで、右コンベアに対して指示に従った出力を行えばクリア、という流れです。
本ステージの目的は左コンベアにあるパネルを右コンベアにすべて移動させること。
右側のプログラミングエリアでコマンドを編集し、再生ボタンを押せばキャラクターがプログラムに従って動きます。
このまま実行してみましょう。
[INBOX]コマンドで左コンベアからパネルを手に取り、
[OUTBOX]コマンドで右コンベアにパネルを置きます。
ね? 簡単でしょう?(本当に)
ちなみにこれだけのコマンドだと、
1つ運んだだけで満足してしまうので、普通に怒られます。
3つ運ぶにはどうすればいいかというと、
こうですね。
でもこれ、非効率ですよね。プログラマーの方から「for文はないのか」という声が聞こえてきます。
そこで2ステージ目に登場するのがこちら。[JUMP]コマンドです。
このコマンドで上の方に処理を飛ばせば、ループ構造の出来上がり。同じ処理を延々繰り返すことが出来ます。楽ですねー。
なお画面下部のスライダーで実行速度が変更できるので、最高速にすれば爆速で終わります(人間の動きじゃないです)。
一応プログラマーの方向けの話をしておくと……はい。そうです。これはgoto文ですね。そしてfor文やwhile文は、このゲームにはないです。
「おいおい、繰り返し処理を全部goto文でやるなんて正気か?」と言われそうですが、このゲームはそういうスタンスです。
おそらくゲームを単純にするためでしょう。コマンドの種類は極限まで絞ってあります(後ほど全コマンドを紹介します)。
開発者もそれは承知の上。上司もこう言っています。
ちなみに、むやみに使わなかったとしても後半の問題で複雑な処理が必要となるため、確実にスパゲッティ化します。
これはgoto文乱用の危険性を伝える、反面教師なのでしょう……。
コマンド紹介
そう、このゲームは限られたコマンドでいかに目的を達成するかが肝。あまりにコマンドの種類が少ないため、まるでアセンブリを書いてるみたいです(低級言語。命令語が少ないので書くの大変)。
どれだけの種類があるのか気になる方のため、その他のコマンドを紹介します。
どちらかというとプログラミングの心得がある人向けの内容かも。流し読みでもいいです。
さてなにやら床にパネルを置けるエリアがあります。これは通し番号付きのカーペット。プログラム的に言えば、メモリに該当する場所です。
[COPYFROM]コマンドを使えば、指定したエリアからパネルをコピーして手に持ちます。
さっきとは逆に、手に持ったパネルのコピーを指定エリアに置く、[COPYTO]コマンド。
手に持ったパネルに、指定箇所の数値を加算する[ADD]コマンド。
逆に減算する[SUB]コマンド。
ついに出ました条件分岐。
[JUMP if zero]コマンドは、持っているパネルが「0」であれば指定先にジャンプし、「0」でなければ次の行に進みます。
言うなれば「goto文付きのif文」です。
そして判定できる条件は「0」かどうかのみ。判定式を自由に書くことができません。
プログラミングの経験があると、ものすごく普通のif文が使いたくなります。
「0」しか判定できないなんて、制約がきつすぎる。
そんなあなたに、[JUMP if negative]コマンド。こちらは、負数であれば指定先にジャンプします。
条件分岐系のコマンドはこの2つのみ。
これらがあれば数値の大小関係の比較や、アルファベットが一致するかの判定など、なんでもござれ。要はこれで十分です。そりゃ高級言語に比べるとコードは長くなりますが。
この制約状況でいかに最大限効率的なコードを書けるか? それが腕の見せ所です。
指定箇所の数字を+1して手にコピーを持つ、[bump+]コマンドと、
-1してコピーを持つ[bump-]コマンド。
これは非常に役立ちます。カウンタ的に使えますね。
ところで部屋になにやらロボットの腕みたいのが転がってますね。なんなんでしょうこれは。
「データの間接指定」という概念が登場します。
「copyfrom 12」だとカーペットの12番からパネルをコピーしますが、
「copyfrom [12]」と記述するとカーペットの12番にある数値の指す先からパネルをコピーします。
これはもはや革命的。たとえば先程の[bump+]コマンドと組み合わせれば、カーペット上のパネルを順番に参照することができます。
これはプログラミングを学習する上で引っかかる人が多いと言われる、「ポインタ」の概念と非常によく似ています。
ポインタの勉強で詰まったら、このゲームを遊びましょう! これだけ視覚化されていれば直感的に理解する助けになりそうです。
最後に、カーペットにラベルを付けることと、プログラム中にコメントを書ける機能です。
コマンドではありませんし使用することが必須ではありませんが、終盤の問題はこれらを活用しなければ、書いていて意味がわからなくなります。
もう[JUMP]コマンドの嵐になってくると直前にどこを書いていたのかはもちろん、何の処理を書いていたか、書きたかったかもわからなくなったり、見返しても何がなんやら。
という感じにプログラミングにおける変数名、そしてコメントの重要性について体感的に思い知らされます。
以上がコマンドのすべてです。
プログラミング経験者なら、「あの命令語があれば楽なのになー!」となることでしょう。掛け算の命令すらないので。縛りプレイみたいな感じですね。
逆にこのゲームを遊んでから本格的にプログラムに手を出して高級言語に触れると、豊富な命令語の数々のおかげで「実装めちゃめちゃ楽だなあ!」となることでしょう。
デバッグ機能が充実
プログラムというのは、実行すると思わぬ動作をするものです。
そんな時に行うのがバグを調査・修正する作業、いわゆるデバッグです。
このゲーム、これが結構やりやすいように作られています。
間違ったデータを出力した時など、その瞬間上司に怒られ、プログラムが一時停止します。
すると画像の通り、下のボタンで1ステップずつ操作を戻すことで何が問題だったか確認することができます。
操作を戻せるのはありがたい!
最近時間を操作するゲームを遊んでいため感覚が麻痺してましたが、普通はプログラムを逆再生することなんてできません。憧れの機能です。
もちろん1ステップずつ進める機能もあります。
また不十分なプログラムを作ると、こんな風に画面からはみ出さんばかりの勢いで怒られます。
これは偶然出力結果が合っているだけで、別パターンの入力に対応できないケースがあることを示しています。
おそらく内部で複数のテストケースを通しているんでしょう。そこまでチェックしてるのが凄い。
ちなみに入力値は毎回ランダムに変わるんですが、この警告を受けた後は同じプログラムで動作させると失敗するような入力値を与えてくれるようです。
なのでどこかでエラーになり、デバッグが容易になります。ものすごく親切。
ここで私たちは、テストの重要性を思い知らされるのです。
やり込み要素が半端ない
ステージをクリアすると評価が表示されます。
ご覧の通り、「サイズ目標」と「スピード目標」なるものがあります。
サイズ目標は、プログラムの行数です。より少ない行数でプログラムを記述しろということですね。
スピード目標は実行ステップ数です。少ないほど実行速度が速いことを意味します。
この目標を目指してチューニングするのが、結構楽しかったです。ただしそれも前半のステージまで。
後半のステージになると、もう現実的に無理というか、やってられないのがゴロゴロ出てきます。
サイズ目標を目指すと強引な処理の共通化で可読性が犠牲になって、何をやってるのやらわからないプログラムになるし、スピード目標を目指すと「ループ処理を減らして同じ処理を何度も書く」という手段に出てしまい、あまりに汚いプログラムの完成です。
これ、果たしてそこまで汚いソースにせずに達成できる目標になってるのかなあ?
ともかく薄字で「あくまでさらに上を目指すエンジニアへの課題です。考え込むのはほどほどにしましょう」と書いてあるのは伊達じゃないです。無理しない方がいいです。
探してみたらすでに攻略情報(というか答え)を載せてるサイトがあって、途中のステージまで最適解が載っていましたが、果たして全ステージの最適解を掲載できるんでしょうか。心配です。
ゲームボリューム・難易度
ステージ数は全36ステージです。
難易度としては、序盤は簡単で小学生でもプレイできるレベル。
一方で終盤の問題は中々骨があります。
これ最後の方のステージ名なんですが、難しそうなニオイがしますよね。
左に分岐しているコースが高難度なんですが、そこの最後のやつ、素因数分解とか書いてあるし……。
クリアしましたが、スパゲッティ化でデバッグが大変でした。そしてやらされる内容、本当に素因数分解でした。
サイズ目標とスピード目標が、ちょっと残念な感じですがもう勘弁してください。
こちらは別段クリアしなくてもエンディングは迎えられますし、全部クリアしたらエンディングが変わらないかな? と思って確認したものの、別段一緒でした。
まあそうは言ってもエンディング前の最終問題もそこそこ難しいんですが……。
やってて「ちょっと設計書作ったほうがいいかもな」と思いました。
私の場合は全ステージクリアまで6~7時間くらいでしたが、当然プレイヤーによってクリア時間は大きく変わることでしょう。
小学生で最後までクリアできたら、自慢していいと思います。
ストーリー
そういや本作は、意外にもストーリーがあります。
ステージ中に「コーヒーブレイク」というのが時折登場するんですが、これを選ぶとショートムービーが始まります。
独特のシュールな世界観で、不気味なムード。
おそらく進めていくうちに、先のストーリーが気になってくることでしょう。
私は先の展開が気になりすぎて、途中から止まらなくなりました。エンディングは一見の価値ありです。
説明が最小限なので、正直何がどうなってるのかよく分からない終わり方なんですが、魅力的な世界観で私は好きです。
操作方法
今更ですが操作方法について。
タッチ操作とジョイコンでの操作が選べます。
タッチ操作がおすすめで、プレイしやすいです。ただしテレビに写すことができません。 ジョイコンの場合は2つあるうちの、いずれか一方を使用します。一方が充電切れになったら取り替えられます!
これwiiリモコンのような操作感がジャイロで実現されていて、なかなか面白いです。センサーバーもないのに凄い。
ただコメント入力を行う場合、ジョイコンで書くのはかなり難しいです。文字がぐにゃぐにゃになります。
無料配布のサントラあり
案外BGMが良くて、音楽室が用意されています。
画面中にサントラみたいな画像があるので、もしやと思い調べたら、公式サイトでサントラが無料配布されていました! ありがたや。ありがたや……!
Tomorrow Corporation : Human Resource Machine Soundtrack
開発元であるTomorrow Corporationは、他に『グーの惑星』『リトルインフェルノ』を作っています。それらのサントラも無料で置いてありました。
というかこの会社のゲームどれも面白かったのでちょっと調べてみたら、たった3人の会社みたいですね。半端ねぇ……。
他のゲームも今ならニンテンドースイッチで遊べます。おすすめ。
その他スクリーンショット
いくつか面白かったスクリーンショットを紹介しておきます。
本作品は日本語翻訳が自然で、最近のネタが結構仕込まれています。
忖度を求める上司。
残業規制に一言物申す別の上司。
ちなみにラベルの文字が汚すぎて読めたもんじゃないですが、これはジョイコンで書いたためです。2つ目のラベル、なんだこれ……? ラベルはタッチ操作で書きましょう!
めちゃくちゃな数値を作ってみようと思ったら、オーバーフローで怒られた。
無限ループを作っちゃった。
この、キャラが走り回ってパネルを操作するの心地良いです。
おわりに
プログラミング風のゲームはネット上に色々存在しますが、コンシューマゲームの中では珍しいです。
パッと思いつくプログラミング的な要素のあるコンシューマゲームは……まず筆頭はカルネージハート、他には……RPGツクール? あとFF12の戦闘システムとか……?
3DSにBASICのプログラミングができるソフトがありますが、そこまでいくともうゲームじゃないでしょうし。
ともかくゲームという体裁でここまでがっつりプログラムができるのは非常に珍しいです。プログラミングのようで、ぎりぎりパズルゲームです。
ゲームとして楽しみながらアルゴリズムを考える力が身につくゲームデザイン。本当によくできています。プログラミングの入り口としてもおすすめ。
自分がプログラマーに向いているか試すために遊んでみるもよし。
プログラマーが腕試しに遊んでみるのもよし。
興味を持ったならぜひどうぞ。1000円と安いので。
11/22追記:続編が出ましたよ!
関連記事
中毒性の高いAI構築対戦ゲーム『マリオネットAI』レビュー - 夜中に前へ
コミュ力が超必要な良質アクションパズル『スニッパーズ』感想(クリア済み) - 夜中に前へ
『もし次の常駐先が女子エンジニアばっかりだったら』をプレイした - 夜中に前へ
【感想】オープンワールド型パズルゲーム『The Witness』に衝撃を受けた(PS4/Steam/スマホ) - 夜中に前へ