N子棋(三子棋)(C语言版)

      最后更新:2022-08-01 11:44

      没有踢球,只有一百个是钢做的。

      在这里插入图片描述

      目录

      1.三子棋简介

      2.设计思路

      3.代码实现

      3.1 初始化

      3.2 打印棋盘

      3.3 玩家下棋

      3.4 电脑下棋

      3.5 条件判定

      3.5.1变量定义

      3.5.2右对右方形测定

      3.5.3左至右线测定

      3.5.4行和列的确定

      4.组合

      5.源代码

      6.总结

      1.三子棋简介

      三式棋是一种黑白的棋。三个孩子棋是传统的民间游戏,它也被称作九宫棋、圆叉叉、龙棋和精写的棋。把方形连接到角上,兩條棋子分別放在兩側。把你的三个棋子放在一排,对方就算输了。但是,很多情况下, chess会发生这种情况。如图所示,常见的三牌棋

      知道三种棋的规则,现在让我们设计如何在C语言中实现它。我们采用软件工程模块化思维设计,当功能完成时,最后进行封装。所以我们把这个小程序菜单放在最后的设计中。该代码编程软件使用Vs2022。

      2.设计思路

      我们想要下棋,则必须要有棋盘,首先是打印板。我们在下棋的时候,我们需要一些东西来保持我们的好象水平。看到这个棋盘,我们首先想到的是二维阵列。当我们有了棋盘,当我们有一个存储数据的二维阵列时,接下来,它在你的电脑上和你自己玩棋。每次游戏结束时,我们还需要判断它是否构成赢得比赛的条件。如果哪边达成条件,则游戏结束,输出该方胜利。如果棋盘满了,没有奖牌,则输出平局。

      简而言之,我们需要在C语言中实现下列函数

      1.打印棋盘功能

      2.玩家下棋功能

      3.电脑下棋功能

      4.判定功能

      3.代码实现

      3.1 初始化

      首先,我们定义了存储我们的数据的二维阵列,并启动了二维阵列

      注意:这里的Row和Col分别是棋盘的行和列,这样定义方便将棋盘进行修改,是一个很妙的地方,实现N子棋

      初始化功能代码:

      两维阵列的初始化我们通过将两维阵列的每个网格嵌入一个空网格中进行循环的初始化。

      3.2 打印棋盘

      初始化后,我们正式开始印刷我们的板,首先,让我们看一下印刷板。

      先加载打印板功能代码:

      接下来我们对该代码进行逐步分析,如下图,两个嵌套for循环对二维数组进行遍历打印,注意打印格式为空空间,arr[i][j]。空间是让我们更好地观察的。

      下面的代码意味着每次您打印到每个行最后的列,您不需要打印“ | ”将行划分,这也是根据我们打印的纸板非常可理解的,在打印最后一行后,替换行。

      值得一提的是我们这个打印方式不限于三子棋棋盘的打印,可以实现n子棋棋盘的打印,这里又体现出两个define定义的行列Row,Col的好处了。

      3.3 玩家下棋

      接下来我们要做的是实现棋函数,或者同样,我们先把代码放在上面然后逐渐分析。

      玩家下棋功能代码:

      由于数组下标是从0开始,出于程序面向用户友好性考虑,用户输入的坐标是从1开始,所以在数组中我们需要把坐标 i 和 j 减去一个1。

      首先,我们将输出一个象棋信息,然后输入两个坐标,然后我们将使用if如果坐标是合法的(坐标是矩阵内),输入if在句子内继续执行,如果坐标不合法,则输出提示信息,请求重新输入。 当我们合法地输入坐标时if继续执行第二 sentenceif语句判定时,这个 if 语句的意思是如果该坐标为空格,代表当前坐标没有棋子,那就将*赋值给该坐标。(*表示玩家下棋的棋子)如果这个坐标不是空格,那就表示这个坐标已经有棋子被占用,那我们就输出提示信息,要求重新下棋。由于涉及到重复下棋,所以我们用while(1)周期,当坐标合法时,break然后调用打印棋盘函数打印我们正在玩的棋子。 如图所示:

      3.4 电脑下棋

      电脑棋类似于玩家棋, 我们先发布代码.

      电脑下棋功能代码:

      同样,我们首先将输出提示信息,即计算机棋。 然后坐标函数rand()在随机数模型上生成我们的矩阵坐标,而生成的数值是矩阵内。 坐标生成后,我们还需要确定坐标是否空,如果空,我们就#给坐标一个值,因为这是一个计算机的棋子游戏,如果坐标被占用,我们不需要输出提示,我们只需要继续生成随机数字,直到条件满足,因为这个棋子游戏也涉及重演棋子,所以我们仍然使用while(1)循环,在满足条件分配后分开,然后打印结果。 如图所示:

      这里rand()函数的使用我们需要在主函数设置一个随机数种子srand((unsigned int)time(NULL)),至于rand函数的具体使用方法本次文章就不多加叙述,读者自行搜索。

      3.5 条件判定

      结果条件决定我们是否首先设置代码,然后逐步分析它。但是值得一提的是,当我们定义矩阵不一致时,例如3行5列,5行4列等,在这个例子中,我们认为,构成连续的行和行中的棋片数目较少 wins.如3行5列中,当3颗棋子连续时,就获胜。5行4列中,当4颗棋子连续时,就获胜.确定函数的类型是字符类型,具有返回值,我们使用*返回表示玩家赢,用#返回表示电脑赢,用@返回表示平局。

      条件判定代码:

      然后我们将逐步进行分析。

      3.5.1变量定义

      这里所记录的数目比行和列中的数目小,因此更容易确定其背后的条件。

      3.5.2右对右方形测定

      在这一轮中,我们确定了板的右向右角是连续的,如图所示我们将把col-1的值分配给j,这里我们使用i来表示行, j来表示列。当同时满足条件i<Row和j>=0时,进入循环。我们用sum1和sum2分别统计玩家的棋子数和电脑的棋子数。并在后面跟着if语句判定,当玩家棋子数达到规定赢棋数目时,return返回*当计算机棋子数目达到获胜棋子数目时,返回#如果未实现,则继续i++,j--,直到返回返回条件满足或 while loop条件未满足时,则循环跳出。

      3.5.3左至右线测定

      如图所示,我们确定了这个圈的左到左角.这与右对右角度的判断类似,这次我们使用循环,以及总数1和总数2来记录玩家和计算机的棋数,然后如果句子判断,当棋数达到获胜的棋数时,返回相应的玩家的棋数,或者继续循环直至跳出循环。

      3.5.4行和列的确定

      这次判定中,第一个if这个句子用来确定板上是否还有空格,并且当板上仍有空格时,旗子设置为1。第六个if语句相对应,当flag等于0时,也就是说棋盘中不存在空格,并且前面的判定条件都不满足时,返回 @表示平局。第二个if和第三个if语句表示对每一行进行判定,用sum1统计玩家棋子数,用sum2统计电脑棋子数,当达到规定赢棋数目时,返回对应符号。第四个if和第五个if每一列的评判都是用3个数值来计算玩家的数目,4个数值来计算计算机的数目,并在达到相应的玩家数目时返回相应的符号。

      4.组合

      当所有功能模块都完成好,我们就只需要进行最后的组合。首先就是打印菜单,我们用menu函数打印出我们的菜单。

      menu函数:

      当菜单打印好之后,我们在主函数中称菜单函数,然后输出相应的文本提示信息,允许用户选择输入并给变量i分配值,然后用开关声明做选择,因为用户可能输入错误或想继续玩游戏需要重复输入,因此,请在这里使用while(i)循环,只有当用户想退出程序输入0时,i = 0,循环结束,程序退出。

      还有我们在游戏中玩的游戏功能,在启动和打印板后,就开始下棋了,象棋是重复循环的过程,这里我们使用时间循环,只有当结果出来时,才会跳出循环。这里我们使用ch来获取确定函数的返回值,当返回值为*这意味着玩家获胜,并输出相应的信息以结束游戏。 当返回值为#计算机赢了并输出相应的信息以结束游戏。 当返回值是@游戏以相应的信息输出结束。 当返回值为‘1’继续没有结果的打棋。

      这里我们还对程序进行了小优化,我们定义了i,j,val变量,i统计数字是玩家的数量,j统计数字是计算机的数量,val统计数字是规则的数量,现在规则的数量还没有达到规则的数量,所以不需要作出判断,节省时间来作出判断。

      5.源代码

      本次编程分为3个文件,head.h,test.c,chess.c。head.h用于存放头文件和函数声明,test.c用于放主函数进行测试,chess.c用于放功能模块代码,以下是3个文件源代码。

      head.h

      test.c

      chess.c

      这个代码也被上传到Gitee上,你可以自己下载到Gitee上

      test_7_28 三子棋 · 牛爷爷爱写代码/学习垃圾 - 码云 - 开源中国 (gitee.com)

      6.总结

      这个代码在某些地方缺失,还有许多改进的余地。为了时间,先写这个。后期再加以修改,努力为读者提供更好的和更易理解的代码,本文介绍了我个人的感受,还有许多地方我还没有充分表达我所想说的。因为作者本人不太擅长表达自己,因此文章如果有词不达意的地方还希望读者多多包含,你可以在评论区提出问题,你可以给作者一些建议或建议。作者本人也会仔细研究读者的建议和建议,努力改进,为您提供更多的优秀和有价值的文章。如果代码有任何缺陷,我希望你能在评论部分指出它们。欢迎来讨论评价。

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

          热门文章

          文章分类