Getting Over It with Bennett Foddy #2 So Over It.

50回クリアするという実績を獲得しました。

50回までのインゲーム自己ベストタイムは9分12.694秒。一杯ミスをしていて、それらがなかったら6分くらいにはなるはずだが、それもまた実力ということで。

Watch In-game Time: 9:12.694 from hikami_longod on www.twitch.tv

最初に9時間かかったプレイ時間が、周回するにつれてどんどん早くなっていくのがとても楽しい。

一般的に、回数を重ねると二次曲線的に記録が早くなっていき10分くらいまでは、それほどプレイングスタイルを変えなくともいけるのではないかと思う。そこから先の10分台、5分台と切っていくには意識的に早いやり方を変えていく必要があると思う。例えば上の動画では、特に「みかん」と呼ばれる崖の難所を安全に進めているのだが、そういうところも大ジャンプで高速で駆け上がっていくようにして行かなくてはならなくなる。

また、SettingsにはUse Trackpad Tuningという項目があるのだが、これはデフォルトのオフだとマウスの動きに対して加速度的にハンマーが動き、オンにすることで等速に動くようになる。丁度、Windowsのマウスプロパティの「ポインターの精度を高める」の逆である。これによって、微細な動きは苦手になるが素早く直感に近い感覚でハンマーを振ることが出来るようになり、大きなジャンプをしやすくなる。
Speedrunでは、Trackpad Tuningをオンにするのが常識となっているので、記録を目標にする人は、早いうちからオンで慣れた方がいいだろう。上の動画はオフでプレイした記録だが、最近大きくジャンプしなくてはならない状況で辛く感じてきたので、オンに切り替えたところである。

Hitman GO and Lara Croft GO #1 Comparison

Hitman GO の終了確認

Lara Croft GO の終了確認

何故、YesとNoが左右逆なんだ。両方を少しずつ進めているといつも一瞬混乱する。Windowsにならうのであれば、Hitman GOの方が正しいように思えるが、同じスタジオが開発したはずなのに異なっているのは何故だろう。Hitman GOの方が常識知らずだと批判されて変更したのだろうか?

 

さて、どちらが面白かったかというと私はHitmanの方を評価する。

Hitmanの方は、次から次へと新しいメカニックが追加されていって飽きにくいが、Laraの方は中盤、具体的には3つのキーを手に入れるまではメカニックも少なく難易度も簡単で、馬鹿でもミスしないようになっているのでひたすら退屈だ。

Hitmanの方は、服で変装、銃は携行せず狙撃銃で遠距離の敵を倒すといったメカニックに合理性がある。しかし、Laraの方は、接触して敵を倒すときにいつもの拳銃を使うが、何故か遠距離で撃つことが出来ず、遠距離で敵を倒すには使い切りの槍を拾って投げるという理解しがたいメカニックが主となる。

Hitmanの方は、複数の解法が存在することが多い。このためレベル毎に3つの目標(全員倒す、一人も倒さない、途中のアイテムを拾う、何ターン以下でといった)が設定されていて、それらを達成しようとするのはなかなか大変で、リプレイ性がある。Laraの方は、単一の解しか無く、コレクション要素も画面上にある壺を見つけてただクリックするだけだ。リプレイ性に乏しい。

Hitmanの方は、ボードゲームのように駒を動かす動きを模していて基本的にアニメーションしない。Laraの方はアーティストが頑張ってアニメーションをつけた。つけたはいいが、移動するときは常にステップしかしないので全く歩いているように見えない。ゲーム外では走り回るのに、ゲームに入った途端ケンケンしかしないのは不自然である。時折、壁を登るのにクソ長いアニメーションをするときもあって、その間操作も受け付けずイライラする。

Hitmanの方は、駒のような見た目と、移動可能な方向に控えめな矢印が足下に出ているので、駒を掴めばいいんだなと直感的に移動させる方法が分かる。Laraの方はキャラクターであり、なぜか矢印も無くなっているので、実は同じ操作方法であるにも関わらず、ゲームを始めた瞬間から操作方法がピンと来ない。tipsのようなものも出てこないのでしばらく立ち往生する。そのくせ、そういうデザインコンセプトなのかと思いきや、中盤の柱を押して動かす段階になって初めてtipsと矢印が出てくる。

静止画だと良い感じに動いてそうに見えるのだが、実際は…

Python Setup for Data Science without Any Distributions

Pythonは書けるが、データサイエンスを囓ってみようと思ってセットアップをしようとすると、立ちはだかるのがAnacondaを始めとするdistributionである。適当に調べていると、いずれかのdistributionを使わないと本当にデータサイエンスが出来ないわけでは無さそうなのに、よく分かっていないにも関わらずとにかく何も考えずに入れろというような風潮が強い印象を受ける。includeをおまじないと言って誤魔化すような類の人達なんだろうか。よく分からないまま入れた挙げ句にdistributionに依存したトラブルが起きて、当然これを解決出来ず、そういうdistributionの現状に対する批判も出てたりするという、ドロドロとした界隈を覗き見ることが出来る。

ということで、pipと打てば済みそうなのにわざわざcondaとタイプさせる意味が分からないし(どうでもいいところで自己主張しなくていいよ。タイプ数増えてるし…)、使いもしなさそうなモジュールをてんこ盛りで入れられて汚染されるのも嫌だし、distributionへの依存性が高くなりすぎるのも嫌だったので、全部自力でセットアップしてみることにした。
言うまでもないけれど、Windows。

Python

3.6.3使用。インストーラでは、他にPython環境が入っておらず、今後もそんなに沢山入れるつもりが無いのならpath追加にチェックを入れる。組み込みとか他のソフトウェアでよくPythonをねじ込まれるので判断が難しいところだが。あとはお好みで。

Pythonは、バージョン間での互換性は重視しないくせに、バージョンが複数混在する場合の選択は、プロジェクト毎の設定を定義するものが無く、環境変数のみに強く依存する。そのため、仮想環境のような回りくどい方式が用いられる。これもdistributionと同じようにゴチャゴチャと乱立しているのだが、最小限の自力セットアップを目的とするのであれば、3.6に標準でパッケージされているvenvコマンドで良いと思う。

pathを追加した場合は、PCの再起動が必要。改めて自力でpathを追加したい場合は、Pythonインストール直下とそこにあるScriptsディレクトリを追加する。追加しないで、実行したい場合は、パス込みで実行すれば良いだけなのだが、pathに追加されていることが前提な処理が結構あるので、pathに足してしまうか、仮想環境を用いる方が良い。

Jupyter

なんでもいいが、この手の実行環境が無いと、グラフの確認すら困難なので入れる。

chcp 65001
pip install jupyter

最初のchcpコマンドは超重要で、コマンドプロンプトのコードページをUTF-8に変更するものだ。これを最初に実行しないとJupyterのインストールに失敗する。コマンドプロンプトのデフォルトの文字コードがSJISなのが駄目なのだが、その辺のプラットフォーム間の違いを吸収して適切にインストールするのはpipの役目ではないのか。

これは予備知識無しにやるとまず失敗するが、失敗した場合はコードページを正しく設定してインストールし直しても、それ以前の駄目なデータが残ってしまっていてまともに動作しないので、一旦Jupyterをアンインストールする必要がある。正しくインストール出来たなかったら元通りに戻すのはpipの役目ではないのか。
また、Jupyterは多数のモジュールの依存から成るのでただuninstallコマンドを入力するだけでは除去しきれない。手動で一つ一つ消して回るのは大変なので pip-autoremove を用いると楽である。依存性も考慮して完全なアンインストールを行うのはpipの役目ではないのか。

pip install pip-autoremove
pip-autoremove jupyter -y

で、再インストールはキャッシュを無効にしてやる必要がある。デフォルトのままキャッシュを有効にしていると、再び不完全なファイルを使用してインストールしやがるので失敗する。キャッシュデータの整合性を確認していないpipはゴミだと思う。

pip install --no-cache-dir jupyter

これでようやく、jupyterが動作する。

jupyter notebook

さて巷では、もてはやされているjupyter notebookだが、私はウェブベースの貧弱なエディタでコードを書かされるのは大変苦痛だと感じた。最低でもVSCodeで書きたいところである。

ということで、VSCodeでextensionをJupyterで検索するとそのまま出てくるのでそれをインストール。このextensionはpylintを要求するのだが、VSCodeの言うがままにインストールしようとすると、こいつもコードページがUTF-8前提なので失敗する。最早pipの欠陥じゃないか?
そのため別途インストールしてやる。

chcp 65001
pip install pylint

pylintを入れると、どうでもいいだろとか、個人の流儀だろみたいな書き方までケチをつけてきてとても五月蠅いので、適当にdisableする。
これで、VSCode上でjupyterを実行できるようになる。仮想環境上で実行する場合は一工夫いるのだが、後述。

Modules for Data Science

この辺は、必要になったタイミングでひたすらインストールするだけ。

pip install requests
pip install numpy
pip install pandas
pip install matplotlib
pip install scipy
pip install -U scikit-learn

上から順に…

  • HTTP通信。データサイエンスと直接的に関係ないのだが、ウェブデータをスクレイピングするときに使う。
  • 算術。Cでネイティブ実装されているのでパフォーマンスが悪くないらしい。
  • データフレーム。今のところ扱いやすいとは思わないのだが…
  • グラフ描画。
  • 科学演算。今のところ必要性を感じていないが、下のscikit-learnが要求する。
  • 機械学習フレームワーク。-Uをつけるのは何故…

venv with VSCode

仮想環境そのものは、適当に作ればいいが、VSCode上ではどの仮想環境を使うかという指定はできない。精々使用するpython.exeの場所を選べるくらいで何の役にも立たない。
以下のように、仮想環境を有効にしたコマンドプロンプト上でVSCodeをコマンドラインで起動させる。

activate
code

仮想環境を有効にすると、コマンドプロンプトウインドウが作り直されるので、バッチファイルを用意して叩くだけというのが出来ず不便である。

仮想環境上だとJupyterもVSCode上から適当に実行(’Jupyter: Start a new Jupyter Notebook’)させても動作しなくなる。自前でJupyter Notebookを起動しておいて、出てきたURLをトークン込みで ‘Jupyter: Enter the url of local/remote Jupyter Notebook’ に入力してから実行する。

VSCode settings

余談。
Jupyterは、以前のセルに入力した内容やimportが何時読み込まれるのか分かり難い。

"python.jupyter.startupCode": [
    "%load_ext autoreload",
    "%autoreload 2",        
    "%matplotlib inline"
]

参考:IPython: autoreload

VSCodeの、python.jupyter.startupCodeにこう書いておくと毎回リロードされそうなのだが、やはりリロードされないこともある。VSCode上だと有効にならないのかもしれない。

Getting Over It with Bennett Foddy #1 Got Over It.

OS上のマウス感度は最大にしているのだが、それよりも圧倒的に感度が低く感じられる鈍さなので、DPI依存(私のマウスは古いのでDPIが低い)のraw inputを使用しているんじゃないかという印象がある。あるいは意図的に鈍くしているか。
なので、いつもの感度なら手首のスナップで済ませられるような動きでも、腕全体とマウスパッド全体を使ってハンマー操作しなくてはならない。疲れるし、慣れないうちは肩が痛くなってくる。逆に、感度が低いことによって繊細な操作は行いやすい。

ハンマーは一対一でマウスに追従した動きでもなく、おっさんの腕の可動範囲的な制約を持ちつつも、体に対して常に相対位置をキープしてくれるわけではなくカーソルの位置を維持しようと動くので、未プレイの状態で想像するよりも操作性はずっと劣悪に感じられる。ゆえに、難易度は高い。

失敗して遙か地表に落とされてもひたすらに諦めない忍耐力と、どうやったら先に進めるかを考える洞察力、ミスをしたときの咄嗟の判断力、それらを実行するハンマー捌きが要求される。
ふと、落とされたときに以前苦戦した地点をあっさりと超えられるようになっていたりすることで、腕前の上達を実感できる。一般に難所と呼ばれるような場所は、何時まで経っても難しかったりもするが、それでも以前ほど苦戦はしないはずだ。

続きを読む →

Invisible, inc. #1 Stealthy X-COM

リブート前X-COMライクなアクションポイント制のステルスゲーム。

一番最初にアビリティ選択があったり、ミッション開始前にはアイテムを選択していったりするので、その辺の組み合わせで詰め将棋的に最適解を探していくゲームデザインなのかなと思った。
一方で少し進めてみると、ミッションの詳細なブリーフィングは無いし、ミッションが始まったらオートセーブだし、ミッションは最初からやり直すことも出来ないあたり、ぶっつけ本番の緊張感と今あるリソースで直近の困難をなんとかしていくゲームデザインで、どちらの舵取りで楽しめばいいのかなと最初は困惑してしまった。
セーブデータを消してやり直すと、ミッションのレベル構造はランダム生成かいくつかのパターンから自動生成されていて、本当にやり直しが効かないように出来ているということが分かった。どうやら後者の方向性で楽しむゲームらしいと分かってからは、随分と進めやすく感じるようになった。

セーブ/ロードでのやり直しが効かない代わりに、回数制限のある一つ前のターンからやり直すRewindは用意されていて、この回数制限の範囲で軌道修正をすることが出来る。しかし未確認であるが、それを超えてミッションの目的を幾つか達成出来なかったり、そもそもミッションそのものに失敗したとしても、ゲームは続行するようだ。流石に全員死亡してしまったらゲームオーバーかもしれないが。

そんな感じで、BeginnerのDay 4最後の主要となるミッションをクリアしてみたところまで。主要ミッションまではBeginnerなりに簡単だなあという印象だったのだが、このミッションは初回プレイヤーにとっては相当難しくて失敗する可能性の方が高いんじゃないかと思った。周回時にはミッションのメカニックが分かっているはずなので、それに備えた対策を最初から進めていけるので何とかなりやすいだろうけれど。


犠牲者もなく無事にミッションクリアしているが、Net Worthというよく分からないものが下がってしまった。

続きを読む →