gpt4 book ai didi

c++ - 如何在《糖果粉碎传奇》等游戏中为图 block 分配颜色

转载 作者:行者123 更新时间:2023-11-30 17:03:23 25 4
gpt4 key购买 nike

我用 C/C++ 开发了一个部分游戏,其中图 block 可以交换 Here 。我现在想实现《糖果粉碎》,我知道绘制糖果需要付出很大的努力。让瓷砖完成这项工作即可。在为图 block 分配颜色的部分中,我不希望三种颜色出现在行或列中。我如何以有效的方式做到这一点。我目前正在随机分配颜色,如下所示:

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

看起来像这样: Snapshot of program

是的,我不希望行或列中的三个单元格或图 block 具有相同的颜色,且不超过两个相邻的相同颜色的图 block 。 我的意思是我不想要一种解决方案,即分配一次颜色并检查一行中的三个图 block 是否具有相同的颜色。如果没有再次为所有图 block 生成颜色。那样就太天真了,而且代价也太高了。另一种解决方案可能是在按光栅顺序向图 block 分配颜色之前,检查下方或左侧的两个图 block 是否具有相同的颜色(如果分配了其他颜色)。这也是显而易见的。有更好的办法吗?

在 Weather Wane 的回答之后,我发布了使用 STL 迭代器和 set_difference 方法执行集合差异操作的代码。我正在尝试的是,在从一组颜色中随机选择之前,我通过使用集合操作仅消除那些已经重复两次(下方或左侧)的颜色来形成该集合。代码中有问题。我对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";
}

最佳答案

无论如何,您必须实现一个函数来计算某个图 block 是否位于“3 个相同颜色的图 block 组”中。

实现它并在您的颜色分配函数中使用它。

愿望是:

For every tile.
Choose a Random color until it doesn't make a "3 same color tile group".

关于c++ - 如何在《糖果粉碎传奇》等游戏中为图 block 分配颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com