【三子棋】C语言版——妈咪级讲解

      最后更新:2022-01-23 23:41

      大家好,今天为大家带来三子棋C语言版讲解,这个游戏看着简单,但是对于我这种新手实现起来还是有一定难度的,废话少说,直接开冲。

      目录

      一、事先准备

      二、用户交互画面

      三、三子棋棋盘的初始化和打印

      四、玩家输入和电脑输入

      玩家移动

      电脑移动

      五、判断输赢和平局

      六、头文件和game函数

      一、事先准备

      我们要创建一个头文件和两个源文件

      头文件game.h放游戏相关函数的声明

      源文件test.c实现主函数,大致的框架

      源文件game.c实现游戏相关函数

      这样做的好处是将各复杂函数间模块化,也避免一个文件过于复杂,方便检查和相互调用。

      定义三子棋棋盘的行和列,使用#define定义 ROW和COL,这里我们先定义为3,后期我们改造这个游戏为五子棋什么的只有改动ROW和COL就可以实现了。

      二、用户交互画面

      用户交互画面主要实现菜单mean函数的打印,供用户选择开始游戏和退出游戏。会用到do……while循环和switch选择结构。

      交互画面还是比较简单的,在上一篇猜数字里就详细介绍到了,这里就不多说了。

      三、三子棋棋盘的初始化和打印

      我们要来接受用户传来的值首先就要创建一个数组,并对数组中每个值赋值为空格。

      这里我们创建一个char型的board数组行设为ROW,列设为COL。

      然后创建一个void函数inti_board(初始化数组,将每个值初始化为空格)

      这里我们将board数组作为函数参数传给inti_board,int_board用char board【ROW】【COL】接收数组,推荐使用数组的形式传参,使用指针的方式传二维数组还是比较容易出错的,不推荐。

      这样就对数组进行了初始化赋值,接下来我们就要来实现打印棋盘了,棋盘的样式如下:

      这样的棋盘看着就比较像三子棋的棋盘了,接下来我们对这个棋盘进行分析:

      表面上是三行,其实这个棋盘是打印三次,每次打印了两种内容的,由两种打印方式实现

      1是空格、数据、空格加上竖杠,2是三个减号加上竖杠,

      而且当列数为3时不打印最后那个竖杠,行数为最后一行时不打印减号和竖杠

      这里我们画图来分析一下:

      有了分析,我们就可以很轻松的用选择和循环语句来控制打印,代码如下:

      四、玩家输入和电脑输入

      玩家移动

      这时我们实现玩家移动player_move,设置一个x,y,用来接受用户输入的坐标,用*来表示用户的棋子同时我们要来进行判断两件事:

      1、用户输入的坐标是不是在行列范围之内

      2、用户输入的坐标原先是不是空格

      这时我们就要来设置一个循环,只有上面两个条件满足了才能将那个坐标的值改动,并且跳出循环。

      当然,我们还要考虑一件事,用户可能不知道数组是从零开始的,所以我们要将用户输入的坐标x,y进行减1,再放入到相对应的数组位子中去。代码实现如下:

      电脑移动

      我们将电脑落子定为#,首先我们来思考电脑应该如何下子,电脑应该如何产生坐标,这时我们就可以想到我们猜数字游戏中用过的rand函数来让电脑产生下棋的坐标(因为本人实力有限,不能设计算法来让电脑智能下棋)电脑下子的位子相比玩家下子就易控制一些,我们无需判断他是否会下出界,我们只用%3就可以让电脑产生的值一直再0-2之间,我们只用设置循环来让电脑产生的坐标原来是个空格就行了,然后让子落下,退出循环,再打印棋盘就行了。

      这时我们可以设置一点细节,使用Windows.h中的Sleep函数,设置休息时间为Sleep(300)单位为毫秒,也就是0.3秒,来让下棋显得不那么僵硬,函数具体实现如下:

      五、判断输赢和平局

      首先判断输赢我们可以先思考,怎样算赢,三子棋有8种情况判为赢,即行三连,列三连,还有对角线三连。

      那平局就很好想了,9个格子全不是空格。

      那这里我们先来给个设定,下一步判断一次下棋状况,如果判断有一方胜利,则返回赢的情况中的一个值,如果有平局,则返回一个Q,代表和棋,如果都不满足,则返回C,游戏继续。

      我们可以想到,只要返回的是C,游戏继续,如果不是C,那就有三种情况:玩家赢,电脑赢,和平局,这时我们来进行判断。如果有一方触动了胜利的条件,则直接将其中的一个值返回就行了,然后我们来判断是*还是#号。同样,如果触发了平局条件,我们判断是不是平局条件,如果是平局,我们输出平局。那我们要再来实现if_full函数,棋盘满的条件。

      和棋就是没有空格,那我们只用每次遍历一遍就行了,实现起来还是比较简单的。

      这样,输赢、和、继续就判断完了,我们只需要再来一个打印判断的结果的函数就行了

      实现如下:

      这样,三子棋全部的函数部分就实现完了,我们现在要做的就是将函数声明放到头文件中,这样文件间就有了关系,文件间就可以相互调用了。

      六、头文件和game函数

      接下来我们来看一下主函数部分,看一下game函数的主要部分:

      这样,三子棋游戏就实现了,总结一下,我们将游戏的函数部分、主函数放在不同的文件,这样有利于我们一步一步的调试,也便于我们分析程序,再将函数声明放在头文件中,这样巧妙的连接了两份源文件,并且减少了冗余。

      大家留个赞呗~~

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类