タイルが交換されるC/C++で部分ゲームをしましたHere。 私は今キャンディクラッシュを実装したいと思うし、キャンディーを描くことが多くの努力を要することを知っています。タイルに仕事をさせてください。 タイルに色を割り当てる部分では、行または列に3色を表示したくありません。どのように効率的な方法でこれを行うのですか? 私は現在、次のようにランダムに色を割り当てるしています。このようになります私はキャンディクラッシュのようなゲームでタイルに色を割り当てるにはどうすればいいですか?
board[i][j].color=rand()%3;
はい、私はノーである同じ色を持っている行または列の三つのセルやタイルをしたくありません同じ色の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";
}
いくつかの動的プログラミング問題のように見えます。このフィールドでアルゴリズムを検索する必要があるかもしれませんが、解決策があると確信しています。私の頭の上から名前を得ることはできません。 – Incomputable
制限事項がa)行全体または列全体で2色以下であるかどうか、b)任意の1色で2タイル以下、またはc)2 *隣接タイル以上一致する色。 –