2016-03-25 7 views
0

タイルが交換されるC/C++で部分ゲームをしましたHere。 私は今キャンディクラッシュを実装したいと思うし、キャンディーを描くことが多くの努力を要することを知っています。タイルに仕事をさせてください。 タイルに色を割り当てる部分では、行または列に3色を表示したくありません。どのように効率的な方法でこれを行うのですか? 私は現在、次のようにランダムに色を割り当てるしています。このようになります私はキャンディクラッシュのようなゲームでタイルに色を割り当てるにはどうすればいいですか?

board[i][j].color=rand()%3; 

は: Snapshot of program

はい、私はノーである同じ色を持っている行または列の三つのセルやタイルをしたくありません同じ色の2つ以上の隣接するタイル。 私は色が一度割り当てられているソリューションと、行内の3つのタイルが同じ色を持っている場合にチェックが行われることを望まないということです。すべてのタイルの色を再度生成しない場合。あまりにも素朴でコストがかかるでしょう。 もう1つの解決策は、ラスタ順のチェックで、タイルに色を割り当てる前に、下または左の2つのタイルが他の色を割り当てている場合、同じ色を持つかどうかを確認することです。それも明白です。より良い方法がありますか?

天気衰退の答えに続き

私はSTLのイテレータとset_differenceメソッドを使用して、設定された差分演算を行っているコードを掲示しています。私がしようとしているのは、set操作を使ってすでに2回(下または左)繰り返されている色だけを削除して、そのセットを形成している色のセットから無作為に選択する前です。コードに何か問題があります。私はSTLの知識があまりありません。誰も私がそれを適切に使用する方法をガイドしてください。

for(j=0;j<maxy;j++) 
{for(i=0;i<maxx;i++) 
{ 
    int first[] = {0,1,2,3},fsize,i34; 
    std::vector<int> v(5);      
    std::vector<int>::iterator it; 

    board[i][j].x0=x0+i*dx+1; 
    board[i][j].x1=x0+(i+1)*dx-1; 
    board[i][j].y0=y0+j*dy+1; 
    board[i][j].y1=y0+(j+1)*dy-1; 


    if((i-1)>=0&&board[i-1][j].color==0&&(i-2)>=0&&board[i-2][j].color==0) 
    {int second[] = {0}; 
    std::sort (first,first+4);  
    it=std::set_difference (first, first+4, second, second+1, v.begin()); 
    v.resize(it-v.begin());      
    std::copy(v.begin(), v.end(), first); 
    } 
    fsize=v.size(); 
    if((i-1)>=0&&board[i-1][j].color==1&&(i-2)>=0&&board[i-2][j].color==1) 
    {int second[] = {1}; 
    std::sort (first,first+fsize);  // 5 10 15 20 25 
    it=std::set_difference (first, first+fsize, second, second+1, v.begin()); 
              // 5 15 25 0 0 0 0 0 0 0 
    v.resize(it-v.begin());      // 5 15 25 
    std::copy(v.begin(), v.end(), first); 
    } 
    fsize=v.size(); 
    if((i-1)>=0&&board[i-1][j].color==2&&(i-2)>=0&&board[i-2][j].color==2) 
    {int second[] = {2}; 
    std::sort (first,first+fsize);  // 5 10 15 20 25 
    it=std::set_difference (first, first+fsize, second, second+1, v.begin()); 
             // 5 15 25 0 0 0 0 0 0 0 
    v.resize(it-v.begin());      // 5 15 25 
    std::copy(v.begin(), v.end(), first); 
    } 
    fsize=v.size(); 
    if((j-1)>=0&&board[i][j-1].color==0&&(j-2)>=0&&board[i][j-2].color==0) 
    {int second[] = {0}; 
    std::sort (first,first+fsize);  // 5 10 15 20 25 
    it=std::set_difference (first, first+fsize, second, second+1, v.begin()); 
             // 5 15 25 0 0 0 0 0 0 0 
    v.resize(it-v.begin());      // 5 15 25 
    std::copy(v.begin(), v.end(), first); 
    } 
    fsize=v.size(); 
    if((j-1)>=0&&board[i][j-1].color==1&&(j-2)>=0&&board[i][j-2].color==1) 
    {int second[] = {1}; 
    std::sort (first,first+fsize);  // 5 10 15 20 25 
    it=std::set_difference (first, first+fsize, second, second+1, v.begin()); 
           // 5 15 25 0 0 0 0 0 0 0 
    v.resize(it-v.begin());      // 5 15 25 
    std::copy(v.begin(), v.end(), first); 
    } 
    fsize=v.size(); 
    if((j-1)>=0&&board[i][j-1].color==2&&(j-2)>=0&&board[i][j-2].color==2) 
    {int second[] = {2}; 
    std::sort (first,first+fsize);  // 5 10 15 20 25 
            // 10 20 30 40 50 
    it=std::set_difference (first, first+fsize, second, second+1, v.begin()); 
            // 5 15 25 0 0 0 0 0 0 0 
    v.resize(it-v.begin());      // 5 15 25 
    std::copy(v.begin(), v.end(), first); 
    } 
    // first=&v[0]; 
    fsize=v.size(); 
    cout<<v.size()<<" "; 
    for(i34=0,it=v.begin();it!=v.end();it++) 
    {cout<<*it<<" "; first[i34++]=*it;} 
    cout<<" "; 
    if(v.size()>0&&v.size()!=5) 
    board[i][j].color=first[rand()%i34]; 
    else if (v.size()==5) board[i][j].color=first[rand()%4]; 
    } 
    cout<<"\n"; 
} 
+0

いくつかの動的プログラミング問題のように見えます。このフィールドでアルゴリズムを検索する必要があるかもしれませんが、解決策があると確信しています。私の頭の上から名前を得ることはできません。 – Incomputable

+0

制限事項がa)行全体または列全体で2色以下であるかどうか、b)任意の1色で2タイル以下、またはc)2 *隣接タイル以上一致する色。 –

答えて

0

代わりの繰り返し色を選択して、あなたのルールでそれをチェックし、最初のルールを適用し、使用可能な色の配列を作ります。次に、配列インデックスをランダムに選択します。使用可能な色がない場合:巻き戻し、前のリストから前に選択した色を削除します。

3色があるとします。代わりに繰り返し色がルールに適合するまで

board[i][j].color = rand() % 3; 

を使用して、あなたは、規則に適合しません色の配列を構築することができるような

int avail_color[3]; 
int num_avail; 

あなたは、この

のような色を選びます
board[i][j].color = avail_color[ rand() % num_avail ]; 

Fisher-Yates shuffleと同様です。

+0

Sir、avail_color []を設定する私の現在の体系では、ループを実行して戻すのと同じ計算が必要です。そして、avail_colorの要素の数は、C、C++で許可されていない変数になります。 –

+1

あなたのルールの実装は避けられません。私の方法では、適切な色が見つかるまで、 'rand()'を繰り返し呼び出す必要はありません。おそらく、同じ色を何度もチェックすることになります。配列は可変長ではなく、 '[3]'の長さです。 var 'num_avail'は、その配列にいくつの色があるかを示します。実際に使用される要素の数です。 –

0

とにかく、あなたはタイルが「3同じ色のタイルグループ」である場合に計算機能を実装する必要があります。

それを実装して、色の割り当て機能でそれを使用しています。

シューッという音は、次のとおりです。すべてのタイルについては


それは「3同じ色のタイルのグループ」を作るなくなるまでランダムな色を選択します。

0

マイナスセット操作を実装するのは、左または下に2回繰り返されるランダムな選択の競合を避けるためです。フラグを使用して

for(i=0;i<maxx;i++) 
     for(j=0;j<maxy;j++) 
     {exzero=exone=extwo=exthree=0; 
      board[i][j].x0=x0+i*dx+1; 
      board[i][j].x1=x0+(i+1)*dx-1; 
      board[i][j].y0=y0+j*dy+1; 
      board[i][j].y1=y0+(j+1)*dy-1; 
      if((i-1)>=0&&board[i-1][j].color==0&&(i-2)>=0&&board[i-2][j].color==0) 
       exzero=1; 
      if((i-1)>=0&&board[i-1][j].color==1&&(i-2)>=0&&board[i-2][j].color==1) 
       exone=1; 
      if((i-1)>=0&&board[i-1][j].color==2&&(i-2)>=0&&board[i-2][j].color==2) 
       extwo=1; 
      if((i-1)>=0&&board[i-1][j].color==3&&(i-2)>=0&&board[i-2][j].color==3) 
          exthree=1; 
      if((j-1)>=0&&board[i][j-1].color==0&&(j-2)>=0&&board[i][j-2].color==0) 
       exzero=1; 
      if((j-1)>=0&&board[i][j-1].color==1&&(j-2)>=0&&board[i][j-2].color==1) 
       exone=1; 
      if((j-1)>=0&&board[i][j-1].color==2&&(j-2)>=0&&board[i][j-2].color==2) 
       extwo=1; 
      if((j-1)>=0&&board[i][j-1].color==3&&(j-2)>=0&&board[i][j-2].color==3) 
          exthree=1; 
      compositebin=exzero|exone<<1|extwo<<2|exthree<<3; 
     // cout<<compositebin<<" "; 
      switch(compositebin) 
      { 
      case 0:board[i][j].color=rand()%4;break; 
      case 1:board[i][j].color=rand()%2?1:2;break; 
      case 2:board[i][j].color=rand()%2?0:2;break; 
      case 3:board[i][j].color=2;break; 
      case 4:board[i][j].color=rand()%2?1:0;break; 
      case 5:board[i][j].color=1;break; 
      case 6:board[i][j].color=0;break; 
      case 7:break; 
      case 8:board[i][j].color=rand()%2?rand()%2?0:1:2;break; 
      case 9:board[i][j].color=rand()%2?1:2;break; 
      case 10:board[i][j].color=rand()%2?0:2;break; 
      case 11:board[i][j].color=2;break; 
      case 12:board[i][j].color=rand()%2?1:0;break; 
      case 13:board[i][j].color=1;break; 
      case 14:board[i][j].color=0;break; 
      case 15:break; 
      } 

     } 

コードのこの部分は、二つの除外4色がきちんと仕事をして排除するために3つを除外する、ものを除外する、ゼロを除外する。私は複合二進数を形成し、{0,1,2,3}の部分集合から無作為に選択するために値に応じて切り替える。

関連する問題