好吧,我真的不知道如何正确地提出这个问题,因为我几乎不知道如何用一句话来描述我想要的东西,我很抱歉。
让我开门见山,你可以跳过剩下的,因为我只是想表明我已经尝试过一些东西,而不是来这里一时兴起问问题。
我需要一个生成 6 个随机数的算法,但在该序列中生成的连续数字不得超过 2 个。
示例:3 3 4 4 2 1
^FINE.
示例:3 3 3 4 4 2
^NO! NO! WRONG!
显然,我不知道如何做到这一点而不不断地绊倒自己。
是否有 STL 或 Boost 功能可以做到这一点?或者也许这里有人知道如何为其设计一个算法。那将是真棒。
我正在尝试做什么以及我已经尝试过什么。(可以跳过的部分)
这是在 C++ 中。我正在尝试制作一个 Panel de Pon/Tetris Attack/Puzzle League 克隆来进行练习。游戏有 6 个方块行,3 个或更多匹配的方块将摧毁方块。
当新的一行从底部出现时,它不能出现 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);
}
}
Sigh,我不确定它是否有助于展示这一点......至少它表明我已经尝试过一些东西。
基本上,我通过将 BlockType 枚举描述的随机块类型分配给 Block 对象的构造函数(Block 对象具有 blockType 和位置)来构造行。
然后,我使用 RowCheck 函数来查看一行中是否有 3 个连续的块类型,并且我对所有块类型都执行了此操作。 *_match 变量是具有相同块类型的 3 个块对象的数组。如果我确实发现有 3 个连续的块类型,我只需将第一个值减 1 即可。然而,如果我这样做,我可能会无意中产生另外 3 个匹配,所以我只是确保块类型按从最大到最小的顺序排列。
好吧,它很蹩脚,很复杂,而且不起作用!这就是为什么我需要你的帮助。