Time for action 发车了发车了,没时间解释了快上车!

我们来新建一个 OS X 命令行项目,在 main() 函数前面,加上下面这段代码:

void printWord(NSString *word, NSMutableArray<NSString*>
*usedLetters) {
    // code to go here 在这里写代码
}

我们等一下再写这里空着的代码。这个函数是用来打印当前游戏的状态的,也就是打印我们已经猜出了多少字母。可以看到,它的参数分别是我们要猜的单词和已经猜中的字母。

我们把它放在 main() 函数前面,因为我们要在 main() 函数里调用它。

好了,现在我们正式要开始这个项目了。首先我们把下面这两行代码删掉。

// insert code here...
NSLog(@"Hello, World!");

接着把新的代码,放到刚才那个位置上:

NSString *word = @"RHYTHM";
NSMutableArray<NSString*> *usedLetters = [NSMutableArray arrayWithCapacity:8];
printf("Welcome to Hangman!\n");
printf("Press a letter to guess, or Ctrl+C to quit.\n");
printWord(word, usedLetters);

这里我们给了一个非常难猜的单词,因为在猜字游戏里,大部分人会先猜元音字母,但是这个单词里没有元音字母。这里还有一个数组来保存已经猜过的字母,我们会记下每一个玩家用过的字母,最后用 printWord() 这个函数,来打印游戏状态,也就是我们猜中的字母在这个单词的哪个位置。 printWord() 这个函数内容现在还是空的,我们等一下再回去写。

接下来我们要用一个循环体,把玩家猜测的字母读出来,传到数组里。这个循环并不难写,但是我会把它分成两个部分写,这样更容易理解一些。

while (1) {
    // read a string from the user 读取玩家输入的字符串
    char cstring[256];
    scanf("%s", cstring);

    // convert it to an NSString 转换字符串格式
    NSString *input = [NSString stringWithCString:cstring
encoding:NSUTF8StringEncoding];
    if ([input length] != 1) {
        printf("Please type exactly one letter, or Ctrl+C to quit.");
    } else {
        // this letter is new! 这个字母之前没有出现过怎么办嘞?
}

   // no matter what, print the game state again 不管怎么样,都会更新游戏状态
    printWord(word, usedLetters);
}

我在代码里加了注释,这样代码就更容易理解啦。这个代码从 while (1) 开始循环也就是说,除非玩家自己退出这个游戏,或者你猜对了这个词,否则这个游戏是不会结束的。

我们会一直把 C 语言字符串转换成 NSString,然而不管输入什么东西,都会调用 printWord() 函数,所以玩家可以一直看到这个游戏的进程。

// this letter is new! 这行注释的意思是,我们要在这里加上代码的第二部分。这一个部分里面,我们会读取 unichar 字符,然后把它转换成 NSString,和我们的 usedLetters 数组做比较,看看它是否存在于这个数组。如果已经存在了,我们就打印一个提示,如果没有的话,那我们就把它放到这个数组里面去。

现在,你可以把这段代码放到 // this letter is new!这个注释的地方:

// pull out the first letter from the input
unichar letter = [input characterAtIndex:0];
// convert it to an uppercase NSString
NSString *letterString = [[NSString stringWithFormat:@"%C", letter]
uppercaseString];
if ([usedLetters containsObject:letterString]) {
    printf("You used that letter already!\n");
} else {
    [usedLetters addObject:letterString];
}

接着把这块代码放到 main() 函数前面,到此为止,我们已经完成了一半的工作。

results matching ""

    No results matching ""