2010-03-24 26 views
0

嘿,那么,所以我敲在一起随机模式生成的东西。随机指示,没有重复..(不好说明)

到目前为止我的代码:

int permutes = 100; 
    int y = 31; 
    int x = 63; 

    while (permutes > 0) { 
    int rndTurn = random(1, 4); 

    if (rndTurn == 1) { y = y - 1; } //go up 
    if (rndTurn == 2) { y = y + 1; } //go down 
    if (rndTurn == 3) { x = x - 1; } //go right 
    if (rndTurn == 4) { x = x + 1; } //go left 

    setP(x, y, 1); 
    delay(250); 
    } 

我的问题是,我将如何去获得的代码没有食言本身?

例如该代码说“走左”,但通过它的下一个循环说“去右”,我怎么能阻止呢?

注意:setP打开一个特定的像素。

干杯人!

回答

-2

不确定此方法是否有效。

创建一个名为lastRndTurn的新变量作为int,并在if语句之后分配它。 然后在int rndTurn = random(1, 4)之后添加一个新的while循环。

while (lastRndTurn == rndTurn) 
{ 
    rndTurn = random(1, 4); 
} 
+0

正是我在找的东西! – 2010-03-24 10:44:50

+0

除了随机生成器连续多次提出'lastRndTurn'。这并不是说这一点很重要,而你在每次回合之后等待25分钟...... – sbi 2010-03-24 10:48:32

+2

尽管这样做可行,但通常不是一个好的做法,可以强制一个可接受的值。我认为下面的解决方案好得多。将最后的移动(比如说2)存储为整数。创建一个数组,并使用for-next循环,添加数字1 2 3 4,但前提是该数字与最后一次移动不相同。然后做一个随机的。你必须扭转答案。 – NibblyPig 2010-03-24 10:49:32

1

您还记得最后一个方向,使用random(1,3),选择其余三个中的任意一个,然后将其作为最后一个存储。

6

这取决于你的意思。

如果您的意思是“避免回到我之前最常用的一步”,那么您必须记住最后一次移动的方向。那就是如果你向上移动你的下一个动作就不能停下来。

如果你的意思是“避免你回到有史以来已经开启”,那么你将不得不记住你一直在的每一个地方。这可以通过使用带有表示具有适当的Equals/HashCode函数的坐标的类的键来有效实施。

+2

此外,您需要执行回溯,因为可能会出现一个点,您无法在任何地方移动。 – Yacoby 2010-03-24 10:43:43

2

由于每个正方形对应一个像素,因此您的坐标空间必须是有限的,因此您可以跟踪已经访问的坐标。

如果有相应的getP函数来确定像素是否已经打开,那么您可以使用它。