見出し画像

働け、お前ら

あ、いや、別に誰かを煽ってるわけではないです(汗
新しく買ったゲームの内容がそんな感じだったので。


先週金曜日は代休で、ちょっと欲しいものがあったし、客も少ないだろうということで、久々にアウトレットモールなんぞに行ってみた。
すると、モール内やモールまで行く道中のお店など、そこら中に「ブラックフライデー」という張り紙が。なんか知らない間に「ブラックフライデー」という単語が街中に溢れるようになりましたなぁと。

ということは、Steamもバーゲンやってるんじゃないか?と見に行ったら案の定バーゲンをやっていた(「オータムセール」という名前ですが)。

そこで前から気になっていた「Human Resource Machine」と「7 Billion Humans」のセットを買った。

まずは「Human Resource Machine」から始めた。

プレイヤーは、左側にあるインプットのベルトコンベアに流れてくる"箱"を拾い、右側にあるアウトプットのベルトコンベアに、条件を満たすように箱を順番に流していく、というのが基本ルール。
箱には数字か英文字がかかれている。数字は他の箱との数字の足し算や引き算などが行えて、箱にかかれている数値を書き換えることができる。英文字は書き換えることはできないが、他の英文字との比較はできる。
プレイヤーは箱を1つしか持つことができないのだが、箱を保存(コピー)しておくことができる領域がいくつかあるので、一時的な記憶領域として使うことができる。そして必要に応じてその箱のコピーを取り出すことができる。
これらを駆使してアウトプットに流す箱の順番を調整したり、場合によっては必要な数字の書かれた箱を作成していく。

入力に対して、なんらかの演算をして、その結果を出力に返す。これってつまりコンピューターの仕組みそのまんまである。プレイヤーがCPU、箱をコピーしておく領域がメモリーと考えることができる。プレイヤー=人間が機械を動かす資源となっている、ゲームのタイトル「Human Resource Machine」の意味はそういうことだ。

ただし、プレイヤーは十字キーやWASDで動かすことはできない。
どうやって動かすか。コンピューターと同じ、プログラムを組むのである。プレイヤーは、プログラムの指示どおりに動く、というよりは、指示通りにしか動かない。
まあ、プログラムを組むと言っても、何かの言語で命令をガリガリ書いていくわけではなく、使用できる命令リストが出てくるので、それらを組み合わせて作っていくだけでよい。子供のプログラミング教室とかで見かけるようなやつに近いかもしれない。


各ステージのクリア時に「サイズ」と「スピード」という評価ポイントが表示される。
「サイズ」はプログラムで使用した命令の数。プログラムの長さと思ってもらえればよいだろう。値が小さい方が、プログラムとしてコンパクトだと言える。
「スピード」は課題解決までに実行した命令の数、ステップ数と言われるものだ。値が小さい方が、早く課題を解決することができたことになる。
そして、「サイズ」と「スピード」には目標値が設定されており、最低でもこの目標値までは「サイズ」「スピード」を小さくすることができる、というものである。(目標値より小さくすることができるステージもある。)

…さあさあ出ました、効率化!
以前にnoteに上げた「SpaceChem」や「Opus Magnum」でも書いたが、ゲームにおいてはとにかく効率化が好きだ。実生活ではそんなでもないのだが、なぜかゲームになると効率化に走ってしまう傾向にある。お金がかからないからだろうか?(汗

(※以下、若干のネタバレあり。)

とりあえず全ステージはクリアできたが、特に後半ステージはまだ目標値に達していないものが多い。
例えば、今自分が困っているのは、ステージ14「大は小を兼ねる」だ。

画像1

ステージクリアの条件は「入力の数値を2つごとに大小比較し、数値の大きい方だけを出力する。」である。
上記の画像を例にすると、入力が「8,5,-2,-9,8,8,6,4」(最後の4は見えていないが)なので、出力が「8,-2,8,6」となればよい。
とりあえず自分は画像右側のようなプログラムを書いた。言葉で書くと、

1. 入力から1つ目の箱(値をAとする)を取る
2. 手持ちの箱を置き場0にコピー
3. 入力から2つ目の箱(値をBとする)を取る
4. 手持ちの箱を置き場1にコピー
5. 手持ちの箱の値(=B)から置き場0の値(=A)を引く
6. 手持ちの箱の値(=B-A)が負の値(=Bの値がAより小さい)なら10.に飛ぶ
7. 置き場1の箱の値(=B)を手持ちの箱にコピーする
8. 手持ちの箱を出力へ置く
9. 1.へ飛ぶ
10. 置き場0の箱の値(=A)を手持ちの箱にコピーする
11. 手持ちの箱を出力へ置く
12. 1.へ飛ぶ

このプログラムでステージをクリアすることはできるが、その評価は以下のとおりだ。

画像2

サイズもスピードも目標値に達していない。
画像にもあるように、ベストサイズの11行は別のプログラムでできている。上記プログラムの8.を削除して、9.のジャンプ先を11.にすればよい。しかし、まだ10行ができていない。
また、スピードは36ステップ以上減らすことができていない。あと2ステップ。

サイズもスピードも、削減のコツがまだ掴めておらず、効率化で苦戦している。しかし、これが楽しくて仕方がない。

命令はかなり低級なものしかない。ちゃんと勉強したことはないのだが、アセンブリ言語に近いかもしれない。最近は高級な言語しか使わないので、この辺も苦戦のポイントなのかもしれない。


いいなと思ったら応援しよう!

dotson
特にサポートは求めておりませんが、いただいたサポートはありがたく次のドルヲタ活動に充てさせていただきます。