【发布时间】:2014-01-10 21:15:49
【问题描述】:
我在 ALLEGRO 5 中使用 c++ 的第一款游戏。
它有一个不断朝着正确方向移动的玩家。从屏幕的右边缘,玩家会面临三角形和正方形等障碍物。这些障碍物在屏幕右边缘活跃,在屏幕左边缘消失。
假设 X 是三角形,O 是正方形。
我想用几种组合来创建它们,例如
..{x} {xo} {xoox} {oxxo} {oxx}...还有一些变化(可能是随机的)
然后我将随机化这些模式的出现。
所以我找到了一种方法来实现我想要的。我使用 switch() 随机选择各种组合情况。它工作得很好。但偶尔它会重叠,即使我引入了最小间隙 xoff
代码如下:
`//I have used srand(time(NULL)); once in main function too.
if(state == PLAYING)
{
ball->Moveball();
ball->Jumpball();
//Camera-----------
ball->Cameraupdate();
al_identity_transform(&camera);
al_translate_transform(&camera,-Cameraposition[0],-Cameraposition[1]);
al_use_transform(&camera);
if(rand() % 200==0)
{
xoff+=200;// to introduce a minimum gap between them but this also fail once in a while.
int ch;
ch=rand()%4;
switch(ch)
{
case 0:
//T
triangle = new Triangle(850 + Cameraposition[0]+xoff,319);
objects.push_back(triangle);
triangle->SetAlive(true);
break;
case 1:
//TT
triangle = new Triangle(850 + Cameraposition[0]+xoff,319);
objects.push_back(triangle);
triangle->SetAlive(true);
triangle = new Triangle(850 +30+ Cameraposition[0]+xoff,319);
objects.push_back(triangle);
triangle->SetAlive(true);
break;
case 2:
//S
square = new Square(850 + Cameraposition[0]+xoff,310);
objects.push_back(square);
square->SetAlive(true);
break;
case 3:
//SS
square = new Square(850 + Cameraposition[0]+xoff,310);
objects.push_back(square);
square->SetAlive(true);
square = new Square(850 +82+ Cameraposition[0]+xoff,310);
objects.push_back(square);
square->SetAlive(true);
break;
}
}
`
问题解决:(对于那些遇到过类似疑问的人)上面的代码解决了创建障碍物的随机组合并随机生成这些组合的问题。但如果您不想获得重叠组合,请检查冲突。
【问题讨论】:
-
你有bug,比如第二个
else if(triangle->GetAlive() == false),应该是else if(square->GetAlive() == false。 -
天哪! :O 我是一种特殊的愚蠢。 XD 让我们希望它是同样的问题。 brb
-
不,问题仍然存在。就像如果你从中间垂直切割重叠,我们将有两个适当的半个三角形。
标签: c++ algorithm random 2d allegro5