没有在Objective-C中重复随机化

时间:2016-08-25 22:22:45

标签: objective-c random

我为一个简单的游戏编写了这段代码。它随机化一个数字然后用switch做一些事情。这很简单,但我想在一轮中只完成一次任务。在我的情况下,轮是3个任务。一轮完成后,我想重置我的变量并再次开始新一轮。所以它是随机的,但任务不会在一轮中发生两次。

我写了这段代码,但它没有用。如果我点击将启动rand()的按钮,它将执行第一个任务,然后我再次点击,它将执行第二个任务,但是当我点击第三个任务时,没有任何事情发生。第3个任务适用于第4次点击。

int text;
int x=3; //this is number of tasks in one round, so in switch i have 3 tasks
int z=9999;
int x0=1; //this mean's that task 0 can happen only once in one round
int x1=1;
int x2=1;

-(void)reset{  // this is rof checking if x is <1, then it will reset all variables (start a new round)
    if (x<1) {
        x=3;
        x0=1;
        x1=1;
        x2=1;
    }
}

-(void)randomize{
    text = rand() % 3; //this wil get me a random number for switch
    while(text==z) //this is because i don't want to have same number  consecutively
    {text = rand() % 3;}
}

- (IBAction)random:(id)sender {
    [self randomize];

    switch (text) {
        case 0:
            if (x0!=0){
                //something will happen
                z=0;
                x0--;
                x--;
                [self reset];
                break;
            }
            else {
                [self randomize];
            }
        case 1:
            if (x1!=0) {
                //something will happen
                z=1;
                x1--;
                x--;
                [self reset];
                break;
            }
            else {
                [self randomize];
                break;
            }
        case 2:
            if (x2!=0) {
                //something will happen
                z=2;
                x2--;
                x--;
                [self reset];
            }
            else {
               [self randomize];
            }
    }
}

2 个答案:

答案 0 :(得分:0)

如果您在任何情况下点击了else分支,请拨打randomize,但不会尝试根据新的随机数执行任务,然后调用{{1}将返回结束对点击的响应。这意味着当您点击其中一个random分支时,不会对当前点击执行任务 - 您看到的是无效点击。

因此,在else分支机构中,您需要获取一个新的随机数并使用它来确定要执行的任务,这恰好恰好是您在响应点击时需要做的事情有一个定义的方法来做到这一点......我希望有足够的暗示。

HTH

答案 1 :(得分:0)

选择一组替代方案并shuffle。然后在每个任务上迭代到混洗集中的下一个值。瞧,没有重复。这抵消了if/else案例中switch逻辑的必要性。

在每轮结束时,重新洗牌并重置迭代索引。如果您想要重复某些情况而不是其他情况,请将这些情况的多​​个实例添加到集合中。如果允许重复但不是顺序重复,则检查相邻对的混洗集并在需要时重新洗牌。