- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 C/C++ 开发了一个部分游戏,其中图 block 可以交换 Here 。我现在想实现《糖果粉碎》,我知道绘制糖果需要付出很大的努力。让瓷砖完成这项工作即可。在为图 block 分配颜色的部分中,我不希望三种颜色出现在行或列中。我如何以有效的方式做到这一点。我目前正在随机分配颜色,如下所示:
board[i][j].color=rand()%3;
是的,我不希望行或列中的三个单元格或图 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/
爱丽丝是一名幼儿园老师。她想给类的 children 一些糖果。所有的 child 都坐成一排,每个 child 都根据自己平时的表现打分。爱丽丝想给每个 child 至少 1 颗糖果。因为 chil
我在比赛的某个地方发现了这个问题,但还没有想出解决方案。 The boy has apples and keeps in boxes. In one box no more than N/2. How
昨天我参加了 Google code jam 比赛。有糖果 split 问题。 http://code.google.com/codejam/contest/dashboard?c=975485#s=
我正在尝试解决 hackerrank在 JavaScript 中挑战,虽然对于大多数测试实例,我的解决方案都执行得很好,但我不断地遇到其中一些的超时(Hackerrank 将其设置为 10 秒以用于
我是一名优秀的程序员,十分优秀!