天天看点

c语言getchar用法_井字棋C语言源码学习

c语言getchar用法_井字棋C语言源码学习

发现一篇很好的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