【发布时间】:2011-09-26 14:03:25
【问题描述】:
好吧,我真的不知道如何正确地提出这个问题,因为我几乎不知道如何用一句话来描述我想要什么,我很抱歉。
让我直截了当,你可以跳过其余部分,因为我只是想表明我已经尝试过一些东西,而不是一时兴起来这里问问题。
我需要一个产生 6 个随机数的算法,它在该序列中可能不会产生超过 2 个连续数字。
示例:3 3 4 4 2 1
^很好。
示例:3 3 3 4 4 2
^不! 不!错了!
显然,如果不经常绊倒自己,我不知道如何做到这一点。
是否有 STL 或 Boost 功能可以做到这一点?或者也许这里有人知道如何为它设计一个算法。那太棒了。
我正在尝试做什么以及我已经尝试过什么。(您可以跳过的部分)
这是用 C++ 编写的。我正在尝试制作一个 Panel de Pon/Tetris Attack/Puzzle League 任何克隆进行练习。游戏有一个 6 块行和 3 个或更多匹配块将破坏块。 Here's a video in case you're not familiar.
当一个新行从底部出来时,它一定不能有 3 个水平匹配块,否则它会自动消失。我不想要水平的东西。垂直的很好。
我试图做到这一点,但我似乎无法做到这一点。当我开始游戏时,缺少块块,因为它在不应该检测到匹配时。如您所见,我的方法很可能过于笨拙且过于复杂。
enum BlockType {EMPTY, STAR, UP_TRIANGLE, DOWN_TRIANGLE, CIRCLE, HEART, DIAMOND};
vector<Block> BlockField::ConstructRow()
{
vector<Block> row;
int type = (rand() % 6)+1;
for (int i=0;i<6;i++)
{
row.push_back(Block(type));
type = (rand() % 6) +1;
}
// must be in order from last to first of the enumeration
RowCheck(row, diamond_match);
RowCheck(row, heart_match);
RowCheck(row, circle_match);
RowCheck(row, downtriangle_match);
RowCheck(row, uptriangle_match);
RowCheck(row, star_match);
return row;
}
void BlockField::RowCheck(vector<Block> &row, Block blockCheckArray[3])
{
vector<Block>::iterator block1 = row.begin();
vector<Block>::iterator block2 = row.begin()+1;
vector<Block>::iterator block3 = row.begin()+2;
vector<Block>::iterator block4 = row.begin()+3;
vector<Block>::iterator block5 = row.begin()+4;
vector<Block>::iterator block6 = row.begin()+5;
int bt1 = (*block1).BlockType();
int bt2 = (*block2).BlockType();
int bt3 = (*block3).BlockType();
int bt4 = (*block4).BlockType();
int type = 0;
if (equal(block1, block4, blockCheckArray))
{
type = bt1 - 1;
if (type <= 0) type = 6;
(*block1).AssignBlockType(type);
}
else if (equal(block2, block5, blockCheckArray))
{
type = bt2 - 1;
if (type <= 0) type = 6;
(*block2).AssignBlockType(type);
}
else if (equal(block3, block6, blockCheckArray))
{
type = bt3 - 1;
if (type == bt3) type--;
if (type <= 0) type = 6;
(*block3).AssignBlockType(type);
}
else if (equal(block4, row.end(), blockCheckArray))
{
type = bt4 - 1;
if (type == bt3) type--;
if (type <= 0) type = 6;
(*block4).AssignBlockType(type);
}
}
叹息,我不确定这是否有助于展示这一点......至少它表明我已经尝试了一些东西。
基本上,我通过将 BlockType 枚举描述的随机块类型分配给 Block 对象的构造函数(Block 对象具有 blockType 和位置)来构造行。
然后我使用 RowCheck 函数来查看一行中是否有 3 个连续的块类型,并且我对所有块类型都执行了此操作。 *_match 变量是具有相同块类型的 3 个块对象的数组。如果我确实发现有 3 种连续的块类型,我只需将第一个值减一即可。但是,如果我这样做,我可能最终会无意中产生另一个 3 匹配,所以我只是确保块类型按从大到小的顺序排列。
好吧,这很糟糕,很复杂,而且不起作用!这就是为什么我需要你的帮助。
【问题讨论】: