2012年9月30日日曜日

XENO TACTIC MISSION 6 ノーダメージクリア

みなさんは XENO TACTIC というゲームをご存知でしょうか。
XENO TACTIC は無料のタワーディフェンスゲームです。

タワーディフェンスゲームというのは大雑把に言えば、敵に攻撃を与えるユニットなどをマップに配置し、敵を倒すゲームです。
自分で攻撃を与えるシューティングゲームではなく、攻撃ユニットを如何に配置するかを考えるゲームです。

XENO TACTIC はその中でも、自由配置型、つまりあらかじめ敵が動くコースは決まっておらず、攻撃ユニット自体を壁として使い、コースを設計するタイプです。普通のタワーディフェンスゲームと同じように、敵を倒すと資金を得られ、その資金で配置したユニットのレベルを上げることができます。

XENO TACTIC はMission 1から6まであり、5まではノーダメージクリアもできますが、Mission 6がクセモノです。何がクセモノかというと、チートを使って資金を増やし、はじめから最大強化した武器をありったけ配置してもノーダメージクリアどころか、単なるクリアさえ、ジャグリングというテクニックを使わない限りほぼ不可能でしょう。

ジャグリングというのは、マップに作ったコース上で敵を行ったり来たりさせるという技です。どんな長いコースを作っても、そこを敵が通り抜けるまでに体力が減り切らない場合は敵1体につき1ダメージを食らいます。Mission 6の50レベルのボス、90レベル位から後の敵は、最大強化した武器で長い迷路を組んでも倒しきる事ができません。
したがってジャグリングを用い、敵を何往復もさせるうちに攻撃を加えるようにします。

迷路がながければ長いほどいいかというとそうでもありません。途中途中で出てくるヘリコプター型の敵は組んだコースに関係なく上空を飛び去りますので、画面の端から端に移動する時間しか攻撃の猶予がありません。ということで、ヘリコプターに対して攻撃力の高い武器を画面中央に敷き詰めるということが必要になります。
そうすると必然的に迷路が短くなってしまうわけです。

さて、そんなわけで資金増量チート+ジャグリングを用いて Mission 6 ノーダメージクリアができましたので、スクリーンショットを貼って自慢したいと思います(笑)

100レベルに突入しました!
左と上から飛んでくるヘリコプターをDCAが攻撃しています。

残りは2体(98レベルのボス)
数十分間ジャグリングを繰り返します。

ノーダメージクリア!

2012年9月21日金曜日

ChromeにJava APIドキュメント検索モードを追加する

Google Chrome には検索エンジンを簡単に指定する仕組みがあるのでそれを使います。
どんな機能かは Google Chrome から好きな検索エンジンで検索する方法 - EC studio 技術ブログ に詳しく書かれています。

Chromeのバージョンが違うと画面が違うので、設定に困ったら公式サイトへ。 検索エンジンの管理

さて、この検索エンジンの設定を使って、Java SE 6のAPIドキュメントを
javase List
のようなキーワードで検索できるようにしてみます。

(実はつい先日までは普通にGoogleで検索するだけで十分だったのですが、どうやらAPIドキュメントの場所が変わってしまったらしく、まともに検索できなくなりました。)

設定は以下のようにします。


  • Java SE 6
    • 検索エンジンの名前。任意の名前。
  • javase
    • 検索エンジンを切り替えるためのキーワード。重複しない任意の名前。
  • http://www.google.co.jp/search?q=%s&sitesearch=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2Fjp%2F6%2Fapi%2F
    • 検索式。「%s」が検索ワードに置き換わる。

ChromeのURL欄に「javase<スペース>」と入力すると今設定した検索エンジン(検索エンジンというか、site指定したGoogle検索)に切り替わりますので、探したいクラスやメソッド名などを入力して検索しましょう。

2012年9月4日火曜日

【Python】One-liner でフィボナッチ数列を返すジェネレータを作る

今日学校で議論していたのがこの話題。
Python にはジェネレータというものがあります。そこで、フィボナッチ数列を1つずつ返すジェネレータを作りたいという話になりました。

まずジェネレータを簡単に紹介します。
(i * 2 for i in range(0, 10))
とすると、これは 0, 2, ..., 18 を返すジェネレータになります。
ジェネレータはfor文で便利に扱えます。
g = (i * 2 for i in range(0, 10))
for x in g:
        print x
とすると、出力は
0
2
4
6
8
10
12
14
16
18
となります。

さて、ジェネレータを関数形式で書くことも可能です。
フィボナッチ数列を1つずつ返すジェネレータは次のように書けます。
def fib():
        a, b = 0, 1
        while True:
                yield a
                a, b = b, a + b

g = fib()
for i, f in enumerate(g):
        if i == 10:
                break
        print f
enumerateというのは、シーケンスの全要素に対し、各要素の位置をくっつけたタプルを返してくれる関数です。ここでは第10項までのフィボナッチ数列を求めるために使っています。

これ、 One-liner (一行プログラム)で書けたら素敵ですよね。という話になったのです。そのための構文があってもいいもんだなあ、と。
例えばこんな構文があったらどうかという結論になりました。
gen init ret next
genはキーワード、initは初期値、retは現在の値から yield するための値を取り出す関数、nextは現在の値から次の値を求める関数です。
フィボナッチ数列だったら次のように書けます。もちろん、今の Python にはこんな構文無いのでエラーですが。
g = gen (0, 1) (lambda (a, b) : a) (lambda (a, b) : (b, a + b))
for i, x in enumerate(g):
        if i == 10:
                break
        print x
これを実行すると次のような出力になることが期待されます。
0
0
1
1
2
3
5
8
13
21
34

素敵ですね。
ということで、無いなら作ってみました。
def gen(init, ret, next):
        while True:
                yield ret(init)
                init = next(init)

g = gen((0, 1), lambda (a, b) : a, lambda (a, b) : (b, a + b))
for i, x in enumerate(g):
        if i == 10:
                break
        print x
gen関数の定義は、gen構文が無いために仕方なく作った関数なので、そこを指摘して「One-liner じゃないじゃん!」と突っ込むのはやめてください。
ミソはgen関数を用いてジェネレータを生成しているところ。
while True:とかyieldとか書かなくても、結構複雑なジェネレータを1行で書くことができました。

おまけ:One-liner で素数ジェネレータ
https://gist.github.com/3618684