enchant.jsを使用したゲーム制作【戦術シミュレーション編】

例の先輩主催の勉強会にて、テーマが「ゲーム制作」だったので、まったくのゼロスタートでしたがゲームを作ってみました。

※作ったゲームのソースコードはwhitiaのGitHubで公開中。随時更新しています。
※勉強会で発表したスライドはこちら。主にenchant.jsの紹介をしています。

作ったゲームのジャンルはタイトルにもある通り「戦術シミュレーション」というものです。フィールドに自軍と敵軍がいて、敵軍の動向を伺いながら自軍の駒を操作し、目的(敵軍殲滅や特定ポイント到達等)を達成するというゲームです。
作成したスライドにも多少このジャンルについて書いていますので、よろしければご覧ください。

選択した理由ですが、単純に好きだからというのもありますが、作るのが一番楽しそうだと思ったからです。
しかし調べてみるとわかりますが、数あるゲームジャンルの中でもこのジャンルのゲームを作るのは難しい部類に入るらしいのです。
その理由は「AIの実装の難しさ」に尽きます。

障害物が何もないフィールドであれば何も問題ありません。目的地に向かって一直線に進むように実装すればいいだけです。
しかし実際のゲームは様々な要因がフィールド上に存在しています。障害物はその一つに過ぎません。
そういった要因を考慮して(させて)、人間らしい思考回路を持たせることがこのジャンルの骨子と言えます。

さて、実際に作ったゲームは、体裁だけはそれなりに整えましたがまだまだゲームとは言えない代物です。戦術シミュレーションの醍醐味である戦略性なんかは微塵もありません。
それもそのはず、今回作ったゲームはそもそもの考え方からして間違っていたからです。

今の実装を簡単に説明すると以下のようになります(例として敵の行動時について書いています)。

  1. 自分の周囲8方向および現在地点を合わせた9方向を移動範囲に設定する。
  2. 1.のとき、9方向の中に障害物またはプレイヤーまたは他の敵がいたら、そこには移動範囲を設定しない。
  3. 移動範囲の中でプレイヤーに近付く。
  4. プレイヤーと接触したら攻撃を行う。

基本的な流れとしてはこれでいいと思います。しかし、個々の実装の仕方がまるで駄目。初めての制作とういことで単純化しすぎて、まるで見当違いのアルゴリズムを書いてしまっていたようです。

初めに行っている「移動範囲の設定」について書きます。
仮にフィールド上に障害物等が何もない場合、移動範囲は対象の周りをぐるっと囲むように設定され、3×3の正方形ができあがります。この正方形ができることがもうおかしいのです。
戦術シミュレーションゲームには、プレイヤーにしろ敵にしろ、普通「移動歩数」というものが設定されています。この「移動歩数」が何に設定されていたとしても、最も遠くに進めるパターンは「上下左右のいずれかだけに進んだとき」になります(上なら上、右なら右だけに進むパターン)。つまり、フィールド上に障害物等が何もない場合、できあがる図形は菱型になるはずです。

この「移動歩数」という概念がすっぽりと抜け落ちていました。
まずはここから手直ししていく必要がありそうです。
結構コアな内容になってしまいましたが、例の勉強会でこのことについて発表したいと思ってます。

広告

【サバイバル】キャスト・アウェイの紹介

サバイバル作品の感想第二弾は『キャスト・アウェイ』。2000年公開のアメリカ映画。

いくつかネタバレを含みますのでご了承を。

あらすじ

運送会社に勤める主人公、チャック・ノーランド(トム・ハンクス)は、自社の貨物機が荷物を輸送するところに同乗していた。
しばらく飛空していると、貨物機の周囲に暗雲が立ち込め、やがて激しい雷雨が貨物機を襲うようになった。
貨物機は雷雨の影響でコントロール制御が効かなくなり、機長は海上に緊急着陸することを決心する。
猛スピードで高度を下げていく機体の中で、チャックは婚約者の写真が入ったロケットを手に神に祈った。
激しい衝撃とともに機体が割れ、そこから侵入した海水によって貨物機の中はあっという間に水で満たされる。
チャックは命からがら非常用のゴムボートとともに海面に浮上した。
海は大時化の様相を呈しており、波がチャックの乗ったゴムボートを縦横無尽に弄ぶ中、チャックは必死にゴムボートから放り出されないように自身とゴムボートを紐で繋いだ。
波に踊らされるゴムボートの中で、チャックはいつしか気を失っていった。

チャックが気が付くと、そこは砂浜だった。
海水をたっぷりと吸って重くなった衣類を引きずりながら内陸のほうへと進むと、そこにはジャングルと言って良いほどの大自然が広がっていた。
チャックは、彼と同じくこの大自然に放り込まれた輸送中だった荷物とともに、次第にサバイバルに順応していく。

舞台

チャックらが乗っていた貨物機がどのあたりを飛行中であったのか、明確な描写はない。
(Wikipediaにはチャックが流れ着いたのは「南太平洋の無人島」と書いてあるので、見落としているだけかもしれない)
チャックは漂着した砂浜近辺からあまり移動しないため無人島なのかは不明のはずだが、暗黙の了解で無人島ということになっている。

漂着時の状況

チャックらが輸送していた荷物の一部が付近に散乱している。ひとつひとつ中身を確認するが、あまり役に立ちそうなものはない。
その中のアイススケート用の靴のみ、刃部分を様々な用途に用いることになる。

島の様子

砂浜からは見渡す限りジャングルが広がっており、遠くには断崖絶壁も見える。
明確な描写はないが、そこが無人島であると察せられる。
海岸には椰子の木が生えており、その下には椰子の実が落ちていて、チャックの主な食料となる。
その他、どういった植物が群生しているのか、野生動物がいるのかといった細かい描写はあまりない。

主人公の様子

チャックは旅行中だったわけではないので、本当に着の身着のまま無人島に放り込まれたことになる。
貨物機を操縦していた機長らしき人物が遺体となって発見され、チャックは彼の衣類を拝借する。
しかし靴だけはチャックの足に合わなかったため、ぼろとなった衣類を加工して即席の足袋のようなものを作り、それを履いて活動することとする。
一般的な成人男性ということで、著しく身体能力が劣るということはない。

感想

まず、本作品は映像作品ということで、小説等にはない圧倒的な現実感が存在する。
チャックが初めて大自然を見上げるとき、その大きさに圧倒される。おそらく地図上には現れないであろう小さな島だったとしても、われわれ人間にとっては大自然に違いないと痛感させられる。
チャックが素足で岩肌の上を歩いているとき、自然はいとも簡単に彼の足を傷つける。岩肌の硬さに対して、チャックの、人間の肌の軟さが強調される。

サバイバルには付き物の椰子の実だが、中心には人間の飲める水分が入っていたり、その周囲にはわずかではあるが人間の食べられる果肉があったりと、サバイバルを強いられた人間にとっては非常にありがたい存在である。
しかし、それらの周囲には何層にも重なった繊維が詰まっており、生半可な衝撃では傷ひとつつけられない。
チャックは椰子の実を発見し、中の水分を得ようと岩肌に投げつけたり、スケート靴の刃を用いて傷をつけたりと悪戦苦闘した末、ようやく数滴の水分を得ることができる。
サバイバルではよく登場する椰子の実は、初期段階で得られる手軽な食料という印象だが、実際にはこのようにそんな簡単なものではないことを知ることになる。
(ちなみに、椰子の木から落ちて時間が経過した実は、水分が抜け硬質化しているため、枝のない椰子の木を登って数メートル~十数メートルのところになっている椰子の実を直接もいで得なければならない)

無人島に漂着してからのチャックは、悪戦苦闘しながらも大自然の環境に順応していく。
そこで唐突に画面が暗転、再び明転したと同時に表示される「4 Years Later(4年後)」の文字・・・
映画なので仕方ないが、もう少しサバイバル部分が長くても良かった気がする。

【サバイバル】サバイバルヤルオの紹介

サバイバルに関連する作品の感想、第一弾(そろそろ書かないと記憶から風化してしまうのでようやく書きます)。
第一弾は最もお気に入りの『サバイバルヤルオ』。この作品は2chのスレで書かれた、いわゆるやる夫スレ*のひとつとして公開されているため、誰でも無料で読むことができる。
*架空のキャラ「ニュー速で・やる夫」を主人公にして、様々な物語を展開するスレの総称。

あらすじ

太平洋上を航行する一隻の客船に搭乗する主人公・やる夫が甲板で一息ついていると、一粒の雨が彼の頭を濡らした。
仕方なく自身の船室へと戻るが、雨は風を帯び、やがて嵐となって客船を激しく揺らすまでになっていった。
そのときやる夫の船室を高波が貫き、浸水した海水によってやる夫は大海原へと攫われてしまう。
夜が明け、やる夫が気が付くとそこは砂浜だった。やる夫は奇跡的にも太平洋上のとある島に流れ着いたようだった。
あたりを見回すと、すぐ近くに自分の荷物が流れ着いているのを見つけた。
荷物を手に改めてあたりを見回すと、やる夫と同じように砂浜に打ち上げられている人影があるのを発見した。
打ち上げられていたのは一人の少女だった。
やる夫は急いで少女のもとへ駆け寄ると、彼女に声を掛けた。
すると少女は気が付き、周囲をひと通り確認すると、すぐに状況を察したようだった。
やる夫と少女は互いに状況の確認をし合った。すると、二人とも同じ客船に搭乗しており、昨晩の嵐で同じように海に投げ出され、島に漂着していたことがわかった。
二人は生き抜くべく、協力して島の探索を始めるが・・・

舞台

物語序盤では、客船がどのあたりを進んでいたのか明らかにされていない。従って、やる夫たちが流れ着いた島がどこなのか知るすべはないが、中盤あたりで船が太平洋上を進んでいたことが少女の言によって明かされる。そして島の状況が判然となるにつれ、島が赤道からそう遠くない位置にあることが察せられる。

漂着時の状況

やる夫はフランスで菓子職人をしていたが、とある理由で日本に戻る途中に事故に遭ってしまったため、彼の荷物にはひと通りの調理道具(鍋・フライパン・包丁等)が入っている。また彼は喫煙者のため、ライターおよび十分なライターオイルを持っていると説明される。
少女の荷物もすぐに発見されるが、やる夫と違って役に立ちそうなものはない(洗顔料を使っている描写があるため、そういった類の道具は揃っていると思われる)。
また、二人とも旅行者には違いないので、数日分の衣類は持っている。

島の様子

島の探索を始めてすぐに二人は汽水域(淡水と海水が入り交じるエリア)を発見する。その水が異様に澄んでいたことに気が付いた少女は、少なくともこの川沿い周辺に人が住んでいないことを察する(人が住んでいると川が汚染される)。後に島は完全な無人島であることが判明する。
先述したように島は太平洋上の赤道からそう離れていない位置に存在すると推測されるため、一年を通して温暖な気候であり、従って植生が充実している。植生が充実していれば草食動物や虫が繁栄し、それらが増えると肉食動物が現れる。
また、島は極端なほど人間が食べられる動植物が多く存在している。これは物語の都合上そうしたわけではなく、中盤以降にきちんと理由が説明される(後付かもしれない)。

二人の様子

やる夫はフランスで菓子職人をしていたため、料理の腕は確かである・・・はずなのだが・・・?
やる夫は良く言えば恰幅のある体型、悪く言えば肥満体型と言ってよい体格で、物語では主に肉体労働を担当する。
一方少女のほうは、やる夫と比べなくとも華奢な体型をしており、体重に至ってはやる夫の半分ほどしかない。しかし頭脳は非常に明晰で、やや平均未満であるやる夫に代わって物語では頭脳担当である。

感想

サバイバルを扱った作品は、植生が充実している熱帯~亜熱帯に位置する無人島が舞台になることが多い。本作品も赤道に近い無人島が舞台であり、それに加えて初期段階での道具類の充実、自然から得られる食材の豊富さ、各人のポテンシャルの高さといったように、サバイバルとしての難易度は他の作品と比較して高くない。

本作品の魅力は、食材や道具を得る過程をぼかしておらず、どういった物からどういった効果が得られるのかが具体的に示されている点である。
例えば、魚を獲るには仕留めるための槍や銛のようなものが必要である。槍の場合、先端を尖らせた石、十分な長さかつ折れにくい木の棒、それらを繋ぐ紐が必要である。石を加工するには石より硬いものが必要だし、折れにくい材質の木の棒や千切れにくい紐(ツル科の植物等)の確保が必要である。また、魚は夜間のほうが釣れやすいため、あたりを照らす光源(松明等)が必要である。
魚を獲ようとするだけでも、リアルに描写しようとすれば上記のような手順が必要だが、本作品はこれらをひとつひとつ確実に達成していく様子が丁寧に描かれている。

本作品は、サバイバルを扱った作品としては比較的短い半年程度の物語である。『ロビンソン・クルーソー』の28年間は極端に長いとしても、『二年間の休暇(十五少年漂流記)』は2年間と、たいていは数年~十数年の物語が平均的である。
その理由は、上記「本作品の魅力~」で述べたように、一日の活動内容を仔細に描写しているためである。たった半年間であるからこそ、サバイバル作品としては非常に濃密なものとなっている。

本作品は一種のボーイ・ミーツ・ガール作品とも言える。しかしその内容は必ずしもハッピーエンドではなく、むしろ人によっては見るのが辛いような内容かもしれない。(本筋からは外れるためこれ以上の言及はしない)

こんな感じで他の作品についても感想を書いていきます。

jquery.xdomainajax.jsを使ったJavascriptスクレイピング

先日、会社の先輩に誘われて先輩主催の勉強会に参加した。そこで得たスクレイピングの概念を理解するためにテストプログラムを作ってみた。

whitiaのGitHubにソースコード公開中。

プログラムの概要

検索用のテキストボックスに何か言葉を入力してSearchボタンを押すと、Wikipediaの該当のページから項目名・本文・関連項目・関連用語(本文内のリンク項目)のみを取得し表示する。

プログラムの特徴

・ローカルで動作する

jquery.xdomainajax.js、HTMLファイル、JSファイルをローカルの任意のディレクトリに配置するだけで動作する(Javascriptを採用したのはそれが理由)。当たり前だがインターネット接続環境は必要。

・カスタマイズが容易

Wikipediaの必要な項目のみ取得するので、HTMLとCSSをカスタマイズすれば自分の好きなデザインでWikipediaのページを読むことが可能。

・関連用語(本文内のリンク項目)を抽出

本文内でリンクされている用語を抽出し列挙しているため、いわゆる「関連項目」以外の関連用語を俯瞰することができる。

・関連項目/用語へのリンク

関連項目と関連用語を抽出し列挙しているのは先述の通り。抽出した語句はリンクしているので、クリックして即座に別の語句のページを読むことが可能。

これは発展の余地がある項目だと思っている。リンクを自動でクロールするようにすれば、ある項目についてのマップが作成できる。考えは及ぶものの実現には相当な労力が必要だろう。

今後の課題

・本文内のリスト取得

現在は本文内にリストが含まれている以下の様な場合、リストが表示できないため、リストも表示できるようにする。

予防 [編集]

予防策として、

  • 感染の予防策としてはペスト菌を保有するノミや、ノミの宿主となるネズミの駆除
  • ワクチンの摂取
  • 腺ペスト患者の体液に触れない

が挙げられる。

・関連項目/用語のリンク不具合

関連項目/用語に半角スペースが含まれている場合、正しくリンクしない(半角スペースで語句が途切れる)ため、半角スペースが含まれいても正しくリンクするようにする。

最後に

たぶん同じようなプログラムは数多あると思う。Wikipedia APIというのもあるが、取得可能な項目が微妙だったので自分で作った。まだまだ改良する余地は十分にあると思うものの、ひとまず形にはできたので公開した。

興味のある分野

現在興味を持っているものについて以下に記載する。

サバイバル

現代の人間が着の身着のまま大自然に放り込まれたらどうなるか、どうするか、どうすべきかに関心がある。碌な装備も持たず大自然に放り込まれた場合、如何に衣食住を満たすかが鍵となる。もちろん放り込まれた環境にも依る。

サバイバルは小説・漫画・映画等の娯楽作品に採用されやすいテーマといえるため、世の中にはサバイバルをテーマとしたたくさんの作品がある。自分が見た or 読んだ作品は今のところ以下の通り。

  • Cast away(映画)
  • 漂流(小説)
  • 夏の朝の成層圏(小説)
  • ロビンソン・クルーソー(小説)
  • サバイバルヤルオ(Webコンテンツ)←オススメ!

それぞれについていずれ感想を書きたい。

英語

英語はずっと前から勉強したいと思っていたもののなかなか手が付けられずにいた分野。

数ヶ月前、会社のとある先輩と話す機会があり、いろいろと話していると、凄く勉強熱心な人だということがわかった。その先輩が中でも力を入れているのは哲学で、哲学の本(原著)はだいたいドイツ語等のヨーロッパ圏の言語で書かれていることが多いらしく、原著で読むために語学にも力を入れているという話を聞いた。

自分にはそんな崇高な目的があるわけではないが、外国語がわかるようになると何かと便利なのは今更言うまでもないことなので、本格的に勉強を始めることにした。

英語の勉強方法についてはいずれ詳しく書きたい。

化学

勉強し始めて半年とちょっとほど経つため、上二つに比べてやや興味が薄れてきたかもしれない。今は高校化学の応用レベルくらいの内容の本を読んでいる。

今までに読んだ化学の本等についていずれ詳しく書きたい。