【C语言】三子棋

今天运用之前学到的所有知识,写一个关于“三子棋”的小游戏

所需要的三个文件

包括两个源文件和一个头文件

头文件:game.h

源文件:game.c test.c

game.h用来写所有的头文件以及所有函数的声明

test.c用来写整个游戏的过程

game.c用来写游戏内所使用函数的具体内容

游戏开始

游戏开始所需要的内容:

游戏菜单,玩家的选择

所有的内容都在test函数内,整个main函数非常的简洁

分析代码:

  1. 创建变量input,这个变量用于玩家的选择储存
  2. srand为创建电脑生成随机数,这个后面会用到(电脑下棋)
  3. do while语句用于循环(每结束一局游戏重新进入下一把)
  4. do语句内,先打印菜单,应用菜单函数,下面会讲到
  5. 打印“开始游戏”的字样,scanf获取玩家输入的内容存到input内
  6. switch语句,通过玩家所选择的内容进入不同的下一步(进入游戏、退出游戏或重新选择)
  7. 在选择的内容里,引用game函数,里面用于写游戏的具体逻辑过程

以上为菜单函数

游戏过程

接下来进入game函数,编写游戏内容的代码

先拿出其中每一块进行详细解释

创建棋盘

创建一个二维数组board作为棋盘

对于ROW和COL在game.h中进行声明,以后不同尺寸的棋盘都可以通过game.h内的声明进行修改

本次三子棋需要一个3*3的棋盘,ROW和COL都为3

初始化棋盘

创建初始化棋盘的函数 InitBoard,将数组board,行ROW和列COL传到函数内

在game.h中声明函数,无返回类型,形参为数组board,变量row和col

game.c中编写函数具体过程:

  1. 创建变量 i 和 j
  2. 运用两个for循环,将二维数组board内的所有内容都变为空格

打印棋盘

创建初始化棋盘的函数 InitBoard,将数组board,行ROW和列COL传到函数内

game.h中声明函数,无返回类型,形参为数组board,变量row和col

game.c中编写函数具体过程:

  1. 创建变量 i 和 j
  2. for循环,i 从0到行row的范围内,编写二维数组每一行的代码,依次循环
  3. 在嵌套一个for循环,编写每一行中列的具体内容
  4. 在二维数组空间中编写“ %c |”的内容
  5. if条件中为最后一列不需要打印“|”
  6. 打印“\n”作为分割行
  7. if条件中为除过最后一行都打印下划线(最后一行不需要)
  8. 以及接下来的if语句作用同5

效果如下:

玩家下棋

接下来为玩家下棋的内容

在一个while循环内,玩家下完棋继续打印棋盘,并且要再次打印棋盘,供电脑下棋,并且保留下棋痕迹

game.h中声明函数,无返回类型,形参为数组board,变量row和col

game.c中编写函数具体过程:

  1. 打印“玩家请下棋”
  2. 创建变量 x 和 y 代表行和列
  3. 在while循环内,循环是防止玩家下棋出界或者下到已经有旗子的坐标内
  4. scanf读取玩家所输入的坐标
  5. if判断所获取的坐标是否在界内,如果是(1<=x<=row, 1<=y<=col),进入if语句
  6. 新的if语句判断坐标是否被占用(二维数组元素是否为空格)
  7. 如果未占用,则打印玩家的棋子“*”
  8. 如果坐标占用或者出界(非法),则重新输入

电脑下棋

接下来为玩家下棋的内容

电脑下完棋继续打印棋盘,并且要再次打印棋盘,供玩家下棋,并且保留下棋痕迹

game.h中声明函数,无返回类型,形参为数组board,变量row和col

game.c中编写函数具体过程:

  1. 创建变量 x 和 y 代表行和列
  2. 打印“电脑请下棋”
  3. 用rand函数生成随机数,再去%行和列,使范围在0-2内
  4. 将随机数赋给 x 和 y
  5. if语句判断坐标是否被占并打印电脑的棋子

利用时间生成的随机数以及该头文件

判断胜利

玩家和电脑都先后下棋,我们要判断输赢来定胜负

玩家赢,打印“*”

电脑赢,打印“#”

平 局,打印“C”

继 续,打印“Q”

三行胜利判断:

分析代码:

  1. 创建变量i
  2. for循环,i从0到row为每一行的代码,如果每一行的每一列都相等且不等于空格
  3. 返回该坐标的符号(“*”为玩家,“#”为电脑)
  4. for循环,i从0到col为每一列的代码,如果每一列的每一行都相等且不等于空格
  5. 返回该坐标的符号(“*”为玩家,“#”为电脑)

对角胜利判断:

分析代码:

  1. 如果两个对角线的所有坐标都相等且不等于空格
  2. 返回该坐标的符号(“*”为玩家,“#”为电脑)

平局判断:

分析代码:

  1. 如果为平局返回“Q”
  2. 进入is_full平局函数内,创建变量 i 和 j 代表行和列
  3. 运用两个for循环,如果二维数组中每个元素不都为,返回1,则为平局

继续

如果不是以上结果,则返回“C”,游戏继续

如果判断胜负的函数不等于“C”,跳出游戏继续的循环,来显示输赢

判断输赢界面,返回对应的字符,执行对应的结果

游戏演示

以上为游戏的三种结果

注意

有一点需要注意就是玩家下棋的代码内容里,玩家会输入自身看到的棋盘行列(1-3),但是数组是从0开始的(0-2),解决这个问题,只需要把玩家输入的内容-1即可

总结

以上就是本人对三子棋的学习与理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林柏檀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值