C语言编写井字棋游戏 代码已有半成品

Python015

C语言编写井字棋游戏 代码已有半成品,第1张

你初始化一个字符数组,里面都给他一样的初始值 E

X 下了就改成X ,O 下了就改成 O,下完以后判断横竖斜三条线有没有一样的,

一共就九个格子,下一步就少一步 ,下之前判断一下,如果等于E ,就是空的,可以放子。

下完一步总步数减一,你这样不就能确定还有几步可以走了。

九步都下完如果没有横竖斜都一样的不就是平局吗,所有数组元素的值都不等于E了不就结束了,或者九步完了也结束了

另外,少用GOTO ,变量定义最好有意义,写点注释

简单来说,定义数据结构(比如棋盘数组,棋盘格子以及棋子,双方玩家等相关的数据结构表示),定义规则(比如同一个位置不能放两颗棋子,三颗棋子连线放胜利)。

具体取决于需求,比如图形表示和AI(人工智能)等等。如果你只是想要简单的用命令行和文字输出表示,那么编写一个控制台应用程序就可以。如果需要图形等控制,需要借助一些图形以及UI库等。但是这些外部表示可以跟核心数据结构和规则,算法等分离开来。所以刚开始先用文字表示写出核心代码,后续可以逐渐加上UI图形,AI等。

错误集中在下面这段语句,即输入下棋位置的合理性判断。

do

{

printf("Player %d,please enter where you want to put your %c:",player,(player==1)?'x':'o')

scanf("%d",&choice)

row=--choice/3

column=--choice%3 // 第一处错误

}while(i<1||i>9||board[row][column]>'9') // 第二处错误

第一处错误是:column=--choice%3

原因:--运算符没搞清楚。--运算符意思是先减一,再做别的运算。那么,这句话就相当于 choice -= 1coloumn = choice%3这样就看出来, choice -= 1这半句话是多余的,只要出现在 row=--choice/3这里就足够了。

因为这里多运算了一次choice-1,所以输入1的时候行运算正确而列运算少了1,要么触碰边界,要么遇到了其他格子。

由于--运算符很容易出错,所以一般谨慎的程序员很少用,转而用复杂的语句代替,至少意思比较明白。

第二处错误是: i<1||i>9

原因:i 这里应该是棋手的落子顺序。第一手是0,判断为棋手1。但是用在这个语句里明显出错。这个语句应当是判断棋手落子的位置,即是不是下在棋盘外面,所以应当是choice<1 || choice>9,然而结合第一处错误,仍然是错的,因为choice已经在计算row 和column的时候被改变了。

因为这处错误,第一手棋永远无法走完,因为i初始值为0,满足i<1这个条件,进而出现死循环

结合两处错误,建议这样改:

do

{

printf("Player %d,please enter where you want to put your %c:",player,(player==1)?'x':'o')

scanf("%d",&choice)

row=(choice-1)/3 // 修改

column=(choice-1)%3 // 修改

}while(choice<1||choice>9||board[row][column]>'9') // 修改