花了点时间把三字棋给打了出来,就讲讲具体的操作吧,也算是给自己巩固一下知识。
先把主函数打出来,一条一条看,首先先打出名字,srand先不看后面再来讲,定义一个参数,这里就要讲到关于这边循环语句的选择了,在这个地方我们要做到的是根据菜单进行选择,如果输入非法则需要重新输入。用while循环也可以,不过for循环就没有那么贴合实际应用了。同时,input的值为以0开始的整数因此可以设置成0退出游戏,1开始游戏,即当输入0时循环就自动结束。输入其他数值时便会循环。因此使用switch语句进行选择(if也行啦)再使用break跳出循环。同时设置了menu和game函数再主函数外进行声明和定义。这样子主函数大致就写完了。由于刚开始比较菜所以这次电脑下棋是通过取随机随机值来下的,以后精进一些就可以提升电脑的难度,让游戏更加完善。
随便打印了一个菜单,怎么顺眼怎么来,后面的\n很重要,码的时候不要忘记打了,不然就会全部连在一起。
该游戏是关于函数应用的一个拓展,这边都是以自定义函数为主。在开始写game函数之前必须要懂得这个游戏的原理。我们需要建立一个二维数组作为棋盘的内容,由于二位数组是以arr[x][y]的形式来使用,正好符合我们棋盘使用的需求。
同时,在game函数里还有多个不同的函数因此我们需要新建一个game.c文件和game头文件进行管理避免过于复杂和凌乱。
在game.h文件中定义行和列的数量,方便以后随时更改。 同时我们在
每一局开始时我们都要确保棋盘是空的,所以自定义一个 Initboard函数(当然取其他名字也可以),同时在game.c和game.h文件中进行实现和声明。将我们要用到的参数传输出去。text.c和game.c文件中都要引用game.h文件(注意:引用自己的头文件时使用的是" "而不是<>)
只要我们将' '赋值给数组中的每一个数,就能实现棋盘的清空。使用两个for循环将有效范围覆盖到整个数组,而且数组下标是从零开始的所以实际上我们只需要i j 的范围是0~2。
将棋盘清空后,将棋盘打出让玩家先走。这里我们设置一个DisplayBoard函数来打印棋盘。跟上面相同的方式在game.c和game.h文件里进行操作。
直接打印并非不行,但若我们想要棋盘随着我们前面定义的行和列的改变而发生变化的话,就无法通过直接莽的方式来实现。将棋盘拆分之后我们可以发现第一行是 | | 第二行是---|---|----以此类推,在最后一行没有 ---|---|----在最后一列没有一整条竖直线,这时候我们就想该如何实现这个函数。在细化之后我们可以看到第一行就是" |"且最后一列不打印"|"第二行就是"---|"最后一列也不打印"|",同时最后一行不打印"---|"。即我们使用for循环将这几个小步骤实现,并加上一些小条件使其在部分位置无法打印。
棋盘也打印完了,前期准备都已经准备好了,接下来就是正式开始游戏了,我们设置成玩家现在(电脑先走也可以,把电脑走的函数放到玩家走的函数前就行)跟前面的一样设置一个新函数然后放到另外两个文件中。
然后到game.c文件中进行实现,简单想就是我们输入一个坐标然后将其放入到该数组之中,这样再将棋盘打印出来的话,就相当于我们下了一子。而且玩家并非程序员输入的坐标自然是根据棋盘上的坐标来输入因此输入的坐标会比数组的下标大一,使用我们要在涉及数组的定位时将输入的数值减1。同时要判断其合法性,必须要比0大但是要不能超过棋盘的行和列,否则驳回,且这阶段如果一直输入非法则要反复输入即要使用循环语句,while(1)则表示恒为真即无限循环,直到输入正确后用break跳出。
电脑走的流程跟玩家走的流程大相径庭,首先我们需要取一个随机值,用时间戳进行定义使每次的随机值都不相同
由于改返回的随机数的数据类型不同使用使用unsigned进行重定义,且生成改随机数的范围为由0~randmax而我们需要的值只要在0~row-1就行了。这时候我们应想到一个数取另一个数的余数必定会比这个数来的小且范围就在0~这个数-1。接着判断这个坐标是否有其他字符?没有的话就下这里,有的话就重新取随机值,即也是要无限循环。(注意两个=才是判断是否相等,一个=是赋值,打错的话就会出现只走一条路的结果)
当我一步---打印棋盘---你一步---打印棋盘,不知不觉间棋盘就满了,或是在满之前就已经分出胜负。因此最后一个关键步骤就是判断胜负!!而且在玩家走完跟电脑走完都要判断。
当一个人下完之后便会有四种结果即玩家赢 电脑赢 平局 继续走,那我们就以三字棋的规则来判断是否结束游戏再反馈不同的数字表达不同的结果。(这边return 的是字符类型的数据所以在声明的时候要用char来声明。
若非胜利则判断是否平局,新建了一个IsFull函数来判断棋盘是否全满,直接两个for循环一个判定。
最后根据Check函数反馈的不同值进行不同的操作。
这样我们的代码就写完了。我把整个代码的图放在最下面,这样看起来可能比较清楚。
那今天就到这里吧。