今天运用之前学到的所有知识,写一个关于“三子棋”的小游戏
所需要的三个文件
包括两个源文件和一个头文件
头文件:game.h
源文件:game.c test.c
game.h用来写所有的头文件以及所有函数的声明
test.c用来写整个游戏的过程
game.c用来写游戏内所使用函数的具体内容
游戏开始
游戏开始所需要的内容:
游戏菜单,玩家的选择
所有的内容都在test函数内,整个main函数非常的简洁
分析代码:
- 创建变量input,这个变量用于玩家的选择储存
- srand为创建电脑生成随机数,这个后面会用到(电脑下棋)
- do while语句用于循环(每结束一局游戏重新进入下一把)
- do语句内,先打印菜单,应用菜单函数,下面会讲到
- 打印“开始游戏”的字样,scanf获取玩家输入的内容存到input内
- switch语句,通过玩家所选择的内容进入不同的下一步(进入游戏、退出游戏或重新选择)
- 在选择的内容里,引用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中编写函数具体过程:
- 创建变量 i 和 j
- 运用两个for循环,将二维数组board内的所有内容都变为空格
打印棋盘
创建初始化棋盘的函数 InitBoard,将数组board,行ROW和列COL传到函数内
在game.h中声明函数,无返回类型,形参为数组board,变量row和col
在game.c中编写函数具体过程:
- 创建变量 i 和 j
- for循环,i 从0到行row的范围内,编写二维数组每一行的代码,依次循环
- 在嵌套一个for循环,编写每一行中列的具体内容
- 在二维数组空间中编写“ %c |”的内容
- if条件中为最后一列不需要打印“|”
- 打印“\n”作为分割行
- if条件中为除过最后一行都打印下划线(最后一行不需要)
- 以及接下来的if语句作用同5
效果如下:
玩家下棋
接下来为玩家下棋的内容
在一个while循环内,玩家下完棋继续打印棋盘,并且要再次打印棋盘,供电脑下棋,并且保留下棋痕迹
在game.h中声明函数,无返回类型,形参为数组board,变量row和col
在game.c中编写函数具体过程:
- 打印“玩家请下棋”
- 创建变量 x 和 y 代表行和列
- 在while循环内,循环是防止玩家下棋出界或者下到已经有旗子的坐标内
- scanf读取玩家所输入的坐标
- if判断所获取的坐标是否在界内,如果是(1<=x<=row, 1<=y<=col),进入if语句
- 新的if语句判断坐标是否被占用(二维数组元素是否为空格)
- 如果未占用,则打印玩家的棋子“*”
- 如果坐标占用或者出界(非法),则重新输入
电脑下棋
接下来为玩家下棋的内容
电脑下完棋继续打印棋盘,并且要再次打印棋盘,供玩家下棋,并且保留下棋痕迹
在game.h中声明函数,无返回类型,形参为数组board,变量row和col
在game.c中编写函数具体过程:
- 创建变量 x 和 y 代表行和列
- 打印“电脑请下棋”
- 用rand函数生成随机数,再去%行和列,使范围在0-2内
- 将随机数赋给 x 和 y
- if语句判断坐标是否被占并打印电脑的棋子
利用时间生成的随机数以及该头文件
判断胜利
玩家和电脑都先后下棋,我们要判断输赢来定胜负
玩家赢,打印“*”
电脑赢,打印“#”
平 局,打印“C”
继 续,打印“Q”
三行胜利判断:
分析代码:
- 创建变量i
- for循环,i从0到row为每一行的代码,如果每一行的每一列都相等且不等于空格
- 返回该坐标的符号(“*”为玩家,“#”为电脑)
- for循环,i从0到col为每一列的代码,如果每一列的每一行都相等且不等于空格
- 返回该坐标的符号(“*”为玩家,“#”为电脑)
对角胜利判断:
分析代码:
- 如果两个对角线的所有坐标都相等且不等于空格
- 返回该坐标的符号(“*”为玩家,“#”为电脑)
平局判断:
分析代码:
- 如果为平局返回“Q”
- 进入is_full平局函数内,创建变量 i 和 j 代表行和列
- 运用两个for循环,如果二维数组中每个元素不都为,返回1,则为平局
继续
如果不是以上结果,则返回“C”,游戏继续
如果判断胜负的函数不等于“C”,跳出游戏继续的循环,来显示输赢
判断输赢界面,返回对应的字符,执行对应的结果
游戏演示
以上为游戏的三种结果
注意
有一点需要注意就是玩家下棋的代码内容里,玩家会输入自身看到的棋盘行列(1-3),但是数组是从0开始的(0-2),解决这个问题,只需要把玩家输入的内容-1即可
总结
以上就是本人对三子棋的学习与理解