Objective-C和Sprite Kit游戏开发从入门到精通
上QQ阅读APP看书,第一时间看更新

3.4 循环语句

计算机最大的特点是什么?就是可以根据一定的条件自动完成工作,而且快速、高效、不会犯错(除非代码有问题)。

循环语句就是能够根据一定的条件重复执行一系列任务的语句结构。在Objective-C中,常用的循环语句包括for、while和do-while。此外,在循环语句中,还可以使用break和continue等语句来控制循环语句的执行,下面详细讨论。

■3.4.1 for语句结构

for语句的应用格式如下:

    for (<表达式1>; <表达式2>; <表达式3>) {
        <语句块>
    }

其中:

❑ <表达式1>用于定义循环控制变量。

❑ <表达式2>指定循环执行的条件,条件成立时(YES)执行循环操作,条件不成立时(NO)终止循环。

❑ <表达式3>指定循环控制变量每次循环后的变化。

❑ <语句块>定义每次循环所执行的代码。

如下面的代码,一号雷达将按顺序扫描1到10号区域。

    for (int i=1; i <= 10; i++) {
        NSLog(@"一号雷达扫描%i号区域", i);
    }

下面的代码是一个简单的数学问题,我们将计算1到100的和。

    int sum = 0;
    for (int i=1; i <= 100; i++) {
        sum += i;
    }
    NSLog(@"1到100的和是%i", sum);

如果是计算1到100中偶数的和,可以修改for语句中的控制语句,如下面的代码。

    for (int i=2; i <= 100; i+=2)

■3.4.2 while语句结构

while语句的应用格式如下。

    while (<条件>) {
        <语句块>
    }

其中,当<条件>为真(YES)时,就会执行<语句块>;当<条件>为假(NO)时终止循环结构。

下面的例子,一号雷达会不停地工作,大家不要急着在Xcode中运行,因为这个代码不会停下来,直到程序挂掉。这种循环结构称为无限循环或死循环。

    while (YES) {
        for (int i=1; i <= 10; i++) {
            NSLog(@"一号雷达扫描%i号区域", i);
        }
    }

雷达的工作是比较特殊的,需要不停地扫描指定区域,但在while语句结构中,则应该有一个合理的条件,以便循环能够适时结束。如下面的代码,我们使用while语句完成1到100的累加工作。

    int i = 1;
    int sum = 0;
    while (i <= 100) {
        sum += i;
        i++;
    }
    NSLog(@"1到100的和是%i", sum);

■3.4.3 do-while语句结构

do-while语句与while语句的使用比较相似,所不同的是,do-while语句结构会在每次循环结束后进行条件的判断,其基本应用格式如下。

    do {
        <语句块>
    }while (<条件>);

使用do-while语句结构时应注意,<语句块>最少会执行一次,而这也是可能出问题的地方,如果在<语句块>中存在不满足条件的代码,就有可能产生错误,所以,如果有可能,我们更建议使用while语句结构,毕竟随便就让程序挂掉,并不是一个好的选择。

■3.4.4 break语句

循环语句的确可以简化很多工作,但是,我们也需要适时地终止循环操作;在Objective-C中,break语句就可以在循环结构中紧急刹车,从而终止整个循环的执行。如下面的代码,如果一号雷达发现可疑目标,就会显示信息,并锁定当前区域。

    int lockedZone = 0;
    for (int i=1; i <= 10; i++) {
        // 可疑情况的出现很随机
        if (arc4random() % 2 == 1) {
            NSLog(@"警告:一号雷达在%i号区域发现可疑目标", i);
            lockedZone = i;
            break;
        }
    }

代码中,arc4random()函数的功能是产生一个随机整数,我们取这个随机数除以2的余数,余数为1时发现目标,并终止for循环的执行。

在while或do-while语句结构中,break语句同样可以终止循环。此外,别忘了break语句在switch语句结构中的功能也是终止。

■3.4.5 continue语句

continue语句的功能是中止当前循环,并开始下一次循环(如果条件满足)。前面,一号雷达已经锁定lockedZone变量所指的区域,此时,二号雷达将代替一号雷达继续搜索其他区域,要知道,最先出现的目标很可能只是诱饵。

下面的代码,我们接着前面的示例写。

    for (int i=1; i <= 10; i++) {
        if (lockedZone == i) continue;
        NSLog(@"二号雷达正在搜索%i号区域", i);
    }

执行此代码,我们可以看到,二号雷达在到达lockedZone区域时不会执行扫描工作,因为一号雷达已经锁定此区域,此时,使用continue语句终止此次循环,并继续下一循环。