2007-07-19 (木)
■ 次世代ゲーム機と21世紀のレゴブロック
2005年の東京ゲームショウでPS3のデモ(MGS4とか)を見たときは、グラフィックは綺麗だけどゲームの面白さがどう変わるのかが分からなかった。 でも、この Little Big Planet というゲームからは新しい面白さを感じる。
【ソニー始まったな】 PS3上で改造マリオ以上の物が作れる!? その名も「Little Big Planet」
簡単に言うと、マリオのステージを自分で作れるというもの。 特徴的なのは物理法則に則って動くこと。
SCE JAPANスタジオの桐田富和氏は、ユーザーが自由にキャラクターやコースを作成できるソフト「Little Big Planet」を紹介。コース作成では、あらかじめ用意されたオブジェクトを配置するだけでなく、オブジェクトそのものを一から作ることも可能で、しかもその一つ一つが物理法則に基づいて動く様は圧巻だ。
たとえば、車輪の上に木を置いて、戦車のようなオブジェクトを作ると、坂道で戦車が重みに応じて動き出す。また、紐につるされたオブジェクトにキャラクターが乗ると、紐を揺らして勢いをつけ、遠いところまでジャンプするなどの操作が可能。これまでもコースが作成できるソフトはあったが、自由度の高さは次元が違うと思わせるほど。しかも、作成したコースはオンライン上に公開することができる。
こっちがゲーム画面の動画。 ステージ上の岩を倒したりボールを転がしたりと自由自在。
こっちがステージを作成している動画。 粘土を組み合わせてシーソーや木や戦車を作っている。
特に面白いのは四角と丸を組み合わせて戦車を作るところ。 これってまるで、21世紀のレゴブロックみたい*1。 普通のレゴブロックだと出来ないような、ブロックに穴を開けたり、粘土のようにくっつけることもできちゃう。 ステージを作らなくても、オブジェクトを作るだけでも楽しめるんじゃないかな。 リンク先で「ピタゴラスイッチが作れる!?」って書いてあったように。
そういえばファミコンのエキサイトバイクやレッキングクルーは自分でステージを作れたよなぁ…。 いつの間に、ゲームは与えられた題材を消費するだけになっちゃったんだろう。
※ 念のために書いておくと、 PC ゲームじゃなくて家庭用ゲーム機で遊べるようになったというのが大きいと思う。
*1 もちろん、子供の教育には直接手を動かす本物のレゴブロックのほうがいいと思うけど
■ h-index を Ruby で書いてみた
最近 Ruby のプログラムを書いていなかったので、話題のはてブ指数で使われているH指数を求めるメソッドを書いてみた。 H指数は、配列のなかから「N以上の数がN個以上含まれる」場合の最大のNを求めるもの。 例えば、「5,4,3,2,2,1」という配列なら、3以上の数が3個含まれるので、H指数は3になる。
やっていることはそんなに難しくない。
- 配列を大きい順に並び替える
- 先頭からの数と配列の値を比較する
- 両者が一致するならその値を返す
- 配列の値の方が小さければ、先頭からの数 - 1 を返す(この条件を見つけるのにちょっと手間取った)
class Array
def hindex
index = 0
sort.reverse.each do |item|
index += 1
if item == index
return index
elsif item < index
return index - 1
end
end
index
end
end
テストケースはこんな感じ。 ちょっと冗長かなぁ。上手にテストを書くって難しい。
require 'test/unit'
require 'hindex'
class ArrayTest < Test::Unit::TestCase
def test_hindex
assert_equal(4, [0,10,20,30,40].hindex)
assert_equal(4, [10,20,30,40].hindex)
assert_equal(3, [20,30,40].hindex)
assert_equal(2, [30,40].hindex)
assert_equal(1, [40].hindex)
assert_equal(3, [1,2,3,4,5].hindex)
assert_equal(2, [1,2,3,4].hindex)
assert_equal(2, [1,2,3].hindex)
assert_equal(1, [1,2].hindex)
assert_equal(1, [1].hindex)
assert_equal(3, [3,3,3].hindex)
assert_equal(2, [3,3].hindex)
assert_equal(1, [3].hindex)
assert_equal(0, [0,0].hindex)
assert_equal(0, [0].hindex)
assert_equal(0, [].hindex)
end
end
他の言語で書いてみても面白いかも。Haskellとかね。
追記
MovableTypeで構築されたブログのh-indexを求める - Open MagicVox.netのソースを読んで、もっとシンプルに書けることに気がつく。 2つの条件で比べる必要は無かったのか…。
class Array
def hindex
index = 0
sort.reverse.each do |item|
index += 1
return index - 1 if item < index
end
index
end
end
こっちの方が分かりやすいかな? リンク先のソースはこのアルゴリズムになってた。
class Array
def hindex
index = 1
sort.reverse.each do |item|
break if item < index
index += 1
end
index - 1
end
end
追記 (2)
odz buffer - h-index に Haskell 版のソースが。 「-1」が無くてシンプル!
hindex :: [Int] -> Int
hindex lst = length $ takeWhile cond (zip sorted [1..])
where
sorted = sortBy (flip compare) lst
cond (val, rank) = val >= rank
追記 (3)
h-index を Ruby で書いてみた - にっき (2007-07-20)に Ruby のシンプルなコードが!
class Array
def hindex
sort.reverse.each_with_index do |item, index|
return index if item <= index
end.size
end
end
PCに移植されたら買うかも