いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

タイルをランダムにシャッフルするのも rand() 関数で可能です。

しかし

15 パズルを開始するためのシャッフルはただ単純に rand() を使うだけではダメです。たとえばタイルの情報を tiles 配列に保存するとして、シャッフルを次のように書いたとします。

int tiles[15] = {  1,  2,  3,  4,
                   5,  6,  7,  8,
                   9, 10, 11, 12,
                  13, 14, 15  };
int i, src, dst, wrk;

// 100 回シャッフルする
for (i = 0; i <100; i++) {
  // ランダムに入れ替えるポイントを決定する
  src = rand() % 15;
  dst = rand() % 15;
  // src と dst の値を入れ替える
  wrk        = tiles[src];
  tiles[src] = tiles[dst];
  tiles[dst] = wrk;
}

すでにお気づきの方もいらっしゃるかと思いますが、実はランダムにシャッフルすると 15 パズルが完成しない場合があるのです。私は知能不足で数学的な裏付けがとれないのですが、とにかくシャッフルはあたかも本当に手作業でシャッフルしているかのように書く必要があるのです。

これでゲームプログラマの学友が3人くらいハマっていました。

Comments

しろいわ
2007/09/15 09:38:49

はじめまして。某ギルドから来ました。

> これでゲームプログラマの学友が3人くらいハマっていました。

僕もハマってました(笑
世界的に有名な問題なようですね。

Byerkut
2007/09/15 16:02:01

>しろいわさん

いらっしゃいませ(^^

しろいわさんのサイトを見せていただいて驚きました。
そんなグローバルな問題だったとはッ!?
リンク先のサイトへも行ってみましたが、
数学的見知はサッパリわかりませんでした。
だめだめです。

Contributions




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS