发现一篇很好的C语言入门的文章,看代码发现有几个难点,我百度学习了下,并写下这篇解释文章。
Milo Yip:用C语言实现井字棋(上)
难点及其解释
难点1:字符串后面加中括号[]例如:
putchar("||n"[i++])
printf(" %c ", s->board[j][i] == -1 ? '1' + j * 3 + i : "OX"[s->board[j][i]]);
printf("%c: ", "OX"[s->turn % 2]);
难点1解答: "||n"不就是个常字符串吗?字符串不也代表第一个字符的指针吗?
现在我们假设有char *x="||n";的定义,那么putchar("||n"[i++])就等价为putchar(x[i++])。
putchar("||n"[i++])在:
i=0对应x[0],输出为: |
i=1对应 x[1],输出为:|
i=2对应 x[2],输出为:n
"OX"[s->board[j][i]]和"OX"[s->turn % 2]类似。
参考:关于C语言putchar函数的表示:putchar("||n"[i++])_百度知道
难点2:while (c < '1' || c > '9' || !move(s, (c - '1') % 3, (c - '1') / 3)) 难点2解答:(c - '1') % 3, (c - '1') / 3的结果都在0,1,2范围,则move(s, (c - '1') % 3, (c - '1') / 3)为true,否则(c - '1') % 3, (c - '1') / 3的结果不在0,1,2范围时,move(s, (c - '1') % 3, (c - '1') / 3)为false。
在每一回合中,提示当前玩家(O 或 X),并让玩家输入一个下棋位置(1-9),如果位置不合法,则重新输入。难点3:while (getchar() != 'n'); 难点3解答:
没有按回车键,就不读入、不进行任何操作。
在标准输入中,要到回车键才能处理输入,所以这里我们读了第一个输入字符后,就忽略其他字符直到读到换行符。难点4:
for (j = 0; j < 3; j++) {
for (i = 0; i < 3; i++) {
难点4解答:j 是列序号,i是行序号。
难点5:(s.turn < 9)
难点5解答:struct变量的运用。
参考:C语言结构体详解,C语言struct用法详解
源码:
#include