2011-01-26 16 views
3

私はFlood-Itスタイルのゲームを作ろうとしており、メインアルゴリズムに問題があります。Flood-Itゲームの再帰関数アルゴリズム

アルゴリズムは、すでに制御しているすべての四角形をチェックし、制御しない選択された色を持つ隣接する四角形を探します。

変数:

1 - $ボード:ボードの状態を保持して2次元配列

  • あなたは配列にコントロールする四角形は「あなたがドン= 0
  • 正方形で制御範囲は1から6であり、異なる色を表す。

2 - $色:ユーザーによって選択された色

3 - $サイズ:でプレイボードの正方形サイズ

4 - $ RKEY/$のCKEY:行と2次元配列の列

主な問題は、最初のいくつかの四角形が開始角にあり、おそらく2または3であり、新しい四角形の制御を停止することです。ここで

は私が作るしようとしているゲームの例です:http://floodit.appspot.com/

function checkRecursive($rkey, $ckey) 
{ 
    global $board, $size, $color; 
    if ($board[$rkey][$ckey] == 0) 
    { 
     if ($rkey < $size-1 && $board[$rkey + 1][$ckey] == $color) 
     { 
      $board[$rkey + 1][$ckey] = 0; 
      checkRecursive($rkey + 1, $ckey); 
     } 
     if ($ckey < $size-1 && $board[$rkey][$ckey + 1] == $color) 
     { 
      $board[$rkey][$ckey + 1] = 0; 
      checkRecursive($rkey, $ckey + 1); 
     } 
     if ($rkey > 0 && $board[$rkey - 1][$ckey] == $color) 
     { 
      $board[$rkey - 1][$ckey] = 0; 
      checkRecursive($rkey - 1, $ckey); 
     } 
     if ($ckey > 0 && $board[$rkey][$ckey - 1] == $color) 
     { 
      $board[$rkey][$ckey - 1] = 0; 
      checkRecursive($rkey, $ckey - 1); 
     } 
    } 
} 

答えて

1

はあなたのコードを読んで、あなたは常に、その後正方形たら、(0,0)から開始している場合、それは次のようになりますそのセルにすぐ隣接するプレイヤーがプレイヤーのコントロール下にある場合、それ以上のチェックは受けられません。

あなたは行くよ:

  • 開始
  • (0,0)でチェック(0,1):すでに0に設定すると、何もしません。
  • check(1,0):すでに0に設定されているため、何もしません。

「制御する」四角形の概念を削除する必要があるかもしれないと思います。あなたは、異なる色でflood fillアルゴリズムを繰り返し実行するだけです。

$ oldcolorは、あなたが開始する前に、開始セルの色で、$ newcolorは、ユーザーが選択した色であるところ、私は、このようなものが良いかもしれないと思う:私は洪水を実現していなかった

function checkRecursive($rkey, $ckey) 
{ 
    global $board, $size, $oldcolor, $newcolor; 
    if ($board[$rkey][$ckey] == $oldcolor) 
    { 
     $board[$rkey][$ckey] = $newcolor 
     if ($rkey < $size-1 && $board[$rkey + 1][$ckey] == $oldcolor) 
     {    
      checkRecursive($rkey + 1, $ckey); 
     } 
     if ($ckey < $size-1 && $board[$rkey][$ckey + 1] == $oldcolor) 
     { 
      checkRecursive($rkey, $ckey + 1); 
     } 
     if ($rkey > 0 && $board[$rkey - 1][$ckey] == $oldcolor) 
     { 
      checkRecursive($rkey - 1, $ckey); 
     } 
     if ($ckey > 0 && $board[$rkey][$ckey - 1] == $oldcolor) 
     { 
      checkRecursive($rkey, $ckey - 1); 
     } 
    } 
} 
+0

オンラインアップデートでうまくいった;)素敵。このコードは仕事をしなければならないように見えます。戻ってupvoteに来る21時間で私に思い出させてください。 :) – sarnold

+0

ありがとう、それは今働いています。私が「制御している」四角形を取り除かなければならなかったので、私はしばらくしていました。 – TheAutumnAurora