blog.risouf.net

朝4時、僕たちのミッションはもう来ない

Pokemon GO が世間を賑わせている。
僕もひとまずインストールして、ユニーク制約があるというプレイヤー名の入力まで辿りつき、無事 "risou" をゲットした。

ところで、位置情報ゲームといえば、僕はあるゲームを思い出す。 そのゲームは、今年の初めにサービスを終了してしまった。

このゲームがリリースされたのは4年以上前のことで、サービスの稼動期間は4年に少し満たないくらいだったと思う1。 僕はサービス開始日から一日も欠かさずプレイしてきた。 結局4年ではクリアすることはできなかった2

僕はあまり頻繁に旅をする人間ではないし、このゲームのためにわざわざ普段行かないところに足を伸ばすということもなかった。用事のついででプレイする程度だったが、それでも4年間で数百あるエリアの9割は制覇できた。というのも、このゲームにはプレイヤー同士で協力する機能があったからだ。自分が足を伸ばすことのできないエリアでも、そのエリアにいるプレイヤーの助けがあれば、時間はかかるが制覇できるしスコアも得られた。お互いに協力しあうことで、僕たちはクリアに向けて少しずつ着実に前に進んでいた。

またこのゲームではエリアの制覇を促すために、毎日1つ〜5つのミッションが送られてきた。ミッションには達成期限の他に受領期限もあったため、僕はプライベートで使っているチャットに常駐させているボットに「ミッションを受領する時間」を通知する機能までつけていた。夜更かしをして朝4時まで起きていた日は、寝る前に通知を見て、アプリを起動していた。むしろ通知によって「もう4時か……」という気分になっていた。

サービス終了に伴い、ミッションの通知機能を削除するコミット

サービス終了に伴い、ミッションの通知機能を削除するコミット

このゲームにも課金要素はあった。エリアの制覇やスコア獲得を促進したり、体力を回復したり……。しかし、記念の日などになると本来は課金して購入するポイントも幾分か貰えたし、アイテム自体もミッションをこなす中で稀に貰うことができたため、結局僕は全然課金しなかった。課金はランキングに名前を載せたい人向けのものだと思っていた。他にもそういう認識のプレイヤーは少なくなかったのかもしれない。僕はそのゲームを楽しむために必要なら少々の課金は躊躇わないつもりだったけれど、「サービス維持のために必要なものを買う」ことで僕自身のゲームの楽しみ方が毀損されることは望んでいなかったので、課金しなかったことに後悔はしていない。

僕にとってはここ数年で一番遊んだ、もうプレイできないゲームだ。今でもアプリを消さずにいる。最近ようやく、癖でアプリを起動してしまうことがなくなった。


  1. 実際には入院等でプレイできなかった日があったかもしれない。

  2. このゲームの目的はエリアの制覇とスコアの獲得だったため、ここでは全てのエリアを制覇し、かつ一定のスコアを獲得することをクリアと称する。

2016-07-25 01:55:46.832628 JST

Tweet $B$3$N%(%s%H%j!<$r$O$F$J%V%C%/%^!<%/$KDI2C(B

チャットワークの iPhone アプリが使いづらい

僕の観測範囲では最近、チャットワークが盛り上がっているように見える。
宣伝に力を入れるフェーズなのかもしれない。

印象に残っているところだと、この記事では Slack よりもリピート率が高いと書かれている。

それ自体はとても良いことだと思っていて、チャットワークに頑張ってもらいたい気持ちもあるのだけど。

iPhone アプリが使いづらい。

これが本当につらくて、正直全く使う気にならない。
一応バージョンを記しておくと、 2016/06/27 リリースの v4.1.0 での話である。

チャットワークの iPhone アプリ、ここが使いづらい!

自分宛のメッセージにジャンプできない

自分宛にメッセージが来ると、プッシュ通知でお知らせしてくれるが、流速の速い/流量の多いチャットでは、その内容を見るまでに時間がかかる。

最新のメッセージにジャンプできない

流速が速いチャットでは、1日休んだりすると数百のメッセージが未読で溜まったりする。
最新のメッセージを確認する必要があるとき、未読の開始位置から延々とスクロールしなければならない。

メッセージに対するアクションをポップアップさせる UI が過敏

上に書いたように、大量のスクロールを余儀なくされることがあるのだが、スクロールしていて、途中で止めたくなったとき、タップすると、そのメッセージ自身をタップしたと判断して5つのアクションが提示される。

そのため、長めの休暇から復帰した直後など大量のメッセージの中から自分が関心を持つべきものを探すときには相当な苦痛となる。間違ってタスク作成画面に遷移してしまうことも少なくない。

(アプリとは関係ないけど)公式の入門ガイドが重くて見づらい

チャットワークの公式に、入門ガイドなるページがあるのだけど、このページ表示が重い上に目次のスクロールがしづらかったりして、とても使いづらい。
この記事を書くにあたって一応参照したのだけど、たぶんもう二度と見ない。

アプリももうちょっと頑張ってほしい

ここまで書いておいてなんだけど、チャットワーク自体に対して、ネガティブな気持ちはない。
Web 版はストレスなく使っているし、アプリでももうちょっと普通の(平均的な)チャットアプリ程度に使いやすくなってくれればとても嬉しい。

2016-07-16 02:40:54.250369 JST

Tweet $B$3$N%(%s%H%j!<$r$O$F$J%V%C%/%^!<%/$KDI2C(B

iOS の AdBlock アプリ Crystal は jQuery の colorbox を抑止する

iOS 9 で搭載されたコンテンツブロック機能によって、 Safari に AdBlock アプリを連携させられるようになった。 AdBlock アプリといってもいろいろあって、ブロックするコンテンツの判断基準が異なったりする。

今回問題になったのは Crystal という AdBlock アプリを有効にした Safari で、 colorbox によるモーダル表示ができないことだ。モーダル表示といえば、画像を拡大して表示したり、確認ダイアログを出したりと、様々な用途で用いられている。

Crystal を導入されている方は colorbox のデモページで試してみると良い。

colorbox example

回避するには、同様のことができる他のプラグインを使うのが現実的だろう。 Magnific Popup は Crystal に阻害されずちゃんと動くことを確認した。

Magnific Popup

AdBlock アプリは、どのような条件でブロック対象とみなしているかがブラックボックスになっていて、広告ではない(ブロックされてほしくない)情報がブロックされることがある。たとえば Crystal が有効だと Google Analytics による計測が正常に行えないのは周知の事実だ。とはいえ、ユーザの快適性のためにコンテンツブロックしているのであれば、今後判定条件は変わっていく(精度をあげていく)と思うし、ここに書いたような現象もいずれ解消される可能性はある。

2016-01-29 12:16:44.125647 JST

Tweet $B$3$N%(%s%H%j!<$r$O$F$J%V%C%/%^!<%/$KDI2C(B

「マヨイドーロ問題」を Perl 6 で解く(そして挫折へ)

「マヨイドーロ問題」とは

マヨイドーロ問題

始点が1つ、終点が2つある経路上に方向転換が可能なポイントがいくつか用意されている。問題となるのは、 方向転換できる回数の上限 に対して、終点のうちの片方にたどり着く移動ルートは何通りあるか。

解き方

この記事の本題ではないため、解き方、考え方について詳細には触れない。

方向転換できる回数の上限N として、 N に小さな値を入れて試していくと、解の規則性が見えてくる。

便宜上、終点の片方に到達する移動ルートの数(解)を Y、もう片方に到達する移動ルートの数を Z と記す。

この問題とフィボナッチ数の関連についての詳細は出題者の解説をご覧いただきたい。

Perl 6 での解答算出プログラム

N から Y を算出する(算出する際にフィボナッチ数を用いる)だけの簡単なプログラムだ。

my @fib = (1, 1, *+* ... *);

for $*IN.lines {
	if ($_ == 0) {
		say 0;
	} else {
		my $i = $_ % 2 == 1 ?? $_ + 1 !! $_;
		say @fib[^$i].reduce(*+*);
	}
}

解を求める分にはこれで十分である。実際には、より計算量の少ない解法があったが僕は解説を見るまで気づかなかったので、提出したのは上記のコードである。

さて、上記のコードを CodeIQ の回答システムで実行するとどうなったか。

Time Limit Exceeded だ。

2015年現在、クリスマスにリリースを控えた Perl 6 は他の言語の実行環境と比較するとまだまだ遅い。とはいえ、自分の手元ではTLEになるほどの時間はかからなかった。そして気づく。

CodeIQ の回答システムで使われている Perl 6 の実行環境は rakudo-2010.08 であるということに。

5年前の Rakudo ……。僕は知っている。その遅さを。

そして諦めた

実行環境の制約はどうしようもない。僕は結局 Haskell で書きなおしたコードを提出して、問題をクリアした。

"より計算量の少ない解法"ではどうだったか

先に書いたが、僕が最初に提出した解法より、出題者の解説に掲載されているロジックの方が計算量が少ない。

試さずにはいられなかった。

僕「これなら、あるいは……!」
CodeIQ(rakudo-2010.08)「……TLE」
僕「ですよねー」

2015-12-17 11:47:12.75823 JST

Tweet $B$3$N%(%s%H%j!<$r$O$F$J%V%C%/%^!<%/$KDI2C(B

惨劇RoopeR -その難しさと面白さ-

この記事はボドゲ紹介 Advent Calendar 2015の14日目です。

惨劇RoopeRとは

惨劇RoopeRというゲームをご存知でしょうか。

簡単に説明すると、一人のプレイヤー(脚本家)が用意した脚本に対して、残りのプレイヤー(主人公たち)が脚本家の思い通りにさせないよう妨害するゲームです。

もちろん、事前に十分な情報なくして、脚本家を妨害することはできません(推理小説などを見ても、全ての事件を未然に防ぐ探偵なんていませんよね)。では、どのようにして事件を防ぐのか。そう、ループです。

公式の説明ページに書かれているように「ひぐらし」の古手梨花や「まどマギ」の暁美ほむらのように、主人公たちはループすることができるのです。

主人公たちにとってこのゲームの目的は、惨劇の起きる数日を繰り返す中で、惨劇を回避することです。一方、脚本家の目的は「惨劇を回避させないこと」では必ずしもありません。

どのようなゲームか

このゲームは基本的に4人でのプレイを想定しています。そのため、脚本家と呼ばれるプレイヤーが1人、主人公と呼ばれるプレイヤーが3人になります。

事前準備

脚本家を担当するプレイヤーには事前準備として、脚本の用意が必要です。脚本といっても用意するのは難しくありません。いくつかの脚本がゲームに付属している他、公式でまとめた脚本集も別売で存在します。また、説明書には脚本の作り方も載っているので、そちらを参考にすればオリジナルの脚本を作ることも可能です。

脚本で決まることはたくさんありますが、特に重要なのは「登場人物とその役割」「何日目にどんな事件が起きるか(また、その犯人は誰か)」などです。この辺りは、動画投稿サイトにアップされている動画などをご覧いただくのが良いかと思います(本当はここが一番説明したいけれどネタバレにならないように書くのが難しいので今回は断念します……ごめんなさい)。

プレイ

プレイの時点で脚本は完成している必要がありますが、脚本家の仕事はこれだけではありません。プレイに際しては、脚本家はいわばゲームマスターのような役割を担います。

登場人物の配置、友好・暗躍などのカウンターは脚本家の役目です。その他、日ごと(ターンごと)の登場人物たちの移動や事件の発生などの管理も脚本家に仕事です。

では、主人公たちは何をするのか。各登場人物と仲良くなったり、別の場所に移動してもらったりします。そうすることで、事件の発生条件を満たさないようにしたり、事件の真相を究明するために必要な情報を引き出したりするのです。

主人公からみると、このゲームには明確な勝利条件はありません。脚本家が用意した脚本に存在する「主人公が敗北する」条件を全て回避すれば勝利です。

惨劇RoopeRの何が難しいか

まず、プレイするための条件が容易ではありません。プレイヤーは4人(の倍数)でなければなりませんし、なんと一回のプレイに180分〜という長時間が必要です。その上、(いくつか用意されているとはいえ)事前に脚本が必要なのです。

また、脚本家としてプレイすることも難しいです。というのも、脚本家は「主人公たちが敗北する」条件を満たすように登場人物を動かす必要があるからです。

主人公たちは1日にそれぞれ1つアクション(合計3つ)を行えます。同様に脚本家は1日に3つアクションを行えます。ただし、主人公たちと脚本家で取れるアクションは一部異なります。これはゲームバランスを維持する上でとても重要となっています。事実、互いに「相手のあのアクションがあればなー」という声は頻繁に聞けます。

最初に書いたようにこのゲームはループするため、2ループ3ループと繰り返すうちに、主人公たちは脚本家の狙いに気づいていきます。そのため、脚本家は手札を切るタイミングが重要になります。

この点が脚本家としてのプレイの難しさです。脚本によっては最初のループで「主人公たちが敗北する」条件を1つも満たさないまま、惨劇を回避して終了することもあります(僕も脚本家としてこのミスを何度かやりました)。これは結構致命的な展開で、こうなると主人公たちは何が起きるはずだったのか知ることもないまま、「なぜか勝利した」というプレイの満足感を得られないまま終わることになるためです。

逆に、良い戦いができれば最終的に主人公たちが勝利しても、それは脚本家の敗北ではありません。主人公たちが勝利したら、脚本家は次のように讃えれば良いのです。「おめでとう、君たちは惨劇を回避して見事ループを脱出した」。

なぜ惨劇RoopeRをプレイするのか

面白いからです。このゲームの何が面白いのか。いろいろありますが、推理物、論理パズルとしての難易度の高さ、バランスの良さは大きいでしょう。脚本が良ければ知的で楽しい一時が過ごせることは間違いありません。

脚本というゲームシステムの型にはめることで、推理ゲームとして非常に面白くなっています。さらに、用意されている登場人物も魅力的です。彼らにはそれぞれ、「事件の起こしやすさ」「移動できるエリアの制限」「親しくなった主人公たちへの援護」が設定されており、中にはファンタジーな登場人物もいます。

また個人的には、脚本家としてプレイするのは主人公としてプレイする以上に楽しいです。先に述べたような難しさがある分、さらに楽しいと思います。

そして、ゲームシステムに慣れてくると脚本を作ることが楽しくなります。

興味を持った人は

まずは、経験者に脚本家をやってもらって、主人公としてプレイしてみましょう。

その先、脚本家としてプレイするかどうかは自由です。人によって主人公としてのプレイの方が楽しい人もいれば、脚本家の方が楽しいという人もいます。

脚本家に興味を持った人は、脚本家の経験がある人にサポートしてもらいながら、一度脚本家をやってみると良いでしょう。そして、慣れてきたら自ら脚本を書いてみましょう。脚本家としてのプレイと脚本の作成もまた、人によって向き不向きがあります。

どの立場が自分にとって一番楽しいのか、順に試してみることをお勧めします。

この記事を読んで興味を持ったけど、周りにやってる人がいない……という人は Twitter で @risou (僕です)宛に「この記事読んで興味持ったんだけど」と伝えてもらえれば、そのうちどこかでプレイの機会を用意できるよう尽力します。

2015-12-14 22:33:58.659468 JST

Tweet $B$3$N%(%s%H%j!<$r$O$F$J%V%C%/%^!<%/$KDI2C(B