2017-07-30 15 views
2

ボードゲームを作って、javascriptとimに領域を数えるのに問題がある。あなたが知りませんでした場合、GOは複雑なチェッカーのように、石を斜めに置くのではなく、水平に、そして垂直に置きます。ゲームが終了し、あなたの石の境界線を作ったとき(ボードのエッジは任意のものとしてカウントされます)、領域が発生します。ボードゲームの領域(GO)を計算するロジックの背後にあるロジック

territory

したがって、上記の画像は私がこれまで持っているものです。

白=プレイヤー1、黒=プレイヤー2、緑=領土

だから、緑は唯一のゲームの終わりに来ます。ゲームは終了しました。黒は、ボードの左上隅に2人の囚人を拘束しています。内部のグループは識別され、緑色で色付けされています。問題は、緑の領域がどのプレイヤーに属しているかをどのように知っていますか?

すべての人間は、黒色が領土のすべての側面/境界を所有していることがわかります(ボードのエッジは任意です)。囚人がいると難しくなる。私はすべての緑のセルに隣接するすべてのセルをチェックすることができます。黒と白があれば、それは領地ではなく、囚人がいるならそれはうまくいかない。

私が考えている方法の1つは、周りを回る国境を特定しようとすることです。もし私がそれをすることができれば、私はそれが誰であるかを簡単にチェックすることができます。ボーダーピースを計算するのは、四角形ではあるが円か、どんな変形された形でも簡単だろうか?よく分かりません。

すべてのヘルプはにappriciatedされ:) Imはアイデアを自分で投稿し、この方法を試してみるつもり

+0

あなたはそれのために独自のアルゴリズムを作成しなければならないでしょう – user7951676

+0

私はそれを集めましたが、そのアルゴリズムの論理は何ですか?私はちょうど私がグループのすべての駒をスクロールできることを実現しました。それは、すべての側面に緑を持っている場合は、中央にあり、境界を識別するために削除することができます。それが囚人と一緒に働くかどうかわからない –

+0

私はGoがどのように働くのか分かりません。ボードを分割する部分のパスを見つける必要がありますか(floodfillと言ったので) - [この質問]をチェックしてください(https://stackoverflow.com/questions/2631576/using-recursion-to-find-paths-in-a -2d-array) – James

答えて

-1

。だから私は最初に、この場合はインデックス0の領域で最も左の列を取得します。私はすべての列をスクロールするforループを使用して、列内の最も上と下の石を見つけます。したがって、最初は列0です。最も上の石は0で、最も下のものは5です(ボードのマーキングは無視します)。それはこの形の上下の枠線でなければならないので、上の1つ上と下の1の上の石をチェックし、それらをメモします。

石の最上部の0,0がボードの端であるため、そのマークは "both"です。今度は下に向かって、その下に「黒」とマークされます。私たちは今、この領土の所有者を持っています。私はすべての列とすべての行のためにこれを繰り返しますが、競合する所有者があれば、私はそれが領域ではないのでループを壊します。

私はちょうど私の頭の中でこの考えと私は自分のアルゴリズムを使用して、最終的には非常に効果的にこれを行うために管理

+0

*私はちょうど私の頭の中でこれを考え、今それを試してみようとしています*それは答えではありません。あなたがそれを実装してそれがうまくいくことを見つけると、それは答えになるでしょう(ヒント:そうではありません)。 –

+0

とそれはなぜなら?ロジックは完璧だと思われる。また、答えのセクションは、常に動作するdiffinitive答えisntです。人々は提案と、それがうまくいくと思うものを投稿します。もしそうなら、opはそれにダニを与え、それがうまく動作すると言います。 –

0

今それをしようとするつもりイム。

まず、問題の地域を特定し、lowX、lowY、highX、highYを取得します。したがって、この場合は、それぞれ0,5,5,5となります。私は、このようなforループを実行します。

for (var j = lowX; j < highX + 1; j++) 
    {  
     var lowColumnY = null; 
     var highColumnY = null; 

     for (var k = 0; k < territories[i].length; k++) 
     {    
      if (territories[i][k].x == j) 
      { 
       if ((lowColumnY == null) || (territories[i][k].y < lowColumnY)) 
       { 
        lowColumnY = territories[i][k].y; 
        console.log(lowColumnY); 
       } 

       if ((territories[i][k].y > highColumnY) || (highColumnY == null)) 
       { 
        highColumnY = territories[i][k].y; 
       } 
      }        
     } 

領土のすべての列をスクロールするように、宣言した最初の2つの変数であり、低と高ポイントをうまくいきます。私はYのためにforループを繰り返し、最後に境界のすべての座標を残しています。私は赤い円を描くことでこれを実証しました。それは視覚的に容易であり、あなたがそれを見ることができるので、どんな囚人にも干渉しないということです。

territory

だから、最後に私はちょうど赤い円がある石の各色を確認してください。矛盾する色がある場合、それは領域ではありません。このケースでは、唯一の色が黒だったので、黒の領域がわかります。

+0

また@torazaburoあなたは今それを言ってあなたの顔に卵を持っています:) –

関連する問題