«前の日記(2007-07-18 (水)) 最新 次の日記(2007-07-20 (金))»  

まちゅダイアリー


2007-07-19 (木)

次世代ゲーム機と21世紀のレゴブロック

2005年の東京ゲームショウでPS3のデモ(MGS4とか)を見たときは、グラフィックは綺麗だけどゲームの面白さがどう変わるのかが分からなかった。 でも、この Little Big Planet というゲームからは新しい面白さを感じる。

【ソニー始まったな】 PS3上で改造マリオ以上の物が作れる!? その名も「Little Big Planet」

簡単に言うと、マリオのステージを自分で作れるというもの。 特徴的なのは物理法則に則って動くこと。

SCE JAPANスタジオの桐田富和氏は、ユーザーが自由にキャラクターやコースを作成できるソフト「Little Big Planet」を紹介。コース作成では、あらかじめ用意されたオブジェクトを配置するだけでなく、オブジェクトそのものを一から作ることも可能で、しかもその一つ一つが物理法則に基づいて動く様は圧巻だ。

たとえば、車輪の上に木を置いて、戦車のようなオブジェクトを作ると、坂道で戦車が重みに応じて動き出す。また、紐につるされたオブジェクトにキャラクターが乗ると、紐を揺らして勢いをつけ、遠いところまでジャンプするなどの操作が可能。これまでもコースが作成できるソフトはあったが、自由度の高さは次元が違うと思わせるほど。しかも、作成したコースはオンライン上に公開することができる。

こっちがゲーム画面の動画。 ステージ上の岩を倒したりボールを転がしたりと自由自在。

こっちがステージを作成している動画。 粘土を組み合わせてシーソーや木や戦車を作っている。

特に面白いのは四角と丸を組み合わせて戦車を作るところ。 これってまるで、21世紀のレゴブロックみたい*1。 普通のレゴブロックだと出来ないような、ブロックに穴を開けたり、粘土のようにくっつけることもできちゃう。 ステージを作らなくても、オブジェクトを作るだけでも楽しめるんじゃないかな。 リンク先で「ピタゴラスイッチが作れる!?」って書いてあったように。

そういえばファミコンのエキサイトバイクやレッキングクルーは自分でステージを作れたよなぁ…。 いつの間に、ゲームは与えられた題材を消費するだけになっちゃったんだろう。

※ 念のために書いておくと、 PC ゲームじゃなくて家庭用ゲーム機で遊べるようになったというのが大きいと思う。

Tags: Game

*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
Tags: Ruby
本日のツッコミ(全1件) [ツッコミを入れる]
kenz (2007-07-19 (木) 12:06)

PCに移植されたら買うかも